diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/include/sc_creature.cpp | 17 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/creature/mob_event_ai.cpp | 19 | ||||
-rw-r--r-- | src/game/Player.cpp | 40 | ||||
-rw-r--r-- | src/game/Player.h | 2 |
4 files changed, 51 insertions, 27 deletions
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp index b3fd3723466..a74b59c872c 100644 --- a/src/bindings/scripts/include/sc_creature.cpp +++ b/src/bindings/scripts/include/sc_creature.cpp @@ -141,17 +141,24 @@ void ScriptedAI::UpdateAI(const uint32 diff) void ScriptedAI::EnterEvadeMode() { - m_creature->InterruptNonMeleeSpells(true); + //m_creature->InterruptNonMeleeSpells(true); m_creature->RemoveAllAuras(); m_creature->DeleteThreatList(); m_creature->CombatStop(); m_creature->LoadCreaturesAddon(); - - if (m_creature->isAlive()) - m_creature->GetMotionMaster()->MoveTargetedHome(); - m_creature->SetLootRecipient(NULL); + if(m_creature->isAlive()) + { + if(Unit* owner = m_creature->GetOwner()) + { + if(owner->isAlive()) + m_creature->GetMotionMaster()->MoveFollow(owner,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE); + } + else + m_creature->GetMotionMaster()->MoveTargetedHome(); + } + InCombat = false; Reset(); } diff --git a/src/bindings/scripts/scripts/creature/mob_event_ai.cpp b/src/bindings/scripts/scripts/creature/mob_event_ai.cpp index 657a1f41b5b..7d8b11d21af 100644 --- a/src/bindings/scripts/scripts/creature/mob_event_ai.cpp +++ b/src/bindings/scripts/scripts/creature/mob_event_ai.cpp @@ -1033,26 +1033,9 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI void EnterEvadeMode() { - m_creature->RemoveAllAuras(); - m_creature->DeleteThreatList(); - m_creature->CombatStop(); - m_creature->LoadCreaturesAddon(); - if( m_creature->isAlive() ) - { - if (Unit* owner = m_creature->GetOwner()) - { - if (owner->isAlive()) - m_creature->GetMotionMaster()->MoveFollow(owner,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE); - } - else - m_creature->GetMotionMaster()->MoveTargetedHome(); - } + ScriptedAI::EnterEvadeMode(); - m_creature->SetLootRecipient(NULL); - - InCombat = false; IsFleeing = false; - Reset(); //Handle Evade events for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 1f17a75819d..c081d6cc8a4 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1016,12 +1016,12 @@ void Player::Update( uint32 p_time ) CheckExploreSystem(); - /*if(isCharmed()) + if(isCharmed()) { if(Unit *charmer = GetCharmer()) - if(charmer->GetTypeId() == TYPEID_UNIT && ((Creature*)charmer)->AI()) - ((Creature*)charmer)->AI()->UpdateCharmedAI(this, p_time); - }*/ + if(charmer->GetTypeId() == TYPEID_UNIT && charmer->isAlive()) + UpdateCharmedAI(); + } // Update items that have just a limited lifetime if (now>m_Last_tick) @@ -19051,3 +19051,35 @@ bool Player::isTotalImmunity() } return false; } + +void Player::UpdateCharmedAI() +{ + //This should only called in Player::Update + Creature *charmer = (Creature*)GetCharmer(); + + //kill self if charm aura has infinite duration + if(charmer->IsInEvadeMode()) + { + AuraList const& auras = GetAurasByType(SPELL_AURA_MOD_CHARM); + for(AuraList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter) + if((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->IsPermanent()) + { + charmer->DealDamage(this, GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + return; + } + } + + if(!charmer->isInCombat()) + GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + + Unit *target = getVictim(); + if(!target || !charmer->canAttack(target)) + { + target = charmer->SelectNearestTarget(); + if(!target) + return; + + GetMotionMaster()->MoveChase(target); + Attack(target, true); + } +}
\ No newline at end of file diff --git a/src/game/Player.h b/src/game/Player.h index 540d569ebbf..2f98793f3d1 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -2308,6 +2308,8 @@ class TRINITY_DLL_SPEC Player : public Unit GridReference<Player> m_gridRef; MapReference m_mapRef; + + void UpdateCharmedAI(); }; void AddItemsSetItem(Player*player,Item *item); |