diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp | 127 |
1 files changed, 66 insertions, 61 deletions
diff --git a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp index d87c25c14a7..2aae2d51e4e 100644 --- a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp +++ b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp @@ -46,110 +46,115 @@ EndContentData */ # mob_mature_netherwing_drake #####*/ -#define SPELL_PLACE_CARCASS 38439 -#define SPELL_JUST_EATEN 38502 -#define SPELL_NETHER_BREATH 38467 +enum +{ + SAY_JUST_EATEN = -1000222, + + SPELL_PLACE_CARCASS = 38439, + SPELL_JUST_EATEN = 38502, + SPELL_NETHER_BREATH = 38467, + POINT_ID = 1, + + QUEST_KINDNESS = 10804, + NPC_EVENT_PINGER = 22131 +}; -#define SAY_JUST_EATEN -1000222 struct TRINITY_DLL_DECL mob_mature_netherwing_drakeAI : public ScriptedAI { - mob_mature_netherwing_drakeAI(Creature* c) : ScriptedAI(c) - { - PlayerGUID = 0; - Reset(); - } + mob_mature_netherwing_drakeAI(Creature* c) : ScriptedAI(c) { } - uint64 PlayerGUID; + uint64 uiPlayerGUID; - bool IsEating; - bool Evade; + bool bCanEat; + bool bIsEating; - uint32 ResetTimer; - uint32 CastTimer; uint32 EatTimer; + uint32 CastTimer; void Reset() { - IsEating = false; - Evade = false; + uiPlayerGUID = 0; + + bCanEat = false; + bIsEating = false; - ResetTimer = 120000; EatTimer = 5000; CastTimer = 5000; } void EnterCombat(Unit* who) { } - void MoveInLineOfSight(Unit* who) + void SpellHit(Unit* pCaster, SpellEntry const* pSpell) { - if(m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) - return; - - ScriptedAI::MoveInLineOfSight(who); - } - - void SpellHit(Unit* caster, const SpellEntry* spell) - { - if(!caster) + if (bCanEat || bIsEating) return; - if(caster->GetTypeId() == TYPEID_PLAYER && spell->Id == SPELL_PLACE_CARCASS && !m_creature->HasAura(SPELL_JUST_EATEN) && !PlayerGUID) + if (pCaster->GetTypeId() == TYPEID_PLAYER && pSpell->Id == SPELL_PLACE_CARCASS && !m_creature->HasAura(SPELL_JUST_EATEN)) { - float PlayerX, PlayerY, PlayerZ; - caster->GetClosePoint(PlayerX, PlayerY, PlayerZ, m_creature->GetObjectSize()); - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - m_creature->GetMotionMaster()->MovePoint(1, PlayerX, PlayerY, PlayerZ); - PlayerGUID = caster->GetGUID(); + uiPlayerGUID = pCaster->GetGUID(); + bCanEat = true; } } void MovementInform(uint32 type, uint32 id) { - if(type != POINT_MOTION_TYPE) + if (type != POINT_MOTION_TYPE) return; - if(id == 1) + if (id == POINT_ID) { - IsEating = true; - EatTimer = 5000; - m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACKUNARMED); - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + bIsEating = true; + EatTimer = 7000; + m_creature->HandleEmoteCommand(EMOTE_ONESHOT_ATTACKUNARMED); } } void UpdateAI(const uint32 diff) { - if(IsEating) - if(EatTimer < diff) + if (bCanEat || bIsEating) { - IsEating = false; - DoCast(m_creature, SPELL_JUST_EATEN); - m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - DoScriptText(SAY_JUST_EATEN, m_creature); - if(PlayerGUID) + if (EatTimer < diff) { - Player* plr = Unit::GetPlayer(PlayerGUID); - if(plr && plr->GetQuestStatus(10804) == QUEST_STATUS_INCOMPLETE) + if (bCanEat && !bIsEating) { - plr->KilledMonster(22131, m_creature->GetGUID()); - Evade = true; - PlayerGUID = 0; + if (Unit* pUnit = Unit::GetUnit(*m_creature, uiPlayerGUID)) + { + if (GameObject* pGo = pUnit->GetGameObject(SPELL_PLACE_CARCASS)) + { + if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) + m_creature->GetMotionMaster()->MovementExpired(); + + m_creature->GetMotionMaster()->MoveIdle(); + m_creature->StopMoving(); + + m_creature->GetMotionMaster()->MovePoint(POINT_ID, pGo->GetPositionX(), pGo->GetPositionY(), pGo->GetPositionZ()); + } + } + bCanEat = false; + } + else if (bIsEating) + { + DoCast(m_creature, SPELL_JUST_EATEN); + DoScriptText(SAY_JUST_EATEN, m_creature); + + if (Player* pPlr = (Player*)Unit::GetUnit((*m_creature), uiPlayerGUID)) + pPlr->KilledMonster(NPC_EVENT_PINGER, m_creature->GetGUID()); + + Reset(); + m_creature->GetMotionMaster()->Clear(); } } - }else EatTimer -= diff; + else + EatTimer -= diff; - if(Evade) - if(ResetTimer < diff) - { - EnterEvadeMode(); - return; - }else ResetTimer -= diff; + return; + } if(!UpdateVictim()) return; - if(CastTimer < diff) + if (CastTimer < diff) { DoCast(m_creature->getVictim(), SPELL_NETHER_BREATH); CastTimer = 5000; @@ -159,9 +164,9 @@ struct TRINITY_DLL_DECL mob_mature_netherwing_drakeAI : public ScriptedAI } }; -CreatureAI* GetAI_mob_mature_netherwing_drake(Creature *_creature) +CreatureAI* GetAI_mob_mature_netherwing_drake(Creature* pCreature) { - return new mob_mature_netherwing_drakeAI(_creature); + return new mob_mature_netherwing_drakeAI(pCreature); } /*### |