Форум программистов, компьютерный форум CyberForum.ru

Скрипт боса - C++

Восстановить пароль Регистрация
 
Jettard
 Аватар для Jettard
40 / 38 / 5
Регистрация: 27.05.2010
Сообщений: 253
28.04.2011, 00:17     Скрипт боса #1
Всем привет. Значит хочу сделать свой сервер мангос, для друзей. Преимущественно серверы мангоса сырые и недоделанные. Хочу чтобы вы мне помогли лутше разобраться с кодом одного босса, вот скрипт:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
#include "precompiled.h"
#include "gruuls_lair.h"
 
enum
{
    SAY_AGGRO                   = -1565010,
    SAY_SLAM1                   = -1565011,
    SAY_SLAM2                   = -1565012,
    SAY_SHATTER1                = -1565013,
    SAY_SHATTER2                = -1565014,
    SAY_SLAY1                   = -1565015,
    SAY_SLAY2                   = -1565016,
    SAY_SLAY3                   = -1565017,
    SAY_DEATH                   = -1565018,
 
    EMOTE_GROW                  = -1565019,
 
    SPELL_GROWTH                = 36300,
    SPELL_CAVE_IN               = 36240,
    SPELL_GROUND_SLAM           = 33525,                    //AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback)
    SPELL_REVERBERATION         = 36297,
    SPELL_SHATTER               = 33654,
 
    SPELL_SHATTER_EFFECT        = 33671,
    SPELL_HURTFUL_STRIKE        = 33813,
    SPELL_STONED                = 33652,                    //Spell is self cast by target
 
    SPELL_MAGNETIC_PULL         = 28337,
    SPELL_KNOCK_BACK            = 24199                     //Knockback spell until correct implementation is made
};
 
struct MANGOS_DLL_DECL boss_gruulAI : public ScriptedAI
{
    boss_gruulAI(Creature* pCreature) : ScriptedAI(pCreature)
    {
        m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
        Reset();
    }
 
    ScriptedInstance* m_pInstance;
 
    uint32 m_uiGrowth_Timer;
    uint32 m_uiCaveIn_Timer;
    uint32 m_uiCaveIn_StaticTimer;
    uint32 m_uiGroundSlamTimer;
    uint32 m_uiHurtfulStrike_Timer;
    uint32 m_uiReverberation_Timer;
 
    bool m_bPerformingGroundSlam;
 
    void Reset()
    {
        m_uiGrowth_Timer            = 30000;
        m_uiCaveIn_Timer            = 27000;
        m_uiCaveIn_StaticTimer      = 30000;
        m_uiGroundSlamTimer         = 35000;
        m_uiHurtfulStrike_Timer     = 8000;
        m_uiReverberation_Timer     = 60000+45000;
        m_bPerformingGroundSlam     = false;
    }
 
    void Aggro(Unit *pWho)
    {
        DoScriptText(SAY_AGGRO, m_creature);
 
        if (!m_pInstance)
            return;
 
        m_pInstance->SetData(TYPE_GRUUL_EVENT, IN_PROGRESS);
    }
 
    void JustReachedHome()
    {
        if (m_pInstance)
            m_pInstance->SetData(TYPE_GRUUL_EVENT, NOT_STARTED);
    }
 
    void KilledUnit(Unit* pVictim)
    {
        switch(urand(0, 2))
        {
            case 0: DoScriptText(SAY_SLAY1, m_creature); break;
            case 1: DoScriptText(SAY_SLAY2, m_creature); break;
            case 2: DoScriptText(SAY_SLAY3, m_creature); break;
        }
    }
 
    void JustDied(Unit* pKiller)
    {
        DoScriptText(SAY_DEATH, m_creature);
 
        if (!m_pInstance)
            return;
 
        m_pInstance->SetData(TYPE_GRUUL_EVENT, DONE);
    }
 
    void SpellHitTarget(Unit* pTarget, const SpellEntry* pSpell)
    {
        //This to emulate effect1 (77) of SPELL_GROUND_SLAM, knock back to any direction
        //It's initially wrong, since this will cause fall damage, which is by comments, not intended.
        if (pSpell->Id == SPELL_GROUND_SLAM)
        {
            if (pTarget->GetTypeId() == TYPEID_PLAYER)
            {
                switch(urand(0, 1))
                {
                    case 0: pTarget->CastSpell(pTarget, SPELL_MAGNETIC_PULL, true, NULL, NULL, m_creature->GetGUID()); break;
                    case 1: pTarget->CastSpell(pTarget, SPELL_KNOCK_BACK, true, NULL, NULL, m_creature->GetGUID()); break;
                }
            }
        }
 
        //this part should be in mangos
        if (pSpell->Id == SPELL_SHATTER)
        {
            //this spell must have custom handling in mangos, dealing damage based on distance
            pTarget->CastSpell(pTarget, SPELL_SHATTER_EFFECT, true);
 
            if (pTarget->HasAura(SPELL_STONED))
                pTarget->RemoveAurasDueToSpell(SPELL_STONED);
 
            //clear this, if we are still performing
            if (m_bPerformingGroundSlam)
            {
                m_bPerformingGroundSlam = false;
 
                //and correct movement, if not already
                if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
                {
                    if (m_creature->getVictim())
                        m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                }
            }
        }
    }
 
    void UpdateAI(const uint32 uiDiff)
    {
        //Return since we have no target
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;
 
        // Growth
        // Gruul can cast this spell up to 30 times
        if (m_uiGrowth_Timer < uiDiff)
        {
            DoScriptText(EMOTE_GROW, m_creature);
            DoCastSpellIfCan(m_creature,SPELL_GROWTH);
            m_uiGrowth_Timer = 30000;
        }
        else
            m_uiGrowth_Timer -= uiDiff;
 
        if (m_bPerformingGroundSlam)
        {
            if (m_uiGroundSlamTimer < uiDiff)
            {
                m_uiGroundSlamTimer     = 120000;
                m_uiHurtfulStrike_Timer = 8000;
 
                //Give a little time to the players to undo the damage from shatter
                if (m_uiReverberation_Timer < 10000)
                    m_uiReverberation_Timer += 10000;
 
                DoCastSpellIfCan(m_creature, SPELL_SHATTER);
            }
            else
                m_uiGroundSlamTimer -= uiDiff;
        }
        else
        {
            // Hurtful Strike
            if (m_uiHurtfulStrike_Timer < uiDiff)
            {
                // Find 2nd-aggro target within melee range.
                Unit* pTarget = NULL;
                ThreatList const& tList = m_creature->getThreatManager().getThreatList();
                ThreatList::const_iterator itr = tList.begin();
                std::advance(itr, 1);
                for (;itr != tList.end(); ++itr)
                {
                    pTarget = m_creature->GetMap()->GetUnit((*itr)->getUnitGuid());
 
                    // exclude pets, totems & player out of melee range
                    if (!pTarget || pTarget->GetTypeId() != TYPEID_PLAYER || !m_creature->CanReachWithMeleeAttack(pTarget))
                    {
                        pTarget = NULL;
                        continue;
                    }
                    //we've found someone
                    break;
                }
 
                if (pTarget)
                    DoCastSpellIfCan(pTarget,SPELL_HURTFUL_STRIKE);
                else
                    DoCastSpellIfCan(m_creature->getVictim(),SPELL_HURTFUL_STRIKE);
 
                m_uiHurtfulStrike_Timer = 8000;
            }
            else
                m_uiHurtfulStrike_Timer -= uiDiff;
 
            // Reverberation
            if (m_uiReverberation_Timer < uiDiff)
            {
                DoCastSpellIfCan(m_creature, SPELL_REVERBERATION, CAST_TRIGGERED);
                m_uiReverberation_Timer = urand(15000, 25000);
            }
            else
                m_uiReverberation_Timer -= uiDiff;
 
            // Cave In
            if (m_uiCaveIn_Timer < uiDiff)
            {
                if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0))
                    DoCastSpellIfCan(pTarget,SPELL_CAVE_IN);
 
                if (m_uiCaveIn_StaticTimer >= 4000)
                    m_uiCaveIn_StaticTimer -= 2000;
 
                    m_uiCaveIn_Timer = m_uiCaveIn_StaticTimer;
 
            }
            else
                m_uiCaveIn_Timer -= uiDiff;
 
            // Ground Slam, Gronn Lord's Grasp, Stoned, Shatter
            if (m_uiGroundSlamTimer < uiDiff)
            {
                m_creature->GetMotionMaster()->Clear();
                m_creature->GetMotionMaster()->MoveIdle();
 
                m_bPerformingGroundSlam = true;
                m_uiGroundSlamTimer     = 10000;
 
                DoCastSpellIfCan(m_creature, SPELL_GROUND_SLAM);
            }
            else
                m_uiGroundSlamTimer -= uiDiff;
 
            DoMeleeAttackIfReady();
        }
    }
};
 
CreatureAI* GetAI_boss_gruul(Creature* pCreature)
{
    return new boss_gruulAI(pCreature);
}
 
void AddSC_boss_gruul()
{
    Script *newscript;
    newscript = new Script;
    newscript->Name = "boss_gruul";
    newscript->GetAI = &GetAI_boss_gruul;
    newscript->RegisterSelf();
}
взял отсюда
https://scriptdev2.svn.sourceforge.n...nd/gruuls_lair
Помогите только с коментами, что есть что...
Хорошо бы, если обьяснили действия войдов
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2011, 00:17     Скрипт боса
Посмотрите здесь:

Скрипт для автоматизации забивания инфы C++
C++ Скрипт открытия интернет ссылки
Скрипт на С++ (AngelScripts) C++
C++ нужен скрипт
Создать скрипт C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SaweR
 Аватар для SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
21.01.2014, 15:44     Скрипт боса #2
void Reset() – откат всех способностей босса
void Aggro(Unit *pWho) – начало боя, босс ловит таргет и что-то говорит
void KilledUnit(Unit* pVictim) – заставляет боса сказать одну из 3х фраз после убийства юнита
void SpellHitTarget() – каст спела по таргету
void AddSC_boss_gruul() – инициализация босса
Denno
50 / 50 / 6
Регистрация: 21.10.2012
Сообщений: 185
Завершенные тесты: 3
24.06.2014, 15:50     Скрипт боса #3

Не по теме:

Почти три года, ждал ответа, терпеливый однако



Добавлено через 32 минуты
Цитата Сообщение от Jettard Посмотреть сообщение
серверы мангоса сырые и недоделанные
Потому что в отличии от тринитикора, мангос не плодит(теперь и ничего не плодит, потому что потух проект) хаки и костыли в проекте. Контингент у проектов совсем разный. Ведь есть разница у взрослого опытного человека и амбициозного студента недоучки.
Supernatural
24.06.2014, 15:54
  #4

Не по теме:

SaweR, красавчик

Jettard
 Аватар для Jettard
40 / 38 / 5
Регистрация: 27.05.2010
Сообщений: 253
25.06.2014, 19:33  [ТС]     Скрипт боса #5
Denno, Supernatural, да не ждал конечно. Инфу нашел сам, искал долго но нашел, а сейчас увидел, есть ответ, вот и поблагодарил, все-таки человек ответил, причем верно.
Yandex
Объявления
25.06.2014, 19:33     Скрипт боса
Ответ Создать тему
Опции темы

Текущее время: 06:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru