60#include <boost/circular_buffer.hpp>
65std::string
const DefaultPlayerName =
"<none>";
115 m_muteTime(mute_time),
120 m_Socket(
std::move(sock)),
123 _accountName(
std::move(name)),
124 m_expansion(expansion),
127 m_playerLoading(false),
128 m_playerLogout(false),
129 m_playerRecentlyLogout(false),
131 m_sessionDbcLocale(
sWorld->GetAvailableDbcLocale(locale)),
132 m_sessionDbLocaleIndex(locale),
133 _timezoneOffset(timezoneOffset),
136 recruiterId(recruiter),
137 isRecruiter(isARecruiter),
141 m_currentBankerGUID(),
143 _timeSyncClockDelta(0),
144 _pendingTimeSyncRequests(),
145 _timeSyncNextCounter(0),
147 _calendarEventCreationCooldown(0),
213 static uint64 sendPacketCount = 0;
214 static uint64 sendPacketBytes = 0;
216 static time_t firstTime = time(
nullptr);
217 static time_t lastTime = firstTime;
219 static uint64 sendLastPacketCount = 0;
220 static uint64 sendLastPacketBytes = 0;
222 time_t cur_time = time(
nullptr);
224 if ((cur_time - lastTime) < 60)
226 sendPacketCount += 1;
227 sendPacketBytes += packet->
size();
229 sendLastPacketCount += 1;
230 sendLastPacketBytes += packet->
size();
236 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));
237 TC_LOG_DEBUG(
"misc",
"Send last min packets count: {} bytes: {} avr.count/sec: {} avr.bytes/sec: {}", sendLastPacketCount, sendLastPacketBytes,
float(sendLastPacketCount)/minTime,
float(sendLastPacketBytes)/minTime);
240 sendLastPacketCount = 1;
241 sendLastPacketBytes = packet->
wpos();
260 TC_LOG_ERROR(
"network.opcode",
"Received unexpected opcode {} Status: {} Reason: {} from {}",
270 TC_LOG_TRACE(
"network.opcode",
"Unprocessed tail data (read stop at {} from {}) Opcode {} from {}",
288 bool deletePacket =
true;
289 std::vector<WorldPacket*> requeuePackets;
290 uint32 processedPackets = 0;
293 constexpr uint32 MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE = 100;
313 requeuePackets.push_back(packet);
314 deletePacket =
false;
315 TC_LOG_DEBUG(
"network",
"Re-enqueueing packet with opcode {} with with status STATUS_LOGGEDIN. "
324 opHandle->
Call(
this, *packet);
328 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
335 "the player has not logged in yet and not recently logout");
340 opHandle->
Call(
this, *packet);
344 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
354 opHandle->
Call(
this, *packet);
358 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
376 opHandle->
Call(
this, *packet);
380 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
398 KickPlayer(
"WorldSession::Update Invalid chat link");
406 KickPlayer(
"WorldSession::Update Illegal chat link");
410 TC_LOG_ERROR(
"network",
"PacketArrayMaxCapacityException: {} while parsing {} from {}.",
415 TC_LOG_ERROR(
"network",
"WorldSession::Update ByteBufferException occured while parsing a packet (opcode: {}) from client {}, accountid={}. Skipped packet.",
429 if (processedPackets > MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE)
521 bg->EventPlayerLoggedOut(
_player);
552 guild->HandleMemberLogout(
this);
585 group->ResetMaxEnchantingLevel();
587 group->StartLeaderOfflineTimer();
604 TC_LOG_INFO(
"entities.player.character",
"Account: {} (IP: {}) Logout Character:[{}] {} Level: {}, XP: {}/{} ({} left)",
608 _map->RemovePlayerFromMap(
_player,
true);
615 TC_LOG_DEBUG(
"network",
"SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
647 TC_LOG_ERROR(
"network",
"Player {}{} sent a message with an invalid link:\n{}",
GetPlayer()->GetName(),
651 KickPlayer(
"WorldSession::ValidateHyperlinksAndMaybeKick Invalid chat link");
658 if (str.find(
'|') == std::string::npos)
661 TC_LOG_ERROR(
"network",
"Player {} {} sent a message which illegally contained a hyperlink:\n{}",
GetPlayer()->GetName(),
665 KickPlayer(
"WorldSession::DisallowHyperlinksAndMaybeKick Illegal chat link");
677 va_start(ap, format);
678 vsnprintf(szStr, 1024, format, ap);
695 va_start(ap, string_id);
696 vsnprintf(szStr, 1024, format, ap);
719 else if (!onlyActive)
735 TC_LOG_ERROR(
"network.opcode",
"Received opcode {} that must be processed in WorldSocket::ReadDataHandler from {}"
741 TC_LOG_ERROR(
"network.opcode",
"Received server-side opcode {} from {}"
747 TC_LOG_ERROR(
"network.opcode",
"Received deprecated opcode {} from {}"
763 packet <<
uint32(position);
780 Field* fields = result->Fetch();
784 TC_LOG_ERROR(
"misc",
"Table `{}` have invalid account data type ({}), ignore.",
789 if ((mask & (1 << type)) == 0)
791 TC_LOG_ERROR(
"misc",
"Table `{}` have non appropriate for table account data type ({}), ignore.",
799 while (result->NextRow());
879 if (!hasTutorialsInDB)
893 Field* fields = result->Fetch();
894 SystemTimePoint restrictionExpireTime = SystemTimePoint::clock::from_time_t(fields[1].GetUInt64());
895 if (restrictionExpireTime > now)
897 }
while (result->NextRow());
914 stmt->
setUInt64(2, SystemTimePoint::clock::to_time_t(restrictionExpireTime));
941 return value.second < now;
950 TC_LOG_ERROR(
"entities.unit",
"WorldSession::ReadMovementInfo: mi->guid is empty, opcode {}",
static_cast<uint32>(data.
GetOpcode()));
977 TC_LOG_DEBUG(
"addon",
"WorldSession::ReadAddonsInfo: AddOnInfo too big, size {}", size);
998 uint32 publicKeyCrc, urlCrc;
1000 addonInfo >> addon.Name >> addon.HasKey;
1001 addonInfo >> publicKeyCrc >> urlCrc;
1003 TC_LOG_DEBUG(
"addon",
"AddOn: {} (CRC: 0x{:x}) - has key: 0x{:x} - URL CRC: 0x{:x}", addon.Name, publicKeyCrc, addon.HasKey, urlCrc);
1007 if (publicKeyCrc != savedAddon->CRC)
1012 TC_LOG_WARN(
"addon",
" Addon: {}: modified (CRC: 0x{:x}) - accountID {})", addon.Name, savedAddon->CRC,
GetAccountId());
1020 TC_LOG_DEBUG(
"addon",
"Addon: {}: validated (CRC: 0x{:x}) - accountID {}", addon.Name, savedAddon->CRC,
GetAccountId());
1026 TC_LOG_WARN(
"addon",
"Addon: {}: not registered as known secure addon - accountId {}", addon.Name,
GetAccountId());
1030 addonInfo.
rpos(addonInfo.
size() - 4);
1041 TC_LOG_DEBUG(
"addon",
"AddOn: Addon packet uncompress error!");
1049 if (!bannedAddons->empty() && bannedAddons->back().Timestamp < lastBannedAddOnTimestamp)
1050 lastBannedAddOnTimestamp = 0;
1052 auto itr = std::ranges::lower_bound(*bannedAddons, lastBannedAddOnTimestamp, std::ranges::less(), &
BannedAddon::Timestamp);
1090 _warden = std::make_unique<WardenWin>();
1093 else if (os ==
"OSX")
1115 TC_LOG_DEBUG(
"rbac",
"WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]",
1158 std::shared_ptr<AccountInfoQueryHolderPerRealm> realmHolder = std::make_shared<AccountInfoQueryHolderPerRealm>();
1201 TC_LOG_DEBUG(
"rbac",
"WorldSession::HasPermission [AccountId: {}, Name: {}, realmId: {}]",
1204 return hasPermission;
1209 TC_LOG_DEBUG(
"rbac",
"WorldSession::Invalidaterbac::RBACData [AccountId: {}, Name: {}, realmId: {}]",
1220 if (!maxPacketCounterAllowed)
1231 if (++packetCounter.
amountCounter <= maxPacketCounterAllowed)
1234 TC_LOG_WARN(
"network",
"AntiDOS: Account {}, IP: {}, Ping: {}, Character: {}, flooding packet (opc: {} (0x{:X}), count: {})",
1244 TC_LOG_WARN(
"network",
"AntiDOS: Player kicked!");
1252 std::string nameOrIp =
"";
1259 sWorld->BanAccount(bm, nameOrIp, duration,
"DOS (Packet Flooding/Spoofing",
"Server: AutoDOS");
1260 TC_LOG_WARN(
"network",
"AntiDOS: Player automatically banned for {} seconds.", duration);
1271 uint32 maxPacketCounterAllowed;
1367 maxPacketCounterAllowed = 0;
1383 maxPacketCounterAllowed = 200;
1397 maxPacketCounterAllowed = 50;
1412 maxPacketCounterAllowed = 20;
1444 maxPacketCounterAllowed = 10;
1495 maxPacketCounterAllowed = 3;
1506 maxPacketCounterAllowed = 100;
1511 return maxPacketCounterAllowed;
std::array< uint8, SESSION_KEY_LENGTH > SessionKey
@ BG_DESERTION_TYPE_INVITE_LOGOUT
CharacterDatabaseStatements
@ CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES
@ CHAR_UPD_ACCOUNT_ONLINE
@ CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES
@ CHAR_REP_PLAYER_ACCOUNT_DATA
@ CHAR_INS_DESERTER_TRACK
@ CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES
#define MAX_ACCOUNT_TUTORIAL_VALUES
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::system_clock::time_point SystemTimePoint
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__,...)
#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
constexpr BattlegroundQueueTypeId BATTLEGROUND_QUEUE_NONE
#define PLAYER_MAX_BATTLEGROUND_QUEUES
BanMode
Ban function modes.
@ SPELL_AURA_MOD_SHAPESHIFT
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
@ PLAYER_FIELD_BUYBACK_PRICE_1
@ PLAYER_FIELD_VENDORBUYBACK_SLOT_1
@ PLAYER_FIELD_BUYBACK_TIMESTAMP_1
bool Initialize(uint32 accountId)
AccountInfoQueryHolderPerRealm()
T & AddCallback(T &&query)
void ProcessReadyCallbacks()
void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)
char const * what() const noexcept override
void resize(size_t newsize)
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
PackedGuidWriter WriteAsPacked() const
std::string ToString() const
void SetGuidValue(uint16 index, ObjectGuid value)
static ObjectGuid GetGUID(Object const *o)
void SetUInt32Value(uint16 index, uint32 value)
virtual bool ProcessUnsafe() const
WorldSession *const m_pSession
bool IsBeingTeleportedFar() const
void CleanupsBeforeDelete(bool finalCleanup=true) override
bool IsInvitedForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const
uint32 GetDeathTimer() const
bool HasPendingBind() const
void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val)
ObjectGuid GetLootGUID() const
void ClearWhisperWhiteList()
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
Battleground * GetBattleground() const
ObjectGuid::LowType GetGuildId() const
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
uint32 GetXPForNextLevel() const
void SaveToDB(bool create=false)
BattlegroundQueueTypeId GetBattlegroundQueueTypeId(uint32 index) const
void setUInt32(uint8 index, uint32 value)
void setUInt64(uint8 index, uint64 value)
void setUInt8(uint8 index, uint8 value)
void setString(uint8 index, std::string const &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)
bool HasAuraType(AuraType auraType) const
void CombatStop(bool includingCast=false, bool mutualPvP=true)
std::string const & GetName() const
WorldPacket const * Write() override
std::span< BannedAddon const > BannedAddons
std::span< SecureAddonInfo const > Addons
std::string const & GetInvalidValue() const
virtual 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 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 * GetAccountData(AccountDataType type)
char const * GetTrinityString(uint32 entry) const
void LoadTutorialsData(PreparedQueryResult result)
void UpdateInstanceEnterTimes()
Unit * ValidateAndGetUnitBeingMoved(ObjectGuid guid, bool forStatusAck) const
void SendClientCacheVersion(uint32 version)
void HandleMoveWorldportAck()
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
AsyncCallbackProcessor< SQLQueryHolderCallback > _queryHolderProcessor
void SendNotification(const char *format,...) ATTR_PRINTF(2
static void WriteMovementInfo(WorldPacket *data, MovementInfo *mi)
QueryCallbackProcessor _queryProcessor
void InitWarden(SessionKey const &k, std::string const &os)
AccountTypes GetSecurity() const
LocaleConstant GetSessionDbLocaleIndex() const
rbac::RBACData * GetRBACData() const
void ReadAddonsInfo(ByteBuffer &data)
std::shared_ptr< WorldSocket > m_Socket
bool DisallowHyperlinksAndMaybeKick(std::string const &str)
std::map< uint32, uint32 > _pendingTimeSyncRequests
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
std::string GetPlayerInfo() const
void KickPlayer(std::string const &reason)
Kick a player out of the World.
Player * GetPlayer() const
rbac::RBACData * _RBACData
void Handle_NULL(WorldPacket &recvPacket)
void SendAuthWaitQueue(uint32 position)
Handle the authentication waiting queue (to be completed)
~WorldSession()
WorldSession destructor.
void SetLogoutStartTime(time_t requestTime)
Engage the logout process for the user.
WorldSession(uint32 id, std::string &&name, std::shared_ptr< WorldSocket > sock, AccountTypes sec, uint8 expansion, time_t mute_time, Minutes timezoneOffset, LocaleConstant locale, uint32 recruiter, bool isARecruiter)
WorldSession constructor.
void LogUnexpectedOpcode(WorldPacket *packet, char const *status, const char *reason)
Logging helper for unexpected opcodes.
void Handle_EarlyProccess(WorldPacket &recvPacket)
bool ValidateMovementInfo(Unit const *mover, MovementInfo *mi) const
TransactionCallback & AddTransactionCallback(TransactionCallback &&callback)
void InitializeSessionCallback(CharacterDatabaseQueryHolder const &realmHolder)
uint32 _timeSyncNextCounter
SQLQueryHolderCallback & AddQueryHolderCallback(SQLQueryHolderCallback &&callback)
QueryCallback LoadPermissionsAsync()
void SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans)
std::string const & GetRemoteAddress() const
void SetInQueue(bool state)
Session in auth.queue currently.
struct WorldSession::Addons _addons
ObjectGuid::LowType m_GUIDLow
void Handle_Deprecated(WorldPacket &recvPacket)
AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES]
bool HasPermission(uint32 permissionId)
void LoadInstanceTimeRestrictions(PreparedQueryResult result)
uint32 GetAccountId() const
void ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
std::unordered_map< uint32, SystemTimePoint > _instanceResetTimes
bool UpdateAndCheckInstanceCount(uint32 instanceId)
void LogUnprocessedTail(WorldPacket *packet)
Logging helper for unexpected opcodes.
void DoLootRelease(ObjectGuid lguid)
uint32 GetLatency() const
void ProcessQueryCallbacks()
void Handle_ServerSide(WorldPacket &recvPacket)
void SendAccountDataTimes(uint32 mask)
void SaveTutorialsData(CharacterDatabaseTransaction trans)
LockedQueue< WorldPacket * > _recvQueue
std::string const & GetPlayerName() const
std::unique_ptr< Warden > _warden
void ResetTimeOutTime(bool onlyActive)
void InvalidateRBACData()
uint32 m_Tutorials[MAX_ACCOUNT_TUTORIAL_VALUES]
bool ShouldLogOut(time_t currTime) const
Is logout cooldown expired?
bool ValidateHyperlinksAndMaybeKick(std::string const &str)
AsyncCallbackProcessor< TransactionCallback > _transactionCallbacks
void SendAuthResponse(uint8 code, bool shortForm, uint32 queuePos=0)
void SetAccountData(AccountDataType type, time_t tm, std::string const &data)
bool IsConnectionIdle() const
void AddInstanceEnterTime(uint32 instanceId, SystemTimePoint enterTime)
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(Opcodes opcode)
Lookup opcode name for human understandable logging.
#define GLOBAL_CACHE_MASK
#define NUM_ACCOUNT_DATA_TYPES
@ CMSG_QUESTGIVER_QUERY_QUEST
@ CMSG_CALENDAR_EVENT_MODERATOR_STATUS
@ CMSG_LEARN_PREVIEW_TALENTS
@ CMSG_CALENDAR_ADD_EVENT
@ CMSG_CALENDAR_EVENT_REMOVE_INVITE
@ CMSG_SET_GUILD_BANK_TEXT
@ CMSG_ARENA_TEAM_DISBAND
@ CMSG_REQUEST_VEHICLE_SWITCH_SEAT
@ CMSG_QUESTGIVER_STATUS_QUERY
@ SMSG_ACCOUNT_DATA_TIMES
@ CMSG_QUEST_CONFIRM_ACCEPT
@ CMSG_FORCE_PITCH_RATE_CHANGE_ACK
@ CMSG_QUESTGIVER_COMPLETE_QUEST
@ CMSG_CALENDAR_EVENT_INVITE
@ CMSG_ACTIVATETAXIEXPRESS
@ CMSG_GUILD_BANK_DEPOSIT_MONEY
@ CMSG_GUILD_BANK_WITHDRAW_MONEY
@ MSG_QUERY_GUILD_BANK_TEXT
@ CMSG_GAMEOBJ_REPORT_USE
@ CMSG_COMPLETE_CINEMATIC
@ CMSG_REQUEST_VEHICLE_NEXT_SEAT
@ CMSG_GROUP_ASSISTANT_LEADER
@ CMSG_QUESTGIVER_ACCEPT_QUEST
@ CMSG_REQUEST_VEHICLE_PREV_SEAT
@ CMSG_REQUEST_VEHICLE_EXIT
@ CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK
@ MSG_TALENT_WIPE_CONFIRM
@ CMSG_FORCE_TURN_RATE_CHANGE_ACK
@ MSG_SET_RAID_DIFFICULTY
@ CMSG_GMRESPONSE_RESOLVE
@ CMSG_CONTROLLER_EJECT_PASSENGER
@ CMSG_DELETEEQUIPMENT_SET
@ CMSG_EQUIPMENT_SET_SAVE
@ CMSG_GUILD_SET_OFFICER_NOTE
@ CMSG_CALENDAR_EVENT_SIGNUP
@ CMSG_AUTOSTORE_BANK_ITEM
@ CMSG_GROUP_CHANGE_SUB_GROUP
@ MSG_GUILD_BANK_LOG_QUERY
@ CMSG_CALENDAR_GET_CALENDAR
@ CMSG_LEARN_PREVIEW_TALENTS_PET
@ CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK
@ CMSG_CALENDAR_COPY_EVENT
@ CMSG_FORCE_SWIM_SPEED_CHANGE_ACK
@ CMSG_GMTICKET_UPDATETEXT
@ CMSG_QUERY_INSPECT_ACHIEVEMENTS
@ CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY
@ CMSG_CALENDAR_EVENT_RSVP
@ CMSG_TAXINODE_STATUS_QUERY
@ CMSG_GMTICKET_DELETETICKET
@ CMSG_QUESTGIVER_REQUEST_REWARD
@ CMSG_GROUP_UNINVITE_GUID
@ CMSG_AREA_SPIRIT_HEALER_QUERY
@ CMSG_DISMISS_CONTROLLED_VEHICLE
@ CMSG_TAXIQUERYAVAILABLENODES
@ CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE
@ CMSG_QUESTLOG_REMOVE_QUEST
@ CMSG_FORCE_RUN_SPEED_CHANGE_ACK
@ CMSG_GROUP_RAID_CONVERT
@ CMSG_READY_FOR_ACCOUNT_DATA_TIMES
@ CMSG_BATTLEMASTER_JOIN_ARENA
@ CMSG_HEARTH_AND_RESURRECT
@ CMSG_CORPSE_MAP_POSITION_QUERY
@ CMSG_CALENDAR_UPDATE_EVENT
@ MSG_SET_DUNGEON_DIFFICULTY
@ CMSG_GUILD_SET_PUBLIC_NOTE
@ MSG_GUILD_EVENT_LOG_QUERY
@ MSG_QUERY_NEXT_MAIL_TIME
@ CMSG_QUESTGIVER_CHOOSE_REWARD
@ CMSG_FORCE_WALK_SPEED_CHANGE_ACK
@ CMSG_ARENA_TEAM_DECLINE
@ CMSG_CALENDAR_REMOVE_EVENT
@ CMSG_QUERY_QUESTS_COMPLETED
@ CMSG_CHAR_FACTION_CHANGE
@ CMSG_GUILD_BANK_BUY_TAB
@ CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK
@ CMSG_GUILD_BANK_QUERY_TAB
@ CMSG_PLAYER_VEHICLE_ENTER
@ CMSG_REQUEST_PARTY_MEMBER_STATS
@ CMSG_GUILD_BANK_UPDATE_TAB
@ CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK
@ TUTORIALS_FLAG_LOADED_FROM_DB
@ STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT
@ CONFIG_MAX_INSTANCES_PER_HOUR
@ 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
@ CONFIG_BATTLEGROUND_TRACK_DESERTERS
std::vector< BannedAddon > BannedAddonList
SavedAddon const * GetAddonInfo(const std::string &name)
BannedAddonList const * GetBannedAddons()
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
void EraseIf(Container &c, Predicate p)
bool TC_GAME_API CheckAllLinks(std::string_view str)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
@ RBAC_PERM_IGNORE_IDLE_CONNECTION
uint32 LastBannedAddOnTimestamp
static uint32 constexpr MaxSecureAddons
std::vector< SecureAddonInfo > SecureAddons