41#include <boost/accumulators/framework/accumulator_set.hpp>
42#include <boost/accumulators/framework/features.hpp>
43#include <boost/accumulators/statistics/mean.hpp>
44#include <boost/accumulators/statistics/median.hpp>
45#include <boost/accumulators/statistics/variance.hpp>
46#include <boost/circular_buffer.hpp>
53 #define REMOVE_VIOLATING_FLAGS(check, maskToRemove) do \
57 TC_LOG_DEBUG("entities.unit", "Player::ValidateMovementInfo: Violation of MovementFlags found ({}). " \
58 "MovementFlags: {}, MovementFlags2: {}, MovementFlags3: {} for player {}. Mask {} will be removed.", \
59 STRINGIZE(check), mi->GetMovementFlags(), mi->GetExtraMovementFlags(), mi->GetExtraMovementFlags2(), GetPlayer()->GetGUID(), maskToRemove); \
60 mi->RemoveMovementFlag((maskToRemove)); \
64 #define REMOVE_VIOLATING_FLAGS(check, maskToRemove) do \
67 mi->RemoveMovementFlag((maskToRemove)); \
144 #undef REMOVE_VIOLATING_FLAGS
187 transport->RemovePassenger(player);
215 resumeToken.
Reason = seamlessTeleport ? 2 : 1;
218 if (!seamlessTeleport)
227 newTransport->AddPassenger(player, loc.
Location);
233 transport->RemovePassenger(player);
237 TC_LOG_ERROR(
"network",
"WORLD: failed to teleport player {} {} to map {} ({}) because of unknown reason!",
265 if (!seamlessTeleport)
271 garrison->SendRemoteInfo();
279 if (!seamlessTeleport)
309 if (entries.MapDifficulty->HasResetSchedule())
313 raidInstanceMessage.
MapID = mEntry->
ID;
317 raidInstanceMessage.
Locked = !playerLock->IsExpired();
318 raidInstanceMessage.
Extended = playerLock->IsExtended();
322 raidInstanceMessage.
Locked =
false;
323 raidInstanceMessage.
Extended =
false;
406 transport->AddPassenger(plMover, destLocation);
420 if (old_zone != newzone)
451 TC_LOG_TRACE(
"opcodes.movement",
"HandleMovementOpcode Name {}: opcode {} {} Flags {} Flags2 {} Flags3 {} Pos {}",
489 transport->AddPassenger(plrMover, movementInfo.
transport.
pos);
650 TC_LOG_ERROR(
"network",
"WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: {}", opcode);
667 TC_LOG_ERROR(
"network",
"{}SpeedChange player {} is NOT correct (must be {} instead {}), force set to correct value",
673 TC_LOG_DEBUG(
"misc",
"Player {} from account id {} kicked for incorrect speed (must be {} instead {})",
737 updateApplyMovementForce.
Status = &moveApplyMovementForceAck.
Ack.
Status;
738 updateApplyMovementForce.
Force = &moveApplyMovementForceAck.
Force;
752 updateRemoveMovementForce.
Status = &moveRemoveMovementForceAck.
Ack.
Status;
753 updateRemoveMovementForce.
TriggerGUID = moveRemoveMovementForceAck.
ID;
770 float expectedModMagnitude = 1.0f;
772 expectedModMagnitude = movementForces->GetModMagnitude();
774 if (std::fabs(expectedModMagnitude - setModMovementForceMagnitudeAck.
Speed) > 0.01f)
776 TC_LOG_DEBUG(
"misc",
"Player {} from account id {} kicked for incorrect movement force magnitude (must be {} instead {})",
787 updateModMovementForceMagnitude.
Status = &setModMovementForceMagnitudeAck.
Ack.
Status;
788 updateModMovementForceMagnitude.
Speed = setModMovementForceMagnitudeAck.
Speed;
815 TaxiPathNodeEntry const* currentNode = flight->GetPath()[flight->GetCurrentNode()];
822 flight->SetCurrentNodeAfterTeleport();
824 flight->SkipCurrentNode();
835 if (
GetPlayer()->m_taxi.GetPath().size() != 1)
849 TC_LOG_WARN(
"entities.player",
"WorldSession::HandleMoveTimeSkippedOpcode wrong mover state from the unit moved by {}",
GetPlayer()->GetGUID().ToString());
856 TC_LOG_WARN(
"entities.player",
"WorldSession::HandleMoveTimeSkippedOpcode wrong guid from the unit moved by {}",
GetPlayer()->GetGUID().ToString());
871 if (!serverTimeAtSent)
879 int64 lagDelay = roundTripDuration / 2;
891 int64 clockDelta = serverTimeAtSent.mapped() + lagDelay - clientTime;
918 using namespace boost::accumulators;
920 accumulator_set<
uint32, features<tag::mean, tag::median, tag::variance(lazy)> > latencyAccumulator;
923 latencyAccumulator(roundTripDuration);
925 uint32 latencyMedian =
static_cast<uint32>(std::round(median(latencyAccumulator)));
926 uint32 latencyStandardDeviation =
static_cast<uint32>(std::round(sqrt(variance(latencyAccumulator))));
928 accumulator_set<int64, features<tag::mean> > clockDeltasAfterFiltering;
929 uint32 sampleSizeAfterFiltering = 0;
932 if (roundTripDuration < latencyStandardDeviation + latencyMedian) {
933 clockDeltasAfterFiltering(clockDelta);
934 sampleSizeAfterFiltering++;
938 if (sampleSizeAfterFiltering != 0)
940 int64 meanClockDelta =
static_cast<int64>(std::round(mean(clockDeltasAfterFiltering)));
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
DB2Storage< TaxiNodesEntry > sTaxiNodesStore("TaxiNodes.db2", &TaxiNodesLoadInfo::Instance)
@ VEHICLE_SEAT_FLAG_ALLOW_TURNING
@ TAXI_PATH_NODE_FLAG_TELEPORT
std::chrono::steady_clock::time_point TimePoint
time_point shorthand typedefs
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_WARN(filterType__, message__,...)
#define TC_LOG_TRACE(filterType__, message__,...)
#define REMOVE_VIOLATING_FLAGS(check, maskToRemove)
@ SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE
constexpr FormattedOpcodeName< OpcodeClient > GetOpcodeNameForLogging(OpcodeClient opcode)
Lookup opcode name for human understandable logging.
@ CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK
@ CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK
@ CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK
@ CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK
@ CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK
@ CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK
@ CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK
@ CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK
@ CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK
@ TELE_REVIVE_AT_TELEPORT
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
@ PLAYER_LOCAL_FLAG_OVERRIDE_TRANSPORT_SERVER_TIME
@ WaitingForSuspendTokenResponse
constexpr BattlegroundQueueTypeId BATTLEGROUND_QUEUE_NONE
@ SPELL_AURA_FEATHER_FALL
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
@ PROC_SPELL_TYPE_MASK_ALL
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
@ MOVEMENTFLAG_DESCENDING
@ MOVEMENTFLAG_PITCH_DOWN
@ MOVEMENTFLAG_STRAFE_LEFT
@ MOVEMENTFLAG_WATERWALKING
@ MOVEMENTFLAG_MASK_MOVING
@ MOVEMENTFLAG_DISABLE_GRAVITY
@ MOVEMENTFLAG_FALLING_SLOW
@ MOVEMENTFLAG_MASK_TURNING
@ MOVEMENTFLAG_STRAFE_RIGHT
@ MOVEMENTFLAG_SPLINE_ELEVATION
@ VEHICLE_FLAG_FIXED_POSITION
ObjectGuid const & GetGUID() const
virtual bool HandlePlayerUnderMap(Player *)
static bool IsValidMapCoord(uint32 mapid, float x, float y)
virtual void RemovePlayerFromMap(Player *, bool)
virtual bool AddPlayerToMap(Player *player, bool initPlayer=true)
virtual TransferAbortParams CannotEnter(Player *)
float GetMinHeight(PhaseShift const &phaseShift, float x, float y)
GameObject * GetGameObject(ObjectGuid const &guid)
Difficulty GetDifficultyID() const
char const * GetMapName() const
Transport * GetTransport(ObjectGuid const &guid)
MovementGenerator * GetCurrentMovementGenerator() const
virtual void Initialize(Unit *owner)=0
std::string ToString() const
uint32 GetTaxiDestination() const
void SendInitialPacketsAfterAddToMap()
WorldLocation const & GetCorpseLocation() const
void UpdateFallInformationIfNeed(MovementInfo const &minfo, uint32 opcode)
void HandleFall(MovementInfo const &movementInfo)
void SetPlayerFlag(PlayerFlags flags)
void SetBGTeam(Team team)
void SetPlayerLocalFlag(PlayerLocalFlags flags)
void RemovePlayerFlag(PlayerFlags flags)
uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
void SetBattlegroundId(uint32 val, BattlegroundTypeId bgTypeId, BattlegroundQueueTypeId queueId)
uint8 m_movementForceModMagnitudeChanges
bool InBattleground() const
void SpawnCorpseBones(bool triggerSave=true)
void UpdateZone(uint32 newZone, uint32 newArea)
void SetFallInformation(uint32 time, float z)
void SendInitialPacketsBeforeAddToMap()
int32 GetNewWorldCounter() const
WorldSession * GetSession() const
bool IsInvitedForBattlegroundInstance(uint32 instanceId) const
void UnsummonPetTemporaryIfAny()
TeleportState GetTeleportState() const
TeleportLocation m_teleport_dest
void UpdateVisibilityForPlayer()
void ResummonBattlePetTemporaryUnSummonedIfAny()
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={}, uint32 teleportSpellId=0)
Battleground * GetBattleground() const
void ProcessDelayedOperations()
void UpdateIndoorsOutdoorsAuras()
bool UpdatePosition(float x, float y, float z, float orientation, bool teleport=false) override
void SummonIfPossible(bool agree)
std::array< uint8, MAX_MOVE_TYPE > m_forced_speed_changes
void SetTransportServerTime(int32 transportServerTime)
bool CheckInstanceValidity(bool)
Garrison * GetGarrison() const
void UnsummonBattlePetTemporaryIfAny(bool onFlyingMount=false)
uint32 GetBattlegroundId() const
bool HasPlayerFlag(PlayerFlags flags) const
TeleportLocation & GetTeleportDest()
void UpdateObjectVisibility(bool forced=true) override
void SetMap(Map *map) override
std::string GetDebugInfo() const override
void SendMessageToSet(WorldPacket const *data, bool self) const override
void ResummonPetTemporaryUnSummonedIfAny()
void SetTeleportState(TeleportState state)
void UpdatePvP(bool state, bool override=false)
void CleanupAfterTaxiFlight()
void UpdateTavernRestingState()
void UpdateZoneAndAreaId()
bool IsBeingTeleported() const
EnumFlag< TeleportToOptions > GetTeleportOptions() const
void ResurrectPlayer(float restore_percent, bool applySickness=false)
virtual ObjectGuid GetTransportGUID() const =0
virtual void AddPassenger(WorldObject *passenger, Position const &offset)=0
virtual TransportBase * RemovePassenger(WorldObject *passenger)=0
Vehicle * GetVehicle() const
float GetSpeed(UnitMoveType mtype) const
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Emote GetEmoteState() const
MotionMaster * GetMotionMaster()
MovementForces const * GetMovementForces() const
uint32 m_movementCounter
Incrementing counter used in movement packets.
void SetEmoteState(Emote emote)
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Unit * GetUnitBeingMoved() const
float GetHoverOffset() const
bool HasAuraType(AuraType auraType) const
void RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const *source=nullptr)
float GetSpeedRate(UnitMoveType mtype) const
void SetSpeedRate(UnitMoveType mtype, float rate)
std::unique_ptr< Movement::MoveSpline > movespline
static void ProcSkillsAndAuras(Unit *actor, Unit *actionTarget, ProcFlagsInit const &typeMaskActor, ProcFlagsInit const &typeMaskActionTarget, ProcFlagsSpellType spellTypeMask, ProcFlagsSpellPhase spellPhaseMask, ProcFlagsHit hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
constexpr uint32 GetMapId() const
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
PhaseShift & GetPhaseShift()
TransportBase * GetTransport() const
std::string const & GetName() const
void UpdatePositionData()
MovementInfo m_movementInfo
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
TimePoint GetReceivedTime() const
OpcodeClient GetOpcode() const
WorldPacket const * Write() override
WorldPacket const * Write() override
TimePoint GetReceivedTime() const
WorldPacket const * Write() override
MovementForce const * Force
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * GetRawPacket() const
void LogoutPlayer(bool save)
Log the player out
void HandleMovementOpcode(OpcodeClient opcode, MovementInfo &movementInfo)
void HandleMoveWorldportAck()
void HandleTimeSyncResponse(WorldPackets::Misc::TimeSyncResponse const &timeSyncResponse)
AccountTypes GetSecurity() const
int64 _timeSyncClockDelta
void HandleSetAdvFlyingSpeedRangeAck(WorldPackets::Movement::MovementSpeedRangeAck &speedRangeAck)
void HandleMoveApplyMovementForceAck(WorldPackets::Movement::MoveApplyMovementForceAck &moveApplyMovementForceAck)
uint32 AdjustClientMovementTime(uint32 time) const
bool ValidateMovementInfo(MovementInfo *mi) const
void HandleSetAdvFlyingSpeedAck(WorldPackets::Movement::MovementSpeedAck &speedAck)
void HandleMovementAckMessage(WorldPackets::Movement::MovementAckMessage &movementAck)
void HandleMoveWorldportAckOpcode(WorldPackets::Movement::WorldPortResponse &packet)
static constexpr uint32 SPECIAL_RESUME_COMMS_TIME_SYNC_COUNTER
void HandleTimeSync(uint32 counter, int64 clientTime, TimePoint responseReceiveTime)
static constexpr uint32 SPECIAL_INIT_ACTIVE_MOVER_TIME_SYNC_COUNTER
void HandleMoveSplineDoneOpcode(WorldPackets::Movement::MoveSplineDone &moveSplineDone)
Player * GetPlayer() const
void HandleSetCollisionHeightAck(WorldPackets::Movement::MoveSetCollisionHeightAck &setCollisionHeightAck)
void HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMovement &packet)
void HandleMoveKnockBackAck(WorldPackets::Movement::MoveKnockBackAck &movementAck)
void ComputeNewClockDelta()
void HandleSetActiveMoverOpcode(WorldPackets::Movement::SetActiveMover &packet)
void HandleMoveSetModMovementForceMagnitudeAck(WorldPackets::Movement::MovementSpeedAck &setModMovementForceMagnitudeAck)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
uint32 GetAccountId() const
void HandleMoveTimeSkippedOpcode(WorldPackets::Movement::MoveTimeSkipped &moveTimeSkipped)
void HandleMoveRemoveMovementForceAck(WorldPackets::Movement::MoveRemoveMovementForceAck &moveRemoveMovementForceAck)
void HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpeedAck &packet)
void HandleQueuedMessagesEnd(WorldPackets::Auth::QueuedMessagesEnd const &queuedMessagesEnd)
void HandleMoveInitActiveMoverComplete(WorldPackets::Movement::MoveInitActiveMoverComplete const &moveInitActiveMoverComplete)
std::unique_ptr< boost::circular_buffer< std::pair< int64, uint32 > > > _timeSyncClockDeltaQueue
void HandleSuspendTokenResponse(WorldPackets::Movement::SuspendTokenResponse &suspendTokenResponse)
void HandleSummonResponseOpcode(WorldPackets::Movement::SummonResponse &packet)
void KickPlayer(std::string_view reason)
Kick a player out of the World.
void HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck &packet)
std::map< uint32, int64 > _pendingTimeSyncRequests
bool IsValidMapCoord(float c)
BattlegroundQueueTypeId queueId
bool IsBattlegroundOrArena() const
float stepUpStartElevation
struct MovementInfo::TransportInfo transport
bool HasMovementFlag(uint32 flag) const
void AddMovementFlag(uint32 flag)
constexpr void SetOrientation(float orientation)
constexpr float GetPositionX() const
constexpr float GetPositionY() const
float GetExactDist2d(const float x, const float y) const
bool IsPositionValid() const
constexpr void Relocate(float x, float y)
constexpr float GetOrientation() const
constexpr float GetPositionZ() const
Optional< uint32 > InstanceId
Optional< uint32 > LfgDungeonsId
Optional< ObjectGuid > TransportGuid
TaggedPosition< Position::XYZO > Pos