55#include <boost/circular_buffer.hpp>
59std::string
const DefaultPlayerName =
"<none>";
109 m_muteTime(mute_time),
116 _accountName(
std::move(name)),
117 _battlenetAccountId(battlenetAccountId),
118 m_accountExpansion(expansion),
122 _clientBuildVariant(clientBuildVariant),
124 _battlenetRequestToken(0),
127 m_playerLogout(false),
128 m_playerRecentlyLogout(false),
130 m_sessionDbcLocale(
sWorld->GetAvailableDbcLocale(locale)),
131 m_sessionDbLocaleIndex(locale),
132 _timezoneOffset(timezoneOffset),
136 _filterAddonMessages(false),
137 recruiterId(recruiter),
138 isRecruiter(isARecruiter),
143 _timeSyncClockDelta(0),
144 _pendingTimeSyncRequests(),
145 _timeSyncNextCounter(0),
147 _calendarEventCreationCooldown(0),
148 _battlePetMgr(
std::make_unique<
BattlePets::BattlePetMgr>(this)),
153 m_Address = sock->GetRemoteIpAddress().to_string();
170 for (
uint8 i = 0; i < 2; ++i)
260 static uint64 sendPacketCount = 0;
261 static uint64 sendPacketBytes = 0;
264 static time_t lastTime = firstTime;
266 static uint64 sendLastPacketCount = 0;
267 static uint64 sendLastPacketBytes = 0;
271 if ((cur_time - lastTime) < 60)
273 sendPacketCount += 1;
274 sendPacketBytes += packet->
size();
276 sendLastPacketCount += 1;
277 sendLastPacketBytes += packet->
size();
283 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));
284 TC_LOG_DEBUG(
"misc",
"Send last min packets count: {} bytes: {} avr.count/sec: {} avr.bytes/sec: {}", sendLastPacketCount, sendLastPacketBytes,
float(sendLastPacketCount)/minTime,
float(sendLastPacketBytes)/minTime);
287 sendLastPacketCount = 1;
288 sendLastPacketBytes = packet->
wpos();
295 m_Socket[conIdx]->SendPacket(*packet);
300 std::shared_ptr<WorldSocket> socket = sockRef.lock();
301 if (!socket || !socket->IsOpen())
307 socket->DelayedCloseSocket();
311 socket->SetWorldSession(session);
325 TC_LOG_ERROR(
"network.opcode",
"Received unexpected opcode {} Status: {} Reason: {} from {}",
335 TC_LOG_TRACE(
"network.opcode",
"Unprocessed tail data (read stop at {} from {}) Opcode {} from {}",
353 bool deletePacket =
true;
354 std::vector<WorldPacket*> requeuePackets;
355 uint32 processedPackets = 0;
358 constexpr uint32 MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE = 100;
378 requeuePackets.push_back(packet);
379 deletePacket =
false;
380 TC_LOG_DEBUG(
"network",
"Re-enqueueing packet with opcode {} with with status STATUS_LOGGEDIN. "
389 opHandle->
Call(
this, *packet);
392 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
399 "the player has not logged in yet and not recently logout");
404 opHandle->
Call(
this, *packet);
407 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
417 opHandle->
Call(
this, *packet);
420 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
438 opHandle->
Call(
this, *packet);
441 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
459 KickPlayer(
"WorldSession::Update Invalid chat link");
467 KickPlayer(
"WorldSession::Update Illegal chat link");
471 TC_LOG_ERROR(
"network",
"PacketArrayMaxCapacityException: {} while parsing {} from {}.",
476 TC_LOG_ERROR(
"network",
"WorldSession::Update ByteBufferException occured while parsing a packet (opcode: {}) from client {}, accountid={}. Skipped packet.",
490 if (processedPackets > MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE)
591 bg->EventPlayerLoggedOut(
_player);
617 guild->HandleMemberLogout(
this);
657 group->StartLeaderOfflineTimer();
675 TC_LOG_INFO(
"entities.player.character",
"Account: {} (IP: {}) Logout Character:[{}] {} Level: {}, XP: {}/{} ({} left)",
680 _map->RemovePlayerFromMap(
_player,
true);
687 TC_LOG_DEBUG(
"network",
"SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
713 for (
uint8 i = 0; i < 2; ++i)
732 KickPlayer(
"WorldSession::ValidateHyperlinksAndMaybeKick Invalid chat link");
739 if (str.find(
'|') == std::string::npos)
746 KickPlayer(
"WorldSession::DisallowHyperlinksAndMaybeKick Illegal chat link");
758 va_start(ap, format);
759 vsnprintf(szStr, 1024, format, ap);
774 va_start(ap, stringId);
775 vsnprintf(szStr, 1024, format, ap);
796 else if (!onlyActive)
812 TC_LOG_ERROR(
"network.opcode",
"Received opcode {} that must be processed in WorldSocket::ReadDataHandler from {}"
818 boost::system::error_code ignored_error;
819 boost::asio::ip::address instanceAddress;
820 if (std::shared_ptr<Realm const> currentRealm =
sRealmList->GetCurrentRealm())
821 instanceAddress = currentRealm->GetAddressForClient(Trinity::Net::make_address(
GetRemoteAddress(), ignored_error));
829 connectTo.
Serial = serial;
831 if (instanceAddress.is_v4())
839 boost::asio::ip::address_v6 v6 = instanceAddress.to_v6();
840 if (v6.is_loopback())
842 memcpy(connectTo.
Payload.
Where.
Address.
V4.data(), boost::asio::ip::address_v4::loopback().to_bytes().data(), 4);
845 else if (v6.is_v4_mapped())
847 memcpy(connectTo.
Payload.
Where.
Address.
V4.data(), Trinity::Net::make_address_v4(Trinity::Net::v4_mapped, v6).to_bytes().data(), 4);
872 Field* fields = result->Fetch();
876 TC_LOG_ERROR(
"misc",
"Table `{}` have invalid account data type ({}), ignore.",
881 if ((mask & (1 << type)) == 0)
883 TC_LOG_ERROR(
"misc",
"Table `{}` have non appropriate for table account data type ({}), ignore.",
891 while (result->NextRow());
969 if (!hasTutorialsInDB)
1040 _warden = std::make_unique<WardenWin>();
1043 else if (
_os ==
"Wn64")
1047 else if (
_os ==
"Mc64")
1058 TC_LOG_DEBUG(
"rbac",
"WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]",
1070 TC_LOG_DEBUG(
"rbac",
"WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]",
1178 std::shared_ptr<AccountInfoQueryHolderPerRealm> realmHolder = std::make_shared<AccountInfoQueryHolderPerRealm>();
1185 std::shared_ptr<AccountInfoQueryHolder> holder = std::make_shared<AccountInfoQueryHolder>();
1192 struct ForkJoinState
1194 std::shared_ptr<AccountInfoQueryHolderPerRealm>
Character;
1195 std::shared_ptr<AccountInfoQueryHolder>
Login;
1198 std::shared_ptr<ForkJoinState> state = std::make_shared<ForkJoinState>();
1202 state->Character = realmHolder;
1203 if (state->Login && state->Character)
1209 state->Login = holder;
1210 if (state->Login && state->Character)
1245 Field* fields = characterCountsResult->Fetch();
1248 }
while (characterCountsResult->NextRow());
1252 bnetConnected.
State = 1;
1270 TC_LOG_DEBUG(
"rbac",
"WorldSession::HasPermission [AccountId: {}, Name: {}, realmId: {}]",
1273 return hasPermission;
1278 TC_LOG_DEBUG(
"rbac",
"WorldSession::Invalidaterbac::RBACData [AccountId: {}, Name: {}, realmId: {}]",
1289 if (!maxPacketCounterAllowed)
1300 if (++packetCounter.
amountCounter <= maxPacketCounterAllowed)
1303 TC_LOG_WARN(
"network",
"AntiDOS: Account {}, IP: {}, Ping: {}, Character: {}, flooding packet (opc: {} (0x{:X}), count: {})",
1313 TC_LOG_WARN(
"network",
"AntiDOS: Player kicked!");
1321 std::string nameOrIp =
"";
1328 sWorld->BanAccount(bm, nameOrIp, duration,
"DOS (Packet Flooding/Spoofing",
"Server: AutoDOS");
1329 TC_LOG_WARN(
"network",
"AntiDOS: Player automatically banned for {} seconds.", duration);
1340 uint32 maxPacketCounterAllowed;
1439 maxPacketCounterAllowed = 0;
1453 maxPacketCounterAllowed = 200;
1466 maxPacketCounterAllowed = 50;
1479 maxPacketCounterAllowed = 20;
1509 maxPacketCounterAllowed = 10;
1552 maxPacketCounterAllowed = 3;
1563 maxPacketCounterAllowed = 1;
1568 maxPacketCounterAllowed = 100;
1573 return maxPacketCounterAllowed;
1609 TC_LOG_WARN(
"misc",
"The computed movement time using clockDelta is erronous. Using fallback instead");
1613 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_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_INFO(filterType__, message__,...)
#define TC_LOG_WARN(filterType__, message__,...)
#define TC_LOG_TRACE(filterType__, message__,...)
@ 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_BNET_WARBAND_SCENES
@ 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
Class used to access individual fields of database query result.
std::string GetString() const
void add(T const &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)
bool IsValid(OpcodeClient index) const
virtual bool ProcessUnsafe() const
WorldSession *const m_pSession
bool IsBeingTeleportedFar() const
void SetInvSlot(uint32 slot, ObjectGuid guid)
void FailQuestsWithFlag(QuestFlags flag)
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)
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
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 setString(uint8 index, std::string &&value)
void setUInt32(uint8 index, uint32 value)
void setInt64(uint8 index, int64 value)
void setUInt64(uint8 index, uint64 value)
void setInt32(uint8 index, int32 value)
void setUInt8(uint8 index, uint8 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)
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
std::array< uint32, MAX_ACCOUNT_TUTORIAL_VALUES > TutorialData
bool Process(WorldPacket *packet) override
bool EvaluateOpcode(WorldPacket &p, time_t time) const
uint32 GetMaxPacketCounterAllowed(uint32 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
std::array< uint32, MAX_ACCOUNT_TUTORIAL_VALUES > _tutorials
AccountTypes GetSecurity() const
LocaleConstant GetSessionDbLocaleIndex() const
bool PlayerDisconnected() const
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, uint32 build, ClientBuild::VariantId clientBuildVariant, LocaleConstant locale, uint32 recruiter, bool isARecruiter)
WorldSession constructor.
int64 _timeSyncClockDelta
bool DisallowHyperlinksAndMaybeKick(std::string const &str)
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
uint64 GetConnectToInstanceKey() const
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.
void RegisterTimeSync(uint32 counter)
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 HandleContinuePlayerLogin()
void SaveTutorialsData(CharacterDatabaseTransaction trans)
LockedQueue< WorldPacket * > _recvQueue
std::string const & GetPlayerName() const
std::unique_ptr< Warden > _warden
void ResetTimeOutTime(bool onlyActive)
void InvalidateRBACData()
static void AddInstanceConnection(WorldSession *session, std::weak_ptr< WorldSocket > sockRef, ConnectToKey key)
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
std::map< uint32, int64 > _pendingTimeSyncRequests
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
constexpr bool IsInstanceOnlyOpcode(uint32 opcode)
std::string GetOpcodeNameForLogging(OpcodeClient opcode)
Lookup opcode name for human understandable logging.
#define GLOBAL_CACHE_MASK
constexpr uint16 UNKNOWN_OPCODE
#define NUM_ACCOUNT_DATA_TYPES
@ CONNECTION_TYPE_INSTANCE
@ CONNECTION_TYPE_DEFAULT
@ TUTORIALS_FLAG_LOADED_FROM_DB
@ STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT
@ 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
@ 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)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
@ RBAC_PERM_IGNORE_IDLE_CONNECTION
PacketProcessing ProcessingPlace
ConnectionType ConnectionIndex
union WorldPackets::Auth::ConnectTo::SocketAddress::@314 Address
std::array< uint8, 4 > V4
std::array< uint8, 16 > V6
struct WorldSession::ConnectToKey::@320 Fields