56#include <boost/circular_buffer.hpp>
60std::string
const DefaultPlayerName =
"<none>";
110 m_muteTime(mute_time),
117 _accountName(
std::move(name)),
118 _battlenetAccountId(battlenetAccountId),
119 m_accountExpansion(expansion),
122 _battlenetRequestToken(0),
125 m_playerLogout(false),
126 m_playerRecentlyLogout(false),
128 m_sessionDbcLocale(
sWorld->GetAvailableDbcLocale(locale)),
129 m_sessionDbLocaleIndex(locale),
130 _timezoneOffset(timezoneOffset),
133 _filterAddonMessages(false),
134 recruiterId(recruiter),
135 isRecruiter(isARecruiter),
140 _timeSyncClockDelta(0),
141 _pendingTimeSyncRequests(),
142 _timeSyncNextCounter(0),
144 _calendarEventCreationCooldown(0),
145 _battlePetMgr(
std::make_unique<
BattlePets::BattlePetMgr>(this)),
152 m_Address = sock->GetRemoteIpAddress().to_string();
169 for (
uint8 i = 0; i < 2; ++i)
201 std::ostringstream ss;
268 static uint64 sendPacketCount = 0;
269 static uint64 sendPacketBytes = 0;
272 static time_t lastTime = firstTime;
274 static uint64 sendLastPacketCount = 0;
275 static uint64 sendLastPacketBytes = 0;
279 if ((cur_time - lastTime) < 60)
281 sendPacketCount += 1;
282 sendPacketBytes += packet->
size();
284 sendLastPacketCount += 1;
285 sendLastPacketBytes += packet->
size();
291 TC_LOG_DEBUG(
"misc",
"Send all time packets count: {} bytes: {} avr.count/sec: {} avr.bytes/sec: {} time: {}", sendPacketCount, sendPacketBytes,
float(sendPacketCount)/fullTime,
float(sendPacketBytes)/fullTime,
uint32(fullTime));
292 TC_LOG_DEBUG(
"misc",
"Send last min packets count: {} bytes: {} avr.count/sec: {} avr.bytes/sec: {}", sendLastPacketCount, sendLastPacketBytes,
float(sendLastPacketCount)/minTime,
float(sendLastPacketBytes)/minTime);
295 sendLastPacketCount = 1;
296 sendLastPacketBytes = packet->
wpos();
303 m_Socket[conIdx]->SendPacket(*packet);
315 TC_LOG_ERROR(
"network.opcode",
"Received unexpected opcode {} Status: {} Reason: {} from {}",
325 TC_LOG_TRACE(
"network.opcode",
"Unprocessed tail data (read stop at {} from {}) Opcode {} from {}",
343 bool deletePacket =
true;
344 std::vector<WorldPacket*> requeuePackets;
345 uint32 processedPackets = 0;
348 constexpr uint32 MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE = 100;
368 requeuePackets.push_back(packet);
369 deletePacket =
false;
370 TC_LOG_DEBUG(
"network",
"Re-enqueueing packet with opcode {} with with status STATUS_LOGGEDIN. "
379 opHandle->
Call(
this, *packet);
382 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
389 "the player has not logged in yet and not recently logout");
394 opHandle->
Call(
this, *packet);
397 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
407 opHandle->
Call(
this, *packet);
410 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
428 opHandle->
Call(
this, *packet);
431 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
449 KickPlayer(
"WorldSession::Update Invalid chat link");
457 KickPlayer(
"WorldSession::Update Illegal chat link");
461 TC_LOG_ERROR(
"network",
"PacketArrayMaxCapacityException: {} while parsing {} from {}.",
466 TC_LOG_ERROR(
"network",
"WorldSession::Update ByteBufferException occured while parsing a packet (opcode: {}) from client {}, accountid={}. Skipped packet.",
480 if (processedPackets > MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE)
581 bg->EventPlayerLoggedOut(
_player);
607 guild->HandleMemberLogout(
this);
647 group->StartLeaderOfflineTimer();
665 TC_LOG_INFO(
"entities.player.character",
"Account: {} (IP: {}) Logout Character:[{}] {} Level: {}, XP: {}/{} ({} left)",
670 _map->RemovePlayerFromMap(
_player,
true);
677 TC_LOG_DEBUG(
"network",
"SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
703 for (
uint8 i = 0; i < 2; ++i)
722 KickPlayer(
"WorldSession::ValidateHyperlinksAndMaybeKick Invalid chat link");
729 if (str.find(
'|') == std::string::npos)
736 KickPlayer(
"WorldSession::DisallowHyperlinksAndMaybeKick Illegal chat link");
748 va_start(ap, format);
749 vsnprintf(szStr, 1024, format, ap);
764 va_start(ap, stringId);
765 vsnprintf(szStr, 1024, format, ap);
786 else if (!onlyActive)
802 TC_LOG_ERROR(
"network.opcode",
"Received opcode {} that must be processed in WorldSocket::ReadDataHandler from {}"
808 boost::system::error_code ignored_error;
817 connectTo.
Serial = serial;
819 if (instanceAddress.is_v4())
845 Field* fields = result->Fetch();
849 TC_LOG_ERROR(
"misc",
"Table `{}` have invalid account data type ({}), ignore.",
854 if ((mask & (1 << type)) == 0)
856 TC_LOG_ERROR(
"misc",
"Table `{}` have non appropriate for table account data type ({}), ignore.",
864 while (result->NextRow());
942 if (!hasTutorialsInDB)
1013 _warden = std::make_unique<WardenWin>();
1016 else if (
_os ==
"Wn64")
1020 else if (
_os ==
"Mc64")
1031 TC_LOG_DEBUG(
"rbac",
"WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]",
1043 TC_LOG_DEBUG(
"rbac",
"WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]",
1146 std::shared_ptr<AccountInfoQueryHolderPerRealm> realmHolder = std::make_shared<AccountInfoQueryHolderPerRealm>();
1153 std::shared_ptr<AccountInfoQueryHolder> holder = std::make_shared<AccountInfoQueryHolder>();
1160 struct ForkJoinState
1162 std::shared_ptr<AccountInfoQueryHolderPerRealm> Character;
1163 std::shared_ptr<AccountInfoQueryHolder>
Login;
1166 std::shared_ptr<ForkJoinState> state = std::make_shared<ForkJoinState>();
1170 state->Character = realmHolder;
1171 if (state->Login && state->Character)
1177 state->Login = holder;
1178 if (state->Login && state->Character)
1212 Field* fields = characterCountsResult->Fetch();
1215 }
while (characterCountsResult->NextRow());
1219 bnetConnected.
State = 1;
1237 TC_LOG_DEBUG(
"rbac",
"WorldSession::HasPermission [AccountId: {}, Name: {}, realmId: {}]",
1240 return hasPermission;
1245 TC_LOG_DEBUG(
"rbac",
"WorldSession::Invalidaterbac::RBACData [AccountId: {}, Name: {}, realmId: {}]",
1256 if (!maxPacketCounterAllowed)
1267 if (++packetCounter.
amountCounter <= maxPacketCounterAllowed)
1270 TC_LOG_WARN(
"network",
"AntiDOS: Account {}, IP: {}, Ping: {}, Character: {}, flooding packet (opc: {} (0x{:X}), count: {})",
1280 TC_LOG_WARN(
"network",
"AntiDOS: Player kicked!");
1288 std::string nameOrIp =
"";
1295 sWorld->BanAccount(bm, nameOrIp, duration,
"DOS (Packet Flooding/Spoofing",
"Server: AutoDOS");
1296 TC_LOG_WARN(
"network",
"AntiDOS: Player automatically banned for {} seconds.", duration);
1307 uint32 maxPacketCounterAllowed;
1406 maxPacketCounterAllowed = 0;
1420 maxPacketCounterAllowed = 200;
1433 maxPacketCounterAllowed = 50;
1446 maxPacketCounterAllowed = 20;
1476 maxPacketCounterAllowed = 10;
1519 maxPacketCounterAllowed = 3;
1530 maxPacketCounterAllowed = 1;
1535 maxPacketCounterAllowed = 100;
1540 return maxPacketCounterAllowed;
1571 TC_LOG_WARN(
"misc",
"The computed movement time using clockDelta is erronous. Using fallback instead");
1575 return uint32(movementTime);
std::array< uint8, SESSION_KEY_LENGTH > SessionKey
@ CHAR_UPD_ACCOUNT_ONLINE
@ CHAR_REP_PLAYER_ACCOUNT_DATA
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
std::chrono::minutes Minutes
Minutes shorthand typedef.
#define TC_LOG_WARN(filterType__,...)
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_TRACE(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
@ LOGIN_SEL_BNET_ITEM_FAVORITE_APPEARANCES
@ LOGIN_SEL_ACCOUNT_MOUNTS
@ LOGIN_SEL_BNET_CHARACTER_COUNTS_BY_ACCOUNT_ID
@ LOGIN_SEL_ACCOUNT_HEIRLOOMS
@ LOGIN_SEL_BNET_TRANSMOG_ILLUSIONS
@ LOGIN_SEL_BATTLE_PET_SLOTS
@ LOGIN_SEL_BNET_ITEM_APPEARANCES
#define TC_METRIC_DETAILED_TIMER(category,...)
#define TC_METRIC_VALUE(category, value,...)
#define TC_METRIC_EVENT(category, title, description)
#define TC_METRIC_TAG(name, value)
#define MAX_QUEST_LOG_SIZE
@ QUEST_FLAGS_FAIL_ON_LOGOUT
Role Based Access Control related classes definition.
uint32 urand(uint32 min, uint32 max)
constexpr BattlegroundQueueTypeId BATTLEGROUND_QUEUE_NONE
static constexpr uint8 PLAYER_MAX_BATTLEGROUND_QUEUES
@ EXPANSION_BATTLE_FOR_AZEROTH
#define MAX_ACCOUNT_TUTORIAL_VALUES
BanMode
Ban function modes.
@ SPELL_AURA_MOD_SHAPESHIFT
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
bool Initialize(uint32 accountId, uint32)
AccountInfoQueryHolderPerRealm()
bool Initialize(uint32 accountId, uint32 battlenetAccountId)
@ GLOBAL_REALM_CHARACTER_COUNTS
@ GLOBAL_ACCOUNT_HEIRLOOMS
@ ITEM_FAVORITE_APPEARANCES
T & AddCallback(T &&query)
void ProcessReadyCallbacks()
void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)
char const * what() const noexcept override
void print_storage() const
PacketProcessing ProcessingPlace
virtual void Call(WorldSession *session, WorldPacket &packet) const =0
Class used to access individual fields of database query result.
std::string GetString() const
void add(const T &item)
Adds an item to the queue.
void readd(Iterator begin, Iterator end)
Adds items back to front of the queue.
bool next(T &result)
Gets the next result in the queue, if any.
virtual bool Process(WorldPacket *packet) override
LowType GetCounter() const
static ObjectGuid const Empty
std::string ToString() const
static ObjectGuid GetGUID(Object const *o)
void SetDestroyedObject(bool destroyed)
virtual bool ProcessUnsafe() const
WorldSession *const m_pSession
bool IsBeingTeleportedFar() const
void SetInvSlot(uint32 slot, ObjectGuid guid)
void FailQuestsWithFlag(QuestFlags flag)
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={})
void CleanupsBeforeDelete(bool finalCleanup=true) override
uint32 GetDeathTimer() const
ObjectGuid const & GetLootGUID() const
bool HasPendingBind() const
void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val)
void ClearWhisperWhiteList()
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
Battleground * GetBattleground() const
ObjectGuid::LowType GetGuildId() const
bool IsGameMaster() const
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
uint32 GetXPForNextLevel() const
void SaveToDB(bool create=false)
void SetBuybackTimestamp(uint32 slot, time_t timestamp)
Group * GetGroup(Optional< uint8 > partyIndex)
void SetBuybackPrice(uint32 slot, uint32 price)
BattlegroundQueueTypeId GetBattlegroundQueueTypeId(uint32 index) const
void setInt32(const uint8 index, const int32 value)
void setUInt8(const uint8 index, const uint8 value)
void setInt64(const uint8 index, const int64 value)
void setUInt32(const uint8 index, const uint32 value)
void setString(const uint8 index, const std::string &value)
void setUInt64(const uint8 index, const uint64 value)
void SetSize(size_t size)
PreparedQueryResult GetPreparedResult(size_t index) const
void AfterComplete(std::function< void(SQLQueryHolderBase const &)> callback) &
bool SetPreparedQuery(size_t index, PreparedStatement< T > *stmt)
ConnectionType ConnectionIndex
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
bool HasAuraType(AuraType auraType) const
std::string const & GetName() const
ConnectionType GetConnection() const
WorldPacket const * Write() override
WorldPacket const * Write() override
Array< std::string, MAX_PREFIXES > Prefixes
std::array< Timestamp<>, NUM_ACCOUNT_DATA_TYPES > AccountTimes
WorldPacket const * Write() override
OpcodeClient GetOpcode() const
std::string const & GetInvalidValue() const
WorldPacket const * Write() override
WorldPacket const * Write() override
uint32 TutorialData[MAX_ACCOUNT_TUTORIAL_VALUES]
bool Process(WorldPacket *packet) override
bool EvaluateOpcode(WorldPacket &p, time_t time) const
uint32 GetMaxPacketCounterAllowed(uint16 opcode) const
DosProtection(WorldSession *s)
PacketThrottlingMap _PacketThrottlingMap
Player session in the World.
void HandleUnregisterAllAddonPrefixesOpcode(WorldPackets::Chat::ChatUnregisterAllAddonPrefixes &packet)
void SetPlayer(Player *player)
bool m_playerRecentlyLogout
bool Update(uint32 diff, PacketFilter &updater)
Update the WorldSession (triggered by World update)
void LogoutPlayer(bool save)
Log the player out
AccountData _accountData[NUM_ACCOUNT_DATA_TYPES]
char const * GetTrinityString(uint32 entry) const
void LoadTutorialsData(PreparedQueryResult result)
void SendClientCacheVersion(uint32 version)
void SendConnectToInstance(WorldPackets::Auth::ConnectToSerial serial)
void HandleMoveWorldportAck()
void SendNotification(char const *format,...) ATTR_PRINTF(2
bool CanAccessAlliedRaces() const
AsyncCallbackProcessor< SQLQueryHolderCallback > _queryHolderProcessor
void SendAuthResponse(uint32 code, bool queued, uint32 queuePos=0)
QueryCallbackProcessor _queryProcessor
uint32 _tutorials[MAX_ACCOUNT_TUTORIAL_VALUES]
AccountTypes GetSecurity() const
LocaleConstant GetSessionDbLocaleIndex() const
bool PlayerDisconnected() const
int64 _timeSyncClockDelta
bool DisallowHyperlinksAndMaybeKick(std::string const &str)
std::map< uint32, uint32 > _pendingTimeSyncRequests
uint32 AdjustClientMovementTime(uint32 time) const
void QueuePacket(WorldPacket *new_packet)
Add an incoming packet to the queue.
class WorldSession::DosProtection AntiDOS
void LoadAccountData(PreparedQueryResult result, uint32 mask)
std::atomic< time_t > m_timeOutTime
void InitWarden(SessionKey const &k)
std::unordered_map< uint32, uint8 > _realmCharacterCounts
std::string GetPlayerInfo() const
void KickPlayer(std::string const &reason)
Kick a player out of the World.
Player * GetPlayer() const
rbac::RBACData * _RBACData
std::unique_ptr< CollectionMgr > _collectionMgr
void SendAuthWaitQueue(uint32 position)
Handle the authentication waiting queue (to be completed)
void Handle_EarlyProccess(WorldPackets::Null &null)
~WorldSession()
WorldSession destructor.
void SetLogoutStartTime(time_t requestTime)
Engage the logout process for the user.
void SendSetTimeZoneInformation()
void LogUnexpectedOpcode(WorldPacket *packet, char const *status, const char *reason)
Logging helper for unexpected opcodes.
AccountData const * GetAccountData(AccountDataType type) const
TransactionCallback & AddTransactionCallback(TransactionCallback &&callback)
uint32 _timeSyncNextCounter
void Handle_NULL(WorldPackets::Null &null)
ObjectGuid m_playerLoading
SQLQueryHolderCallback & AddQueryHolderCallback(SQLQueryHolderCallback &&callback)
QueryCallback LoadPermissionsAsync()
std::string const & GetRemoteAddress() const
void SetInQueue(bool state)
Session in auth.queue currently.
ObjectGuid::LowType m_GUIDLow
bool HasPermission(uint32 permissionId)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
uint32 GetBattlenetAccountId() const
uint32 GetAccountId() const
uint8 GetAccountExpansion() const
ConnectToKey _instanceConnectKey
uint32 GetLatency() const
void ProcessQueryCallbacks()
std::shared_ptr< WorldSocket > m_Socket[MAX_CONNECTION_TYPES]
void InitializeSessionCallback(LoginDatabaseQueryHolder const &holder, CharacterDatabaseQueryHolder const &realmHolder)
void HandleAddonRegisteredPrefixesOpcode(WorldPackets::Chat::ChatRegisterAddonPrefixes &packet)
std::vector< std::string > _registeredAddonPrefixes
void SendAccountDataTimes(ObjectGuid playerGuid, uint32 mask)
bool IsAddonRegistered(std::string_view prefix) const
void SaveTutorialsData(CharacterDatabaseTransaction trans)
WorldSession(uint32 id, std::string &&name, uint32 battlenetAccountId, std::shared_ptr< WorldSocket > sock, AccountTypes sec, uint8 expansion, time_t mute_time, std::string os, Minutes timezoneOffset, LocaleConstant locale, uint32 recruiter, bool isARecruiter)
WorldSession constructor.
LockedQueue< WorldPacket * > _recvQueue
std::string const & GetPlayerName() const
std::unique_ptr< Warden > _warden
void ResetTimeOutTime(bool onlyActive)
void InvalidateRBACData()
void SetAccountData(AccountDataType type, time_t time, std::string const &data)
void SendFeatureSystemStatusGlueScreen()
void LogUnprocessedTail(WorldPacket const *packet)
Logging helper for unexpected opcodes.
bool ShouldLogOut(time_t currTime) const
Is logout cooldown expired?
bool ValidateHyperlinksAndMaybeKick(std::string const &str)
AsyncCallbackProcessor< TransactionCallback > _transactionCallbacks
void SendAvailableHotfixes()
rbac::RBACData * GetRBACData()
bool IsConnectionIdle() const
std::unique_ptr< BattlePets::BattlePetMgr > _battlePetMgr
bool _filterAddonMessages
uint32 GetId() const
Gets the Id of the Object.
QueryCallback LoadFromDBAsync()
std::string const & GetName() const
Gets the Name of the Object.
void LoadFromDB()
Loads all permissions assigned to current account.
bool HasPermission(uint32 permission) const
std::string GetOpcodeNameForLogging(OpcodeClient opcode)
Lookup opcode name for human understandable logging.
bool IsInstanceOnlyOpcode(uint32 opcode)
#define GLOBAL_CACHE_MASK
#define NUM_ACCOUNT_DATA_TYPES
@ CONNECTION_TYPE_INSTANCE
@ CONNECTION_TYPE_DEFAULT
@ CMSG_TIME_SYNC_RESPONSE
@ CMSG_CALENDAR_ADD_EVENT
@ CMSG_CHAT_MESSAGE_WHISPER
@ CMSG_GUILD_SET_RANK_PERMISSIONS
@ CMSG_CHAT_ADDON_MESSAGE_TARGETED
@ CMSG_CHAT_MESSAGE_EMOTE
@ CMSG_REQUEST_VEHICLE_SWITCH_SEAT
@ CMSG_CHAT_MESSAGE_CHANNEL
@ CMSG_QUEST_CONFIRM_ACCEPT
@ CMSG_DELETE_EQUIPMENT_SET
@ CMSG_GUILD_BANK_DEPOSIT_MONEY
@ CMSG_SUBMIT_USER_FEEDBACK
@ CMSG_CHAT_MESSAGE_GUILD
@ CMSG_GUILD_SET_GUILD_MASTER
@ CMSG_GUILD_BANK_WITHDRAW_MONEY
@ CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK
@ CMSG_CALENDAR_REMOVE_INVITE
@ CMSG_SET_ACTION_BAR_TOGGLES
@ CMSG_CALENDAR_EVENT_SIGN_UP
@ CMSG_SAVE_EQUIPMENT_SET
@ CMSG_MOVE_DISMISS_VEHICLE
@ CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT
@ CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK
@ CMSG_QUEST_GIVER_QUERY_QUEST
@ CMSG_COMPLETE_CINEMATIC
@ CMSG_QUEST_GIVER_REQUEST_REWARD
@ CMSG_REQUEST_VEHICLE_NEXT_SEAT
@ CMSG_REQUEST_VEHICLE_PREV_SEAT
@ CMSG_REQUEST_VEHICLE_EXIT
@ CMSG_SET_ASSISTANT_LEADER
@ CMSG_CHAT_MESSAGE_RAID_WARNING
@ CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK
@ CMSG_ACCEPT_GUILD_INVITE
@ CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK
@ CMSG_AUTOSTORE_BANK_ITEM
@ CMSG_QUEST_GIVER_COMPLETE_QUEST
@ CMSG_CHAR_RACE_OR_FACTION_CHANGE
@ CMSG_STAND_STATE_CHANGE
@ CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT
@ CMSG_CONFIRM_RESPEC_WIPE
@ CMSG_CHARACTER_RENAME_REQUEST
@ CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK
@ CMSG_CALENDAR_COPY_EVENT
@ CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK
@ CMSG_QUERY_INSPECT_ACHIEVEMENTS
@ CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK
@ CMSG_CALENDAR_MODERATOR_STATUS
@ CMSG_TAXI_NODE_STATUS_QUERY
@ CMSG_QUEST_GIVER_CHOOSE_REWARD
@ CMSG_GUILD_UPDATE_MOTD_TEXT
@ CMSG_GUILD_DECLINE_INVITATION
@ CMSG_RIDE_VEHICLE_INTERACT
@ CMSG_MOVE_CHANGE_VEHICLE_SEATS
@ CMSG_GET_ITEM_PURCHASE_DATA
@ CMSG_QUEST_GIVER_ACCEPT_QUEST
@ CMSG_GAME_OBJ_REPORT_USE
@ CMSG_SET_DUNGEON_DIFFICULTY
@ CMSG_GUILD_BANK_LOG_QUERY
@ CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK
@ CMSG_QUEST_GIVER_STATUS_QUERY
@ CMSG_AREA_SPIRIT_HEALER_QUERY
@ CMSG_SET_PARTY_ASSIGNMENT
@ CMSG_GUILD_BANK_TEXT_QUERY
@ CMSG_TAXI_QUERY_AVAILABLE_NODES
@ CMSG_QUEST_LOG_REMOVE_QUEST
@ CMSG_QUERY_NEXT_MAIL_TIME
@ CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY
@ CMSG_GUILD_EVENT_LOG_QUERY
@ CMSG_CHAT_ADDON_MESSAGE
@ CMSG_CHAT_MESSAGE_OFFICER
@ CMSG_PARTY_INVITE_RESPONSE
@ CMSG_SET_RAID_DIFFICULTY
@ CMSG_MOVE_SET_FACING_HEARTBEAT
@ CMSG_GUILD_BANK_SET_TAB_TEXT
@ CMSG_PETITION_RENAME_GUILD
@ CMSG_BATTLEMASTER_JOIN_ARENA
@ CMSG_GUILD_INVITE_BY_NAME
@ CMSG_HEARTH_AND_RESURRECT
@ CMSG_GUILD_UPDATE_INFO_TEXT
@ CMSG_CALENDAR_UPDATE_EVENT
@ CMSG_CHAT_MESSAGE_PARTY
@ CMSG_GUILD_SET_MEMBER_NOTE
@ CMSG_ITEM_PURCHASE_REFUND
@ CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT
@ CMSG_QUERY_PLAYER_NAMES
@ CMSG_CALENDAR_REMOVE_EVENT
@ CMSG_UPDATE_RAID_TARGET
@ CMSG_REPORT_PVP_PLAYER_AFK
@ CMSG_GUILD_BANK_BUY_TAB
@ CMSG_QUERY_CORPSE_TRANSPORT
@ CMSG_GUILD_BANK_QUERY_TAB
@ CMSG_REQUEST_PARTY_MEMBER_STATS
@ CMSG_GUILD_BANK_UPDATE_TAB
@ CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK
@ TUTORIALS_FLAG_LOADED_FROM_DB
@ STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT
@ CONFIG_SOCKET_TIMEOUTTIME
@ CONFIG_CLIENTCACHE_VERSION
@ CONFIG_PACKET_SPOOF_BANDURATION
@ CONFIG_SOCKET_TIMEOUTTIME_ACTIVE
@ CONFIG_PACKET_SPOOF_POLICY
@ CONFIG_CHAT_STRICT_LINK_CHECKING_KICK
@ CONFIG_PACKET_SPOOF_BANMODE
TC_GAME_API bool GetName(uint32 accountId, std::string &name)
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
bool TC_GAME_API CheckAllLinks(std::string_view str)
std::string ToString(Type &&val, Params &&... params)
@ RBAC_PERM_IGNORE_IDLE_CONNECTION
boost::asio::ip::address GetAddressForClient(boost::asio::ip::address const &clientAddr) const
Battlenet::RealmHandle Id
std::array< uint8, 4 > V4
std::array< uint8, 16 > V6
union WorldPackets::Auth::ConnectTo::SocketAddress::@324 Address
struct WorldSession::ConnectToKey::@330 Fields