diff options
| author | Chaouki Dhib <chaodhib@gmail.com> | 2021-06-15 23:09:48 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-15 23:09:48 +0200 |
| commit | d337fb99ed81dc3522bdea17e762febd989a6956 (patch) | |
| tree | 308c4402d114163a783d340c90bbe7ec42085169 /src/server/game/Server | |
| parent | 4b9465e1f91adbc139afe5f86ac84eb5f14b62b4 (diff) | |
Core/Movement: Implement proper player speed change (#26561)
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/GameClient.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/GameClient.h | 1 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 16 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
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); |
