aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorChaouki Dhib <chaodhib@gmail.com>2021-06-15 23:09:48 +0200
committerGitHub <noreply@github.com>2021-06-15 23:09:48 +0200
commitd337fb99ed81dc3522bdea17e762febd989a6956 (patch)
tree308c4402d114163a783d340c90bbe7ec42085169 /src/server/game/Server
parent4b9465e1f91adbc139afe5f86ac84eb5f14b62b4 (diff)
Core/Movement: Implement proper player speed change (#26561)
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/GameClient.cpp4
-rw-r--r--src/server/game/Server/GameClient.h1
-rw-r--r--src/server/game/Server/WorldSession.cpp16
-rw-r--r--src/server/game/Server/WorldSession.h2
4 files changed, 13 insertions, 10 deletions
diff --git a/src/server/game/Server/GameClient.cpp b/src/server/game/Server/GameClient.cpp
index 9dde28b3bfb..d75ee938a4f 100644
--- a/src/server/game/Server/GameClient.cpp
+++ b/src/server/game/Server/GameClient.cpp
@@ -28,8 +28,7 @@ GameClient::GameClient(WorldSession* sessionToServer)
void GameClient::AddAllowedMover(Unit* unit)
{
- if (GameClient* previousController = unit->GetGameClientMovingMe())
- previousController->RemoveAllowedMover(unit);
+ ASSERT(!unit->GetGameClientMovingMe() || unit->GetGameClientMovingMe() == this);
_allowedMovers.insert(unit->GetGUID());
unit->SetGameClientMovingMe(this);
@@ -37,6 +36,7 @@ void GameClient::AddAllowedMover(Unit* unit)
void GameClient::RemoveAllowedMover(Unit* unit)
{
+ unit->PurgeAndApplyPendingMovementChanges();
_allowedMovers.erase(unit->GetGUID());
if (unit->GetGameClientMovingMe() == this)
{
diff --git a/src/server/game/Server/GameClient.h b/src/server/game/Server/GameClient.h
index 4baf5015ddb..d44f1625718 100644
--- a/src/server/game/Server/GameClient.h
+++ b/src/server/game/Server/GameClient.h
@@ -38,6 +38,7 @@ class TC_GAME_API GameClient
void SetActivelyMovedUnit(Unit* activelyMovedUnit) { _activelyMovedUnit = activelyMovedUnit; }
Player* GetBasePlayer() const { return _sessionToServer->GetPlayer(); }
+ WorldSession* GetWorldSession() const { return _sessionToServer; }
void SendDirectMessage(WorldPacket const* data) const;
private:
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 9cf46fba730..30be1c9e4ad 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -926,6 +926,8 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi)
mi->RemoveMovementFlag((maskToRemove));
#endif
+ Unit* mover = GetGameClient()->GetActivelyMovedUnit();
+
if (!GetPlayer()->GetVehicleBase() || !(GetPlayer()->GetVehicle()->GetVehicleInfo()->Flags & VEHICLE_FLAG_FIXED_POSITION))
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_ROOT), MOVEMENTFLAG_ROOT);
@@ -937,7 +939,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi)
MOVEMENTFLAG_MASK_MOVING);
//! Cannot hover without SPELL_AURA_HOVER
- REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_HOVER) && !GetPlayer()->HasAuraType(SPELL_AURA_HOVER),
+ REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_HOVER) && !mover->HasAuraType(SPELL_AURA_HOVER),
MOVEMENTFLAG_HOVER);
//! Cannot ascend and descend at the same time
@@ -962,12 +964,12 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi)
//! Cannot walk on water without SPELL_AURA_WATER_WALK except for ghosts
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_WATERWALKING) &&
- !GetPlayer()->HasAuraType(SPELL_AURA_WATER_WALK) &&
- !GetPlayer()->HasAuraType(SPELL_AURA_GHOST),
+ !mover->HasAuraType(SPELL_AURA_WATER_WALK) &&
+ !mover->HasAuraType(SPELL_AURA_GHOST),
MOVEMENTFLAG_WATERWALKING);
//! Cannot feather fall without SPELL_AURA_FEATHER_FALL
- REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FALLING_SLOW) && !GetPlayer()->HasAuraType(SPELL_AURA_FEATHER_FALL),
+ REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FALLING_SLOW) && !mover->HasAuraType(SPELL_AURA_FEATHER_FALL),
MOVEMENTFLAG_FALLING_SLOW);
/*! Cannot fly if no fly auras present. Exception is being a GM.
@@ -977,8 +979,8 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi)
*/
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && GetSecurity() == SEC_PLAYER &&
- !GetPlayer()->GetCharmedOrSelf()->HasAuraType(SPELL_AURA_FLY) &&
- !GetPlayer()->GetCharmedOrSelf()->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
+ !mover->HasAuraType(SPELL_AURA_FLY) &&
+ !mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY);
//! Cannot fly and fall at the same time
@@ -986,7 +988,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi)
MOVEMENTFLAG_FALLING);
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ENABLED) &&
- (!GetPlayer()->movespline->Initialized() || GetPlayer()->movespline->Finalized()), MOVEMENTFLAG_SPLINE_ENABLED);
+ (!mover->movespline->Initialized() || mover->movespline->Finalized()), MOVEMENTFLAG_SPLINE_ENABLED);
#undef REMOVE_VIOLATING_FLAGS
}
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 582b083f2ff..93b4561d66a 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -411,7 +411,7 @@ class TC_GAME_API WorldSession
void SendAddonsInfo();
void ReadMovementInfo(WorldPacket& data, MovementInfo* mi);
- void WriteMovementInfo(WorldPacket* data, MovementInfo* mi);
+ void static WriteMovementInfo(WorldPacket* data, MovementInfo* mi);
void SendPacket(WorldPacket const* packet);
void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3);