aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-06-22 13:42:13 +0200
committerShauren <shauren.trinity@gmail.com>2013-06-22 13:42:13 +0200
commit55fa58af19b39ab92bdea7407a5c12b603931b75 (patch)
tree0ace25e433e8326577283f12e883358f23b60853 /src/server/game/Entities
parente5a8f6cd98aa15ef792947551d3de8dab277012d (diff)
Core/Movement: Prevent dynamic changes of movement flags for charmed creatures
Closes #10075 Closes #10079
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp11
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp22
2 files changed, 30 insertions, 3 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 33f29820b12..3900f532d5c 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -2586,12 +2586,16 @@ Unit* Creature::SelectNearestHostileUnitInAggroRange(bool useLOS) const
void Creature::UpdateMovementFlags()
{
+ // Do not update movement flags if creature is controlled by a player (charm/vehicle)
+ if (m_movedPlayer)
+ return;
+
// Set the movement flags if the creature is in that mode. (Only fly if actually in air, only swim if in water, etc)
float ground = GetMap()->GetHeight(GetPositionX(), GetPositionY(), GetPositionZMinusOffset());
- bool isInAir = !IsFalling() && (G3D::fuzzyGt(GetPositionZMinusOffset(), ground + 0.05f) || G3D::fuzzyLt(GetPositionZMinusOffset(), ground - 0.05f)); // Can be underground too, prevent the falling
+ bool isInAir = (G3D::fuzzyGt(GetPositionZMinusOffset(), ground + 0.05f) || G3D::fuzzyLt(GetPositionZMinusOffset(), ground - 0.05f)); // Can be underground too, prevent the falling
- if (GetCreatureTemplate()->InhabitType & INHABIT_AIR && isInAir)
+ if (GetCreatureTemplate()->InhabitType & INHABIT_AIR && isInAir && !IsFalling())
{
if (GetCreatureTemplate()->InhabitType & INHABIT_GROUND)
SetCanFly(true);
@@ -2604,6 +2608,9 @@ void Creature::UpdateMovementFlags()
SetDisableGravity(false);
}
+ if (!isInAir)
+ RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING);
+
SetSwim(GetCreatureTemplate()->InhabitType & INHABIT_WATER && IsInWater());
}
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 541c5d9f107..9f6b5f76cb4 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -17406,9 +17406,19 @@ bool Unit::SetDisableGravity(bool disable, bool /*packetOnly = false*/)
return false;
if (disable)
+ {
AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);
+ RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING);
+ }
else
+ {
RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);
+ if (!HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY))
+ {
+ m_movementInfo.SetFallTime(0);
+ AddUnitMovementFlag(MOVEMENTFLAG_FALLING);
+ }
+ }
return true;
}
@@ -17432,9 +17442,19 @@ bool Unit::SetCanFly(bool enable)
return false;
if (enable)
+ {
AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY);
+ RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING);
+ }
else
- RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY);
+ {
+ RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_MASK_MOVING_FLY);
+ if (!IsLevitating())
+ {
+ m_movementInfo.SetFallTime(0);
+ AddUnitMovementFlag(MOVEMENTFLAG_FALLING);
+ }
+ }
return true;
}