40#include <boost/accumulators/statistics/variance.hpp>
41#include <boost/accumulators/accumulators.hpp>
42#include <boost/accumulators/statistics.hpp>
43#include <boost/circular_buffer.hpp>
84 transport->RemovePassenger(player);
111 resumeToken.
Reason = seamlessTeleport ? 2 : 1;
114 if (!seamlessTeleport)
121 newTransport->AddPassenger(player);
126 TC_LOG_ERROR(
"network",
"WORLD: failed to teleport player {} {} to map {} ({}) because of unknown reason!",
154 if (!seamlessTeleport)
160 garrison->SendRemoteInfo();
168 if (!seamlessTeleport)
198 if (entries.MapDifficulty->HasResetSchedule())
202 raidInstanceMessage.
MapID = mEntry->
ID;
206 raidInstanceMessage.
Locked = !playerLock->IsExpired();
207 raidInstanceMessage.
Extended = playerLock->IsExtended();
211 raidInstanceMessage.
Locked =
false;
212 raidInstanceMessage.
Extended =
false;
293 if (old_zone != newzone)
324 TC_LOG_TRACE(
"opcodes.movement",
"HandleMovementOpcode Name {}: opcode {} {} Flags {} Flags2 {} Pos {}",
337 TC_LOG_ERROR(
"network",
"HandleMovementOpcodes: guid error");
374 transport->AddPassenger(plrMover);
520 TC_LOG_ERROR(
"network",
"WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: {}", opcode);
537 TC_LOG_ERROR(
"network",
"{}SpeedChange player {} is NOT correct (must be {} instead {}), force set to correct value",
543 TC_LOG_DEBUG(
"misc",
"Player {} from account id {} kicked for incorrect speed (must be {} instead {})",
599 TC_LOG_ERROR(
"network",
"HandleMoveApplyMovementForceAck: guid error, expected {}, got {}",
607 updateApplyMovementForce.
Status = &moveApplyMovementForceAck.
Ack.
Status;
608 updateApplyMovementForce.
Force = &moveApplyMovementForceAck.
Force;
621 TC_LOG_ERROR(
"network",
"HandleMoveRemoveMovementForceAck: guid error, expected {}, got {}",
629 updateRemoveMovementForce.
Status = &moveRemoveMovementForceAck.
Ack.
Status;
630 updateRemoveMovementForce.
TriggerGUID = moveRemoveMovementForceAck.
ID;
643 TC_LOG_ERROR(
"network",
"HandleSetModMovementForceMagnitudeAck: guid error, expected {}, got {}",
654 float expectedModMagnitude = 1.0f;
656 expectedModMagnitude = movementForces->GetModMagnitude();
658 if (std::fabs(expectedModMagnitude - setModMovementForceMagnitudeAck.
Speed) > 0.01f)
660 TC_LOG_DEBUG(
"misc",
"Player {} from account id {} kicked for incorrect movement force magnitude (must be {} instead {})",
671 updateModMovementForceMagnitude.
Status = &setModMovementForceMagnitudeAck.
Ack.
Status;
672 updateModMovementForceMagnitude.
Speed = setModMovementForceMagnitudeAck.
Speed;
699 TaxiPathNodeEntry const* currentNode = flight->GetPath()[flight->GetCurrentNode()];
706 flight->SetCurrentNodeAfterTeleport();
708 flight->SkipCurrentNode();
719 if (
GetPlayer()->m_taxi.GetPath().size() != 1)
733 TC_LOG_WARN(
"entities.player",
"WorldSession::HandleMoveTimeSkippedOpcode wrong mover state from the unit moved by {}",
GetPlayer()->GetGUID().
ToString());
740 TC_LOG_WARN(
"entities.player",
"WorldSession::HandleMoveTimeSkippedOpcode wrong guid from the unit moved by {}",
GetPlayer()->GetGUID().
ToString());
765 uint32 lagDelay = roundTripDuration / 2;
787 using namespace boost::accumulators;
789 accumulator_set<
uint32, features<tag::mean, tag::median, tag::variance(lazy)> > latencyAccumulator;
792 latencyAccumulator(roundTripDuration);
794 uint32 latencyMedian =
static_cast<uint32>(std::round(median(latencyAccumulator)));
795 uint32 latencyStandardDeviation =
static_cast<uint32>(std::round(sqrt(variance(latencyAccumulator))));
797 accumulator_set<int64, features<tag::mean> > clockDeltasAfterFiltering;
798 uint32 sampleSizeAfterFiltering = 0;
801 if (roundTripDuration < latencyStandardDeviation + latencyMedian) {
802 clockDeltasAfterFiltering(clockDelta);
803 sampleSizeAfterFiltering++;
807 if (sampleSizeAfterFiltering != 0)
809 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
#define TC_LOG_WARN(filterType__,...)
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_TRACE(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
@ TELE_REVIVE_AT_TELEPORT
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
@ PLAYER_LOCAL_FLAG_OVERRIDE_TRANSPORT_SERVER_TIME
constexpr BattlegroundQueueTypeId BATTLEGROUND_QUEUE_NONE
@ PROC_SPELL_TYPE_MASK_ALL
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
@ MOVEMENTFLAG_MASK_MOVING
@ MOVEMENTFLAG_MASK_TURNING
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
static ObjectGuid GetGUID(Object const *o)
static Player * ToPlayer(Object *o)
uint32 GetTaxiDestination() const
void SetSemaphoreTeleportNear(bool semphsetting)
void SendInitialPacketsAfterAddToMap()
void ValidateMovementInfo(MovementInfo *mi)
WorldLocation & GetTeleportDest()
void HandleFall(MovementInfo const &movementInfo)
void SetPlayerFlag(PlayerFlags flags)
void SetBGTeam(Team team)
bool IsBeingTeleportedFar() const
void SetPlayerLocalFlag(PlayerLocalFlags flags)
void RemovePlayerFlag(PlayerFlags flags)
uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
void SetBattlegroundId(uint32 val, BattlegroundTypeId bgTypeId, BattlegroundQueueTypeId queueId)
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={})
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()
WorldSession * GetSession() const
bool IsInvitedForBattlegroundInstance(uint32 instanceId) const
void UnsummonPetTemporaryIfAny()
void UpdateFallInformationIfNeed(MovementInfo const &minfo, uint16 opcode)
void UpdateVisibilityForPlayer()
void SetSemaphoreTeleportFar(bool semphsetting)
void ResummonBattlePetTemporaryUnSummonedIfAny()
WorldLocation GetCorpseLocation() const
Optional< uint32 > GetTeleportDestInstanceId() const
Battleground * GetBattleground() const
void ProcessDelayedOperations()
bool UpdatePosition(float x, float y, float z, float orientation, bool teleport=false) override
uint32 GetTeleportOptions() const
void SummonIfPossible(bool agree)
std::array< uint8, MAX_MOVE_TYPE > m_forced_speed_changes
bool IsBeingTeleportedNear() const
void SetTransportServerTime(int32 transportServerTime)
bool CheckInstanceValidity(bool)
Garrison * GetGarrison() const
void UnsummonBattlePetTemporaryIfAny(bool onFlyingMount=false)
uint32 GetBattlegroundId() const
bool IsBeingTeleportedSeamlessly() const
bool HasPlayerFlag(PlayerFlags flags) const
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 UpdatePvP(bool state, bool override=false)
void CleanupAfterTaxiFlight()
bool IsBeingTeleported() const
void ResurrectPlayer(float restore_percent, bool applySickness=false)
virtual ObjectGuid GetTransportGUID() const =0
virtual TransportBase * RemovePassenger(WorldObject *passenger)=0
virtual void AddPassenger(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
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
MovementInfo m_movementInfo
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) 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
void LogoutPlayer(bool save)
Log the player out
void HandleMovementOpcode(OpcodeClient opcode, MovementInfo &movementInfo)
void HandleTimeSyncResponse(WorldPackets::Misc::TimeSyncResponse &timeSyncResponse)
void HandleMoveWorldportAck()
int64 _timeSyncClockDelta
void HandleMoveApplyMovementForceAck(WorldPackets::Movement::MoveApplyMovementForceAck &moveApplyMovementForceAck)
std::map< uint32, uint32 > _pendingTimeSyncRequests
uint32 AdjustClientMovementTime(uint32 time) const
void HandleMovementAckMessage(WorldPackets::Movement::MovementAckMessage &movementAck)
void KickPlayer(std::string const &reason)
Kick a player out of the World.
void HandleMoveWorldportAckOpcode(WorldPackets::Movement::WorldPortResponse &packet)
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)
std::unique_ptr< boost::circular_buffer< std::pair< int64, uint32 > > > _timeSyncClockDeltaQueue
void HandleMoveInitActiveMoverComplete(WorldPackets::Movement::MoveInitActiveMoverComplete &moveInitActiveMoverComplete)
void HandleSuspendTokenResponse(WorldPackets::Movement::SuspendTokenResponse &suspendTokenResponse)
void HandleSummonResponseOpcode(WorldPackets::Movement::SummonResponse &packet)
void HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck &packet)
std::string 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
@ SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE
std::string ToString(Type &&val, Params &&... params)
bool IsValidMapCoord(float c)
BattlegroundQueueTypeId queueId
bool IsBattlegroundOrArena() const
struct MovementInfo::TransportInfo transport
constexpr void SetOrientation(float orientation)
constexpr float GetPositionX() const
constexpr float GetPositionY() const
float GetExactDist2d(const float x, const float y) const
std::string ToString() const
bool IsPositionValid() const
constexpr void Relocate(float x, float y)
constexpr float GetOrientation() const
constexpr float GetPositionZ() const
TaggedPosition< Position::XYZO > Pos