diff options
-rw-r--r-- | src/bindings/scripts/scripts/zone/eastern_plaguelands/the_scarlet_enclave.cpp | 131 | ||||
-rw-r--r-- | src/game/UnitAI.h | 3 |
2 files changed, 59 insertions, 75 deletions
diff --git a/src/bindings/scripts/scripts/zone/eastern_plaguelands/the_scarlet_enclave.cpp b/src/bindings/scripts/scripts/zone/eastern_plaguelands/the_scarlet_enclave.cpp index c54b048f561..4eef9a5d5c8 100644 --- a/src/bindings/scripts/scripts/zone/eastern_plaguelands/the_scarlet_enclave.cpp +++ b/src/bindings/scripts/scripts/zone/eastern_plaguelands/the_scarlet_enclave.cpp @@ -537,13 +537,13 @@ uint32 acherus_unworthy_initiate[5] = 29567 }; -enum initiate_phase +enum UnworthyInitiatePhase { - Chained, - ToEquipping, - Equipping, - ToAttacking, - Attacking + PHASE_CHAINED, + PHASE_TO_EQUIP, + PHASE_EQUIPING, + PHASE_TO_ATTACK, + PHASE_ATTACKING, }; struct TRINITY_DLL_DECL npc_unworthy_initiateAI : public ScriptedAI @@ -559,7 +559,7 @@ struct TRINITY_DLL_DECL npc_unworthy_initiateAI : public ScriptedAI bool event_startet; uint64 event_starter; - initiate_phase phase; + UnworthyInitiatePhase phase; uint32 wait_timer; float targ_x,targ_y,targ_z; uint64 anchorGUID; @@ -569,7 +569,7 @@ struct TRINITY_DLL_DECL npc_unworthy_initiateAI : public ScriptedAI void Reset() { anchorGUID = 0; - phase = Chained; + phase = PHASE_CHAINED; events.Reset(); m_creature->setFaction(7); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2); @@ -606,14 +606,14 @@ struct TRINITY_DLL_DECL npc_unworthy_initiateAI : public ScriptedAI if(Unit* starter = Unit::GetUnit((*m_creature),event_starter)) DoScriptText(say_event_attack[rand()%9],m_creature,starter); - phase = ToAttacking; + phase = PHASE_TO_ATTACK; } } void EventStart(Creature* anchor, Player* target) { wait_timer = 5000; - phase = ToEquipping; + phase = PHASE_TO_EQUIP; m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); m_creature->RemoveAurasDueToSpell(SPELL_SOUL_PRISON_CHAIN_SELF); @@ -634,34 +634,26 @@ CreatureAI* GetAI_npc_unworthy_initiate(Creature *_Creature) return new npc_unworthy_initiateAI(_Creature); } -struct TRINITY_DLL_DECL npc_unworthy_initiate_anchorAI : public ScriptedAI +struct TRINITY_DLL_DECL npc_unworthy_initiate_anchorAI : public PassiveAI { - npc_unworthy_initiate_anchorAI(Creature *c) : ScriptedAI(c) { guid_target = 0; } + npc_unworthy_initiate_anchorAI(Creature *c) : PassiveAI(c), prisonerGUID(0) {} - uint64 guid_target; + uint64 prisonerGUID; - void Reset(){} - - void SetTarget(uint64 target); - uint64 GetTarget() + void SetGUID(const uint64 &guid, int32 id) { - return guid_target; + if(!prisonerGUID) + prisonerGUID = guid; } - void UpdateAI(const uint32 diff){} + uint64 GetGUID(int32 id) { return prisonerGUID; } }; -void npc_unworthy_initiate_anchorAI::SetTarget(uint64 target) -{ - if(guid_target <= 0) - guid_target = target; -} - void npc_unworthy_initiateAI::UpdateAI(const uint32 diff) { switch(phase) { - case Chained: + case PHASE_CHAINED: if(!anchorGUID) { float x, y, z; @@ -687,31 +679,31 @@ void npc_unworthy_initiateAI::UpdateAI(const uint32 diff) if(Creature* trigger = me->FindNearestCreature(29521, 30)) { prison->ResetDoorOrButton(); - CAST_AI(npc_unworthy_initiate_anchorAI, trigger->AI())->SetTarget(m_creature->GetGUID()); + trigger->AI()->SetGUID(m_creature->GetGUID()); trigger->CastSpell(me, SPELL_SOUL_PRISON_CHAIN, true); anchorGUID = trigger->GetGUID(); } } return; - case ToEquipping: + case PHASE_TO_EQUIP: if(wait_timer) { if(wait_timer < diff) { m_creature->GetMotionMaster()->MovePoint(1,targ_x,targ_y,m_creature->GetPositionZ()); - phase = Equipping; + phase = PHASE_EQUIPING; wait_timer = 0; }else wait_timer -= diff; } return; - case ToAttacking: + case PHASE_TO_ATTACK: if(wait_timer) { if(wait_timer < diff) { m_creature->setFaction(14); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2); - phase = Attacking; + phase = PHASE_ATTACKING; if(Unit* target = Unit::GetUnit((*m_creature),event_starter)) m_creature->AI()->AttackStart(target); @@ -719,40 +711,40 @@ void npc_unworthy_initiateAI::UpdateAI(const uint32 diff) }else wait_timer -= diff; } return; - case Attacking: - if(!UpdateVictim()) - return; + case PHASE_ATTACKING: + if(!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - while(uint32 eventId = events.ExecuteEvent()) + while(uint32 eventId = events.ExecuteEvent()) + { + switch(eventId) { - switch(eventId) - { - case EVENT_ICY_TOUCH: - DoCast(m_creature->getVictim(), SPELL_ICY_TOUCH); - events.DelayEvents(1000, GCD_CAST); - events.ScheduleEvent(EVENT_ICY_TOUCH, 5000, GCD_CAST); - break; - case EVENT_PLAGUE_STRIKE: - DoCast(m_creature->getVictim(), SPELL_PLAGUE_STRIKE); - events.DelayEvents(1000, GCD_CAST); - events.ScheduleEvent(SPELL_PLAGUE_STRIKE, 5000, GCD_CAST); - break; - case EVENT_BLOOD_STRIKE: - DoCast(m_creature->getVictim(), SPELL_BLOOD_STRIKE); - events.DelayEvents(1000, GCD_CAST); - events.ScheduleEvent(EVENT_BLOOD_STRIKE, 5000, GCD_CAST); - break; - case EVENT_DEATH_COIL: - DoCast(m_creature->getVictim(), SPELL_DEATH_COIL); - events.DelayEvents(1000, GCD_CAST); - events.ScheduleEvent(EVENT_DEATH_COIL, 5000, GCD_CAST); - break; - } + case EVENT_ICY_TOUCH: + DoCast(m_creature->getVictim(), SPELL_ICY_TOUCH); + events.DelayEvents(1000, GCD_CAST); + events.ScheduleEvent(EVENT_ICY_TOUCH, 5000, GCD_CAST); + break; + case EVENT_PLAGUE_STRIKE: + DoCast(m_creature->getVictim(), SPELL_PLAGUE_STRIKE); + events.DelayEvents(1000, GCD_CAST); + events.ScheduleEvent(SPELL_PLAGUE_STRIKE, 5000, GCD_CAST); + break; + case EVENT_BLOOD_STRIKE: + DoCast(m_creature->getVictim(), SPELL_BLOOD_STRIKE); + events.DelayEvents(1000, GCD_CAST); + events.ScheduleEvent(EVENT_BLOOD_STRIKE, 5000, GCD_CAST); + break; + case EVENT_DEATH_COIL: + DoCast(m_creature->getVictim(), SPELL_DEATH_COIL); + events.DelayEvents(1000, GCD_CAST); + events.ScheduleEvent(EVENT_DEATH_COIL, 5000, GCD_CAST); + break; } + } - DoMeleeAttackIfReady(); + DoMeleeAttackIfReady(); return; } } @@ -762,21 +754,12 @@ CreatureAI* GetAI_npc_unworthy_initiate_anchor(Creature *_Creature) return new npc_unworthy_initiate_anchorAI(_Creature); } -bool GOHello_go_acherus_soul_prison(Player *player, GameObject* _GO) +bool GOHello_go_acherus_soul_prison(Player *player, GameObject* go) { - Creature* finder = player->SummonCreature(WORLD_TRIGGER,_GO->GetPositionX(),_GO->GetPositionY(),_GO->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,2000); - if(!finder) return false; - - Unit* prison_anchor = finder->FindNearestCreature(29521, 15); - if(!prison_anchor) return false; - - uint64 owner = CAST_AI(npc_unworthy_initiate_anchorAI, CAST_CRE(prison_anchor)->AI())->GetTarget(); - - Creature* prisoner = Creature::GetCreature((*player),owner); - if(prisoner) - { - CAST_AI(npc_unworthy_initiateAI, (prisoner->AI()))->EventStart(CAST_CRE(prison_anchor),player); - } + if(Creature *anchor = go->FindNearestCreature(29521, 15)) + if(uint64 prisonerGUID = anchor->AI()->GetGUID()) + if(Creature* prisoner = Creature::GetCreature(*player, prisonerGUID)) + CAST_AI(npc_unworthy_initiateAI, (prisoner->AI()))->EventStart(anchor, player); return false; } diff --git a/src/game/UnitAI.h b/src/game/UnitAI.h index 3e6ce4f4a6f..784a453e970 100644 --- a/src/game/UnitAI.h +++ b/src/game/UnitAI.h @@ -57,7 +57,8 @@ class TRINITY_DLL_SPEC UnitAI // Pass parameters between AI virtual void DoAction(const int32 param = 0) {} - virtual void SetGUID(const uint64 &guid, const int32 param = 0) {} + virtual void SetGUID(const uint64 &guid, int32 id = 0) {} + virtual uint64 GetGUID(int32 id = 0) { return 0; } Unit* SelectTarget(SelectAggroTarget target, uint32 position = 0, float dist = 0, bool playerOnly = false, int32 aura = 0); void SelectTargetList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget target, float dist = 0, bool playerOnly = false, int32 aura = 0); |