aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/include/sc_creature.cpp17
-rw-r--r--src/bindings/scripts/scripts/creature/mob_event_ai.cpp19
-rw-r--r--src/game/Player.cpp40
-rw-r--r--src/game/Player.h2
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);