diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/creature/mob_event_ai.cpp | 86 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/creature/mob_event_ai.h | 79 |
2 files changed, 115 insertions, 50 deletions
diff --git a/src/bindings/scripts/scripts/creature/mob_event_ai.cpp b/src/bindings/scripts/scripts/creature/mob_event_ai.cpp index 89151cd494b..d6396dfae99 100644 --- a/src/bindings/scripts/scripts/creature/mob_event_ai.cpp +++ b/src/bindings/scripts/scripts/creature/mob_event_ai.cpp @@ -23,6 +23,7 @@ EndScriptData */ #include "precompiled.h" #include "mob_event_ai.h" +#include "ObjectMgr.h" #define EVENT_UPDATE_TIME 500 #define SPELL_RUN_AWAY 8225 @@ -454,6 +455,10 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI } } break; + case EVENT_T_REACHED_HOME: + { + } + break; default: if (EAI_ErrorLevel > 0) error_db_log("SD2: Creature %u using Event %u has invalid Event Type(%u), missing from ProcessEvent() Switch.", m_creature->GetEntry(), pHolder.Event.event_id, pHolder.Event.event_type); @@ -577,6 +582,43 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI } } break; + case ACTION_T_SET_FACTION: + { + if (param1) + m_creature->setFaction(param1); + else + { + if (CreatureInfo const* ci = GetCreatureTemplateStore(m_creature->GetEntry())) + { + //if no id provided, assume reset and then use default + if (m_creature->getFaction() != ci->faction_A) + m_creature->setFaction(ci->faction_A); + } + } + } + break; + case ACTION_T_MORPH_TO_ENTRY_OR_MODEL: + { + if (param1 || param2) + { + //set model based on entry from creature_template + if (param1) + { + if (CreatureInfo const* ci = GetCreatureTemplateStore(param1)) + { + //use default display + if (ci->DisplayID_A) + m_creature->SetDisplayId(ci->DisplayID_A); + } + } + //if no param1, then use value from param2 (modelId) + else + m_creature->SetDisplayId(param2); + } + else + m_creature->DeMorph(); + } + break; case ACTION_T_SOUND: DoPlaySoundToSet(m_creature, param1); break; @@ -720,6 +762,9 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI { Unit* target = GetTargetByType(param3, pActionInvoker); + if (param1 < OBJECT_END || param1 >= UNIT_END) + return; + if (target) target->SetUInt32Value(param1, param2); } @@ -1004,7 +1049,7 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI EventUpdateTime = EVENT_UPDATE_TIME; EventDiff = 0; - //Handle Evade events and reset all events to enabled + //Reset all events to enabled for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i) { switch ((*i).Event.event_type) @@ -1033,6 +1078,20 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI } } + //when creature reach home after EnterEvadeMode + void JustReachedHome() + { + m_creature->LoadCreaturesAddon(); + + for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i) + { + if ((*i).Event.event_type == EVENT_T_REACHED_HOME) + ProcessEvent(*i); + } + + Reset(); + } + void EnterEvadeMode() { ScriptedAI::EnterEvadeMode(); @@ -1042,13 +1101,8 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI //Handle Evade events for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i) { - switch ((*i).Event.event_type) - { - //Evade - case EVENT_T_EVADE: - ProcessEvent(*i); - break; - } + if ((*i).Event.event_type == EVENT_T_EVADE) + ProcessEvent(*i); } } @@ -1290,9 +1344,9 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI else (*i).Time = 0; } + //Events that are updated every EVENT_UPDATE_TIME switch ((*i).Event.event_type) { - //Events that are updated every EVENT_UPDATE_TIME case EVENT_T_TIMER_OOC: ProcessEvent(*i); break; @@ -1302,9 +1356,19 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI case EVENT_T_TARGET_HP: case EVENT_T_TARGET_CASTING: case EVENT_T_FRIENDLY_HP: - if( Combat ) + if (Combat) ProcessEvent(*i); break; + case EVENT_T_RANGE: + if (Combat) + { + if (m_creature->IsWithinDistInMap(m_creature->getVictim(),(float)(*i).Event.event_param2)) + { + if (m_creature->GetDistance(m_creature->getVictim()) >= (float)(*i).Event.event_param1) + ProcessEvent(*i); + } + } + break; } } @@ -1391,7 +1455,7 @@ void AddSC_mob_event() { Script *newscript; newscript = new Script; - newscript->Name="mob_eventai"; + newscript->Name = "mob_eventai"; newscript->GetAI = &GetAI_Mob_EventAI; newscript->RegisterSelf(); } diff --git a/src/bindings/scripts/scripts/creature/mob_event_ai.h b/src/bindings/scripts/scripts/creature/mob_event_ai.h index fafd21b3543..39bf050cd70 100644 --- a/src/bindings/scripts/scripts/creature/mob_event_ai.h +++ b/src/bindings/scripts/scripts/creature/mob_event_ai.h @@ -30,51 +30,52 @@ enum Event_Types EVENT_T_TARGET_MANA = 18, //ManaMax%, ManaMin%, RepeatMin, RepeatMax EVENT_T_QUEST_ACCEPT = 19, //QuestID EVENT_T_QUEST_COMPLETE = 20, // + EVENT_T_REACHED_HOME = 21, //NONE EVENT_T_END, }; enum Action_Types { - ACTION_T_NONE = 0, //No action - ACTION_T_TEXT = 1, //-TextId1, optionally -TextId2, optionally -TextId3(if -TextId2 exist). If more than just -TextId1 is defined, randomize. Negative values. - ACTION_T_YELL = 2, //UNUSED - ACTION_T_TEXTEMOTE = 3, //UNUSED - ACTION_T_SOUND = 4, //SoundId - ACTION_T_EMOTE = 5, //EmoteId - ACTION_T_RANDOM_SAY = 6, //UNUSED - ACTION_T_RANDOM_YELL = 7, //UNUSED - ACTION_T_RANDOM_TEXTEMOTE = 8, //UNUSED - ACTION_T_RANDOM_SOUND = 9, //SoundId1, SoundId2, SoundId3 (-1 in any field means no output if randomed that field) - ACTION_T_RANDOM_EMOTE = 10, //EmoteId1, EmoteId2, EmoteId3 (-1 in any field means no output if randomed that field) - ACTION_T_CAST = 11, //SpellId, Target, CastFlags - ACTION_T_SUMMON = 12, //CreatureID, Target, Duration in ms - ACTION_T_THREAT_SINGLE_PCT = 13, //Threat%, Target - ACTION_T_THREAT_ALL_PCT = 14, //Threat% - ACTION_T_QUEST_EVENT = 15, //QuestID, Target - ACTION_T_CASTCREATUREGO = 16, //QuestID, SpellId, Target - ACTION_T_SET_UNIT_FIELD = 17, //Field_Number, Value, Target - ACTION_T_SET_UNIT_FLAG = 18, //Flags (may be more than one field OR'd together), Target - ACTION_T_REMOVE_UNIT_FLAG = 19, //Flags (may be more than one field OR'd together), Target - ACTION_T_AUTO_ATTACK = 20, //AllowAttackState (0 = stop attack, anything else means continue attacking) - ACTION_T_COMBAT_MOVEMENT = 21, //AllowCombatMovement (0 = stop combat based movement, anything else continue attacking) - ACTION_T_SET_PHASE = 22, //Phase - ACTION_T_INC_PHASE = 23, //Value (may be negative to decrement phase, should not be 0) - ACTION_T_EVADE = 24, //No Params - ACTION_T_FLEE = 25, //No Params - ACTION_T_QUEST_EVENT_ALL = 26, //QuestID - ACTION_T_CASTCREATUREGO_ALL = 27, //QuestId, SpellId - ACTION_T_REMOVEAURASFROMSPELL = 28, //Target, Spellid - ACTION_T_RANGED_MOVEMENT = 29, //Distance, Angle - ACTION_T_RANDOM_PHASE = 30, //PhaseId1, PhaseId2, PhaseId3 - ACTION_T_RANDOM_PHASE_RANGE = 31, //PhaseMin, PhaseMax - ACTION_T_SUMMON_ID = 32, //CreatureId, Target, SpawnId - ACTION_T_KILLED_MONSTER = 33, //CreatureId, Target - ACTION_T_SET_INST_DATA = 34, //Field, Data - ACTION_T_SET_INST_DATA64 = 35, //Field, Target - ACTION_T_UPDATE_TEMPLATE = 36, //Entry, Team - ACTION_T_DIE = 37, //No Params - ACTION_T_ZONE_COMBAT_PULSE = 38, //No Params + ACTION_T_NONE = 0, //No action + ACTION_T_TEXT = 1, //-TextId1, optionally -TextId2, optionally -TextId3(if -TextId2 exist). If more than just -TextId1 is defined, randomize. Negative values. + ACTION_T_SET_FACTION = 2, //FactionId (or 0 for default) + ACTION_T_MORPH_TO_ENTRY_OR_MODEL = 3, //Creature_template entry(param1) OR ModelId (param2) (or 0 for both to demorph) + ACTION_T_SOUND = 4, //SoundId + ACTION_T_EMOTE = 5, //EmoteId + ACTION_T_RANDOM_SAY = 6, //UNUSED + ACTION_T_RANDOM_YELL = 7, //UNUSED + ACTION_T_RANDOM_TEXTEMOTE = 8, //UNUSED + ACTION_T_RANDOM_SOUND = 9, //SoundId1, SoundId2, SoundId3 (-1 in any field means no output if randomed that field) + ACTION_T_RANDOM_EMOTE = 10, //EmoteId1, EmoteId2, EmoteId3 (-1 in any field means no output if randomed that field) + ACTION_T_CAST = 11, //SpellId, Target, CastFlags + ACTION_T_SUMMON = 12, //CreatureID, Target, Duration in ms + ACTION_T_THREAT_SINGLE_PCT = 13, //Threat%, Target + ACTION_T_THREAT_ALL_PCT = 14, //Threat% + ACTION_T_QUEST_EVENT = 15, //QuestID, Target + ACTION_T_CASTCREATUREGO = 16, //QuestID, SpellId, Target + ACTION_T_SET_UNIT_FIELD = 17, //Field_Number, Value, Target + ACTION_T_SET_UNIT_FLAG = 18, //Flags (may be more than one field OR'd together), Target + ACTION_T_REMOVE_UNIT_FLAG = 19, //Flags (may be more than one field OR'd together), Target + ACTION_T_AUTO_ATTACK = 20, //AllowAttackState (0 = stop attack, anything else means continue attacking) + ACTION_T_COMBAT_MOVEMENT = 21, //AllowCombatMovement (0 = stop combat based movement, anything else continue attacking) + ACTION_T_SET_PHASE = 22, //Phase + ACTION_T_INC_PHASE = 23, //Value (may be negative to decrement phase, should not be 0) + ACTION_T_EVADE = 24, //No Params + ACTION_T_FLEE = 25, //No Params + ACTION_T_QUEST_EVENT_ALL = 26, //QuestID + ACTION_T_CASTCREATUREGO_ALL = 27, //QuestId, SpellId + ACTION_T_REMOVEAURASFROMSPELL = 28, //Target, Spellid + ACTION_T_RANGED_MOVEMENT = 29, //Distance, Angle + ACTION_T_RANDOM_PHASE = 30, //PhaseId1, PhaseId2, PhaseId3 + ACTION_T_RANDOM_PHASE_RANGE = 31, //PhaseMin, PhaseMax + ACTION_T_SUMMON_ID = 32, //CreatureId, Target, SpawnId + ACTION_T_KILLED_MONSTER = 33, //CreatureId, Target + ACTION_T_SET_INST_DATA = 34, //Field, Data + ACTION_T_SET_INST_DATA64 = 35, //Field, Target + ACTION_T_UPDATE_TEMPLATE = 36, //Entry, Team + ACTION_T_DIE = 37, //No Params + ACTION_T_ZONE_COMBAT_PULSE = 38, //No Params ACTION_T_SET_ACTIVE = 101, //Apply ACTION_T_SET_AGGRESSIVE = 102, //Apply |