aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-12-12 09:50:52 +0100
committerShauren <shauren.trinity@gmail.com>2013-12-12 09:50:52 +0100
commit54fd53f7e3575ad24b6daf88f628afdd52b9df04 (patch)
tree3d2e8b93dff4e76ebfac9b143a04969e3716e939 /src
parent385e2dba379d42cf09c9cb36bee728113769d528 (diff)
Core/Movement: Fixed possible invalid memory access
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp10
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp5
-rw-r--r--src/server/game/Entities/Unit/Unit.h6
-rw-r--r--src/server/game/Movement/MotionMaster.cpp3
5 files changed, 14 insertions, 12 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index d927af37adf..fc85fea7b52 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -726,16 +726,16 @@ bool Creature::AIM_Initialize(CreatureAI* ai)
void Creature::Motion_Initialize()
{
if (!m_formation)
- i_motionMaster.Initialize();
+ GetMotionMaster()->Initialize();
else if (m_formation->getLeader() == this)
{
m_formation->FormationReset(false);
- i_motionMaster.Initialize();
+ GetMotionMaster()->Initialize();
}
else if (m_formation->isFormed())
- i_motionMaster.MoveIdle(); //wait the order of leader
+ GetMotionMaster()->MoveIdle(); //wait the order of leader
else
- i_motionMaster.Initialize();
+ GetMotionMaster()->Initialize();
}
bool Creature::Create(uint32 guidlow, Map* map, uint32 phaseMask, uint32 Entry, uint32 vehId, uint32 team, float x, float y, float z, float ang, const CreatureData* data)
@@ -1461,7 +1461,7 @@ void Creature::setDeathState(DeathState s)
m_formation->FormationReset(true);
if ((CanFly() || IsFlying()))
- i_motionMaster.MoveFall();
+ GetMotionMaster()->MoveFall();
Unit::setDeathState(CORPSE);
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 91e2e9f1834..acd0c3b5ec3 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -5197,7 +5197,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness)
void Player::KillPlayer()
{
if (IsFlying() && !GetTransport())
- i_motionMaster.MoveFall();
+ GetMotionMaster()->MoveFall();
SetMovement(MOVE_ROOT);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 343adecbd4b..9bd7e1eb512 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -165,7 +165,7 @@ Unit::Unit(bool isWorldObject) :
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),
+ m_removedAurasCount(0), i_motionMaster(new MotionMaster(this)), m_ThreatManager(this),
m_vehicle(NULL), m_vehicleKit(NULL), m_unitTypeMask(UNIT_MASK_NONE),
m_HostileRefManager(this), _lastDamagedTime(0)
{
@@ -293,6 +293,7 @@ Unit::~Unit()
_DeleteRemovedAuras();
+ delete i_motionMaster;
delete m_charmInfo;
delete movespline;
@@ -362,7 +363,7 @@ void Unit::Update(uint32 p_time)
}
UpdateSplineMovement(p_time);
- i_motionMaster.UpdateMotion(p_time);
+ i_motionMaster->UpdateMotion(p_time);
}
bool Unit::haveOffhandWeapon() const
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index e8a318dac6a..d9e49ab6a4d 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2005,8 +2005,8 @@ class Unit : public WorldObject
static Player* GetPlayer(WorldObject& object, uint64 guid);
static Creature* GetCreature(WorldObject& object, uint64 guid);
- MotionMaster* GetMotionMaster() { return &i_motionMaster; }
- const MotionMaster* GetMotionMaster() const { return &i_motionMaster; }
+ MotionMaster* GetMotionMaster() { return i_motionMaster; }
+ const MotionMaster* GetMotionMaster() const { return i_motionMaster; }
bool IsStopped() const { return !(HasUnitState(UNIT_STATE_MOVING)); }
void StopMoving();
@@ -2187,7 +2187,7 @@ class Unit : public WorldObject
virtual SpellSchoolMask GetMeleeDamageSchoolMask() const;
- MotionMaster i_motionMaster;
+ MotionMaster* i_motionMaster;
uint32 m_reactiveTimer[MAX_REACTIVE];
uint32 m_regenTimer;
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index 60855710218..6da798aaa17 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -72,7 +72,8 @@ MotionMaster::~MotionMaster()
{
MovementGenerator *curr = top();
pop();
- if (curr) DirectDelete(curr);
+ if (curr && !isStatic(curr))
+ delete curr; // Skip finalizing on delete, it might launch new movement
}
}