aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp7
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp13
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Grids/ObjectGridLoader.cpp3
4 files changed, 13 insertions, 11 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 2af7824cf98..169d5feae03 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -522,12 +522,17 @@ void Creature::Update(uint32 diff)
if (!IsAlive())
break;
- // if creature is charmed, switch to charmed AI
+ // if creature is charmed, switch to charmed AI (and back)
if (NeedChangeAI)
{
UpdateCharmAI();
NeedChangeAI = false;
IsAIEnabled = true;
+ if (!IsInEvadeMode() && LastCharmerGUID)
+ if (Unit* charmer = ObjectAccessor::GetUnit(*this, LastCharmerGUID))
+ i_AI->AttackStart(charmer);
+
+ LastCharmerGUID = 0;
}
if (!IsInEvadeMode() && IsAIEnabled)
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 57a920ab56b..7e67a9e6e09 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -162,7 +162,7 @@ ProcEventInfo::ProcEventInfo(Unit* actor, Unit* actionTarget, Unit* procTarget,
#endif
Unit::Unit(bool isWorldObject) :
WorldObject(isWorldObject), m_movedPlayer(NULL), m_lastSanctuaryTime(0),
- IsAIEnabled(false), NeedChangeAI(false),
+ IsAIEnabled(false), NeedChangeAI(false), LastCharmerGUID(0),
m_ControlledByPlayer(false), movespline(new Movement::MoveSpline()),
i_AI(NULL), i_disabledAI(NULL), m_AutoRepeatFirstCast(false), m_procDeep(0),
m_removedAurasCount(0), i_motionMaster(this), m_ThreatManager(this),
@@ -15836,16 +15836,13 @@ void Unit::RemoveCharmedBy(Unit* charmer)
if (Creature* creature = ToCreature())
{
+ // Creature will restore its old AI on next update
if (creature->AI())
creature->AI()->OnCharmed(false);
- if (type != CHARM_TYPE_VEHICLE) // Vehicles' AI is never modified
- {
- creature->AIM_Initialize();
-
- if (creature->AI() && charmer && charmer->IsAlive())
- creature->AI()->AttackStart(charmer);
- }
+ // Vehicle should not attack its passenger after he exists the seat
+ if (type != CHARM_TYPE_VEHICLE)
+ LastCharmerGUID = charmer->GetGUID();
}
else
ToPlayer()->SetClientControl(this, 1);
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index d34c66f7893..c90357a9eb8 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2074,6 +2074,7 @@ class Unit : public WorldObject
friend class VehicleJoinEvent;
bool IsAIEnabled, NeedChangeAI;
+ uint64 LastCharmerGUID;
bool CreateVehicleKit(uint32 id, uint32 creatureEntry);
void RemoveVehicleKit();
Vehicle* GetVehicleKit()const { return m_vehicleKit; }
diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp
index dacb72d5de6..879dd48c759 100644
--- a/src/server/game/Grids/ObjectGridLoader.cpp
+++ b/src/server/game/Grids/ObjectGridLoader.cpp
@@ -217,8 +217,7 @@ void ObjectGridStoper::Visit(CreatureMapType &m)
{
iter->GetSource()->CombatStop();
iter->GetSource()->DeleteThreatList();
- if (iter->GetSource()->IsAIEnabled)
- iter->GetSource()->AI()->EnterEvadeMode();
+ iter->GetSource()->AI()->EnterEvadeMode();
}
}
}