55#include <boost/circular_buffer.hpp>
59std::string
const DefaultPlayerName =
"<none>";
108 std::shared_ptr<WorldSocket>&& sock,
AccountTypes sec,
uint8 expansion, time_t mute_time, std::string&& os,
Minutes timezoneOffset,
110 m_muteTime(mute_time),
115 m_Socket({ std::move(sock),
nullptr }),
118 _accountName(std::move(name)),
119 _battlenetAccount(
new Battlenet::Account(
this, ObjectGuid::Create<HighGuid::BNetAccount>(battlenetAccountId), std::move(battlenetAccountEmail))),
120 m_accountExpansion(expansion),
124 _clientBuildVariant(clientBuildVariant),
126 _battlenetRequestToken(0),
129 m_playerLogout(
false),
130 m_playerRecentlyLogout(
false),
132 m_sessionDbcLocale(
sWorld->GetAvailableDbcLocale(locale)),
133 m_sessionDbLocaleIndex(locale),
134 _timezoneOffset(timezoneOffset),
138 _filterAddonMessages(
false),
139 recruiterId(recruiter),
140 isRecruiter(isARecruiter),
144 _timeSyncClockDeltaQueue(std::make_unique<boost::circular_buffer<std::pair<int64, uint32>>>(6)),
145 _timeSyncClockDelta(0),
146 _pendingTimeSyncRequests(),
147 _timeSyncNextCounter(0),
149 _calendarEventCreationCooldown(0),
150 _battlePetMgr(std::make_unique<BattlePets::BattlePetMgr>(
this)),
151 _collectionMgr(std::make_unique<CollectionMgr>(
this))
156 ResetTimeOutTime(
false);
157 LoginDatabase.PExecute(
"UPDATE account SET online = 1 WHERE id = {};", GetAccountId());
160 _instanceConnectKey.Raw =
UI64LIT(0);
171 for (
uint8 i = 0; i < 2; ++i)
271 static uint64 sendPacketCount = 0;
272 static uint64 sendPacketBytes = 0;
275 static time_t lastTime = firstTime;
277 static uint64 sendLastPacketCount = 0;
278 static uint64 sendLastPacketBytes = 0;
282 if ((cur_time - lastTime) < 60)
284 sendPacketCount += 1;
285 sendPacketBytes += packet->
size();
287 sendLastPacketCount += 1;
288 sendLastPacketBytes += packet->
size();
294 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));
295 TC_LOG_DEBUG(
"misc",
"Send last min packets count: {} bytes: {} avr.count/sec: {} avr.bytes/sec: {}", sendLastPacketCount, sendLastPacketBytes,
float(sendLastPacketCount)/minTime,
float(sendLastPacketBytes)/minTime);
298 sendLastPacketCount = 1;
299 sendLastPacketBytes = packet->
wpos();
306 m_Socket[conIdx]->SendPacket(*packet);
311 std::shared_ptr<WorldSocket> socket = sockRef.lock();
312 if (!socket || !socket->IsOpen())
318 socket->DelayedCloseSocket();
322 socket->SetWorldSession(session);
336 TC_LOG_ERROR(
"network.opcode",
"Received unexpected opcode {} Status: {} Reason: {} from {}",
346 TC_LOG_TRACE(
"network.opcode",
"Unprocessed tail data (read stop at {} from {}) Opcode {} from {}",
364 bool deletePacket =
true;
365 std::vector<WorldPacket*> requeuePackets;
366 uint32 processedPackets = 0;
369 constexpr uint32 MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE = 100;
389 requeuePackets.push_back(packet);
390 deletePacket =
false;
391 TC_LOG_DEBUG(
"network",
"Re-enqueueing packet with opcode {} with with status STATUS_LOGGEDIN. "
400 opHandle->
Call(
this, *packet);
403 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
410 "the player has not logged in yet and not recently logout");
415 opHandle->
Call(
this, *packet);
418 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
428 opHandle->
Call(
this, *packet);
431 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
449 opHandle->
Call(
this, *packet);
452 processedPackets = MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE;
468 TC_LOG_ERROR(
"network",
"WorldSession::Update ByteBufferException {} occured while parsing a packet (opcode: {}) from {} address {}. Skipped packet.",
476 KickPlayer(
"WorldSession::Update Invalid chat link");
479 KickPlayer(
"WorldSession::Update Illegal chat link");
488 TC_LOG_ERROR(
"network",
"WorldSession::Update ByteBufferException {} occured while parsing a packet (opcode: {}) from {} address {}. Skipped packet.",
502 if (processedPackets > MAX_PROCESSED_PACKETS_IN_SAME_WORLDSESSION_UPDATE)
533 if (std::ranges::any_of(
m_Socket, [](std::shared_ptr<WorldSocket>
const& s) {
return s && !s->IsOpen(); }))
538 for (std::shared_ptr<WorldSocket>& socket :
m_Socket)
542 socket->CloseSocket();
594 bg->EventPlayerLoggedOut(
_player);
620 guild->HandleMemberLogout(
this);
663 group->StartLeaderOfflineTimer();
681 TC_LOG_INFO(
"entities.player.character",
"Account: {} (IP: {}) Logout Character:[{}] {} Level: {}, XP: {}/{} ({} left)",
686 _map->RemovePlayerFromMap(
_player,
true);
693 TC_LOG_DEBUG(
"network",
"SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
718 for (std::shared_ptr<WorldSocket>
const& socket :
m_Socket)
722 socket->CloseSocket();
733 TC_LOG_ERROR(
"network",
"Player {}{} sent a message with an invalid link:\n{}",
GetPlayer()->GetName(),
737 KickPlayer(
"WorldSession::ValidateHyperlinksAndMaybeKick Invalid chat link");
744 if (str.find(
'|') == std::string::npos)
747 TC_LOG_ERROR(
"network",
"Player {} {} sent a message which illegally contained a hyperlink:\n{}",
GetPlayer()->GetName(),
751 KickPlayer(
"WorldSession::DisallowHyperlinksAndMaybeKick Illegal chat link");
763 va_start(ap, format);
764 vsnprintf(szStr, 1024, format, ap);
779 va_start(ap, stringId);
780 vsnprintf(szStr, 1024, format, ap);
801 else if (!onlyActive)
817 TC_LOG_ERROR(
"network.opcode",
"Received opcode {} that must be processed in WorldSocket::ReadDataHandler from {}"
823 boost::system::error_code ignored_error;
824 boost::asio::ip::address instanceAddress;
825 if (std::shared_ptr<Realm const> currentRealm =
sRealmList->GetCurrentRealm())
826 instanceAddress = currentRealm->GetAddressForClient(Trinity::Net::make_address(
GetRemoteAddress(), ignored_error));
835 connectTo.
Serial = serial;
837 if (instanceAddress.is_v4())
845 boost::asio::ip::address_v6 v6 = instanceAddress.to_v6();
846 if (v6.is_loopback())
848 memcpy(connectTo.
Payload.
Where.
Address.
V4.data(), boost::asio::ip::address_v4::loopback().to_bytes().data(), 4);
851 else if (v6.is_v4_mapped())
853 memcpy(connectTo.
Payload.
Where.
Address.
V4.data(), Trinity::Net::make_address_v4(Trinity::Net::v4_mapped, v6).to_bytes().data(), 4);
878 Field* fields = result->Fetch();
882 TC_LOG_ERROR(
"misc",
"Table `{}` have invalid account data type ({}), ignore.",
887 if ((mask & (1 << type)) == 0)
889 TC_LOG_ERROR(
"misc",
"Table `{}` have non appropriate for table account data type ({}), ignore.",
897 while (result->NextRow());
975 if (!hasTutorialsInDB)
994 element.
Id = entry->
ID;
1000 element.
Int64Value = fields.int64Value().GetInt64();
1003 element.
FloatValue = fields.floatValue().GetFloat();
1008 }
while (elementsResult->NextRow());
1018 }
while (flagsResult->NextRow());
1027 if (!element.NeedSave)
1033 transaction->Append(stmt);
1035 element.NeedSave =
false;
1044 if (!element.Int64Value)
1050 stmt->
setInt64(3, element.Int64Value);
1051 transaction->Append(stmt);
1054 if (!element.FloatValue)
1059 stmt->
setFloat(2, element.FloatValue);
1061 transaction->Append(stmt);
1075 transaction->Append(stmt);
1086 transaction->Append(stmt);
1096 elementItr->Id = dataElementId;
1099 elementItr->NeedSave =
true;
1100 elementItr->FloatValue = value;
1109 elementItr->Id = dataElementId;
1112 elementItr->NeedSave =
true;
1113 elementItr->Int64Value = value;
1127 flag.
Value |= flagValue;
1129 flag.
Value &= ~flagValue;
1196 TC_LOG_DEBUG(
"rbac",
"WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]",
1208 TC_LOG_DEBUG(
"rbac",
"WorldSession::LoadPermissions [AccountId: {}, Name: {}, realmId: {}, secLevel: {}]",
1331 std::shared_ptr<AccountInfoQueryHolderPerRealm> realmHolder = std::make_shared<AccountInfoQueryHolderPerRealm>();
1338 std::shared_ptr<AccountInfoQueryHolder> holder = std::make_shared<AccountInfoQueryHolder>();
1345 struct ForkJoinState
1347 std::shared_ptr<AccountInfoQueryHolderPerRealm>
Character;
1348 std::shared_ptr<AccountInfoQueryHolder>
Login;
1351 std::shared_ptr<ForkJoinState> state = std::make_shared<ForkJoinState>();
1355 state->Character = realmHolder;
1356 if (state->Login && state->Character)
1362 state->Login = holder;
1363 if (state->Login && state->Character)
1400 Field* fields = characterCountsResult->Fetch();
1403 }
while (characterCountsResult->NextRow());
1407 bnetConnected.
State = 1;
1425 TC_LOG_DEBUG(
"rbac",
"WorldSession::HasPermission [AccountId: {}, Name: {}, realmId: {}]",
1428 return hasPermission;
1433 TC_LOG_DEBUG(
"rbac",
"WorldSession::Invalidaterbac::RBACData [AccountId: {}, Name: {}, realmId: {}]",
1444 if (!maxPacketCounterAllowed)
1455 if (++packetCounter.
amountCounter <= maxPacketCounterAllowed)
1458 TC_LOG_WARN(
"network",
"AntiDOS: Account {}, IP: {}, Ping: {}, Character: {}, flooding packet (opc: {} (0x{:X}), count: {})",
1468 TC_LOG_WARN(
"network",
"AntiDOS: Player kicked!");
1476 std::string nameOrIp =
"";
1483 sWorld->BanAccount(bm, nameOrIp, duration,
"DOS (Packet Flooding/Spoofing",
"Server: AutoDOS");
1484 TC_LOG_WARN(
"network",
"AntiDOS: Player automatically banned for {} seconds.", duration);
1495 uint32 maxPacketCounterAllowed;
1594 maxPacketCounterAllowed = 0;
1608 maxPacketCounterAllowed = 200;
1621 maxPacketCounterAllowed = 50;
1634 maxPacketCounterAllowed = 20;
1664 maxPacketCounterAllowed = 10;
1707 maxPacketCounterAllowed = 3;
1722 maxPacketCounterAllowed = 1;
1733 maxPacketCounterAllowed = 100;
1738 return maxPacketCounterAllowed;
1774 TC_LOG_WARN(
"misc",
"The computed movement time using clockDelta is erronous. Using fallback instead");
1778 return uint32(movementTime);
@ CHAR_UPD_ACCOUNT_ONLINE
@ CHAR_REP_PLAYER_ACCOUNT_DATA
DB2Storage< PlayerDataElementAccountEntry > sPlayerDataElementAccountStore("PlayerDataElementAccount.db2", &PlayerDataElementAccountLoadInfo::Instance)
DB2Storage< AdventureMapPOIEntry > sAdventureMapPOIStore("AdventureMapPOI.db2", &AdventureMapPoiLoadInfo::Instance)
DB2Storage< PlayerDataFlagAccountEntry > sPlayerDataFlagAccountStore("PlayerDataFlagAccount.db2", &PlayerDataFlagAccountLoadInfo::Instance)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
SQLTransaction< LoginDatabaseConnection > LoginDatabaseTransaction
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_INS_BNET_PLAYER_DATA_ELEMENTS_ACCOUNT
@ LOGIN_SEL_BNET_PLAYER_DATA_FLAGS_ACCOUNT
@ LOGIN_SEL_ACCOUNT_MOUNTS
@ LOGIN_SEL_BNET_CHARACTER_COUNTS_BY_ACCOUNT_ID
@ LOGIN_SEL_BNET_TRANSMOG_OUTFITS
@ LOGIN_DEL_BNET_PLAYER_DATA_ELEMENTS_ACCOUNT
@ LOGIN_SEL_ACCOUNT_HEIRLOOMS
@ LOGIN_SEL_BNET_TRANSMOG_ILLUSIONS
@ LOGIN_DEL_BNET_PLAYER_DATA_FLAGS_ACCOUNT
@ LOGIN_SEL_BNET_WARBAND_SCENES
@ LOGIN_INS_BNET_PLAYER_DATA_FLAGS_ACCOUNT
@ LOGIN_SEL_BATTLE_PET_SLOTS
@ LOGIN_SEL_BNET_ITEM_APPEARANCES
@ LOGIN_SEL_BNET_PLAYER_DATA_ELEMENTS_ACCOUNT
#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)
constexpr uint32 UNKNOWN_OPCODE
@ CONNECTION_TYPE_INSTANCE
@ CONNECTION_TYPE_DEFAULT
constexpr bool IsInstanceOnlyOpcode(uint32 opcode)
constexpr FormattedOpcodeName< OpcodeClient > GetOpcodeNameForLogging(OpcodeClient opcode)
Lookup opcode name for human understandable logging.
@ 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_CHECK_IS_ADVENTURE_MAP_POI_VALID
@ 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_BUY_ACCOUNT_BANK_TAB
@ 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
@ INVENTORY_SLOT_BAG_START
@ ACCOUNT_BANK_SLOT_BAG_END
@ ACCOUNT_BANK_SLOT_BAG_START
@ PLAYER_DATA_FLAG_VALUE_BITS
#define DEFINE_FIELD_ACCESSOR_CACHE_ANONYMOUS(result_type, fields_list)
#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
@ TUTORIALS_FLAG_LOADED_FROM_DB
#define GLOBAL_CACHE_MASK
#define NUM_ACCOUNT_DATA_TYPES
bool Initialize(uint32 accountId, uint32)
AccountInfoQueryHolderPerRealm()
@ GLOBAL_REALM_CHARACTER_COUNTS
@ GLOBAL_ACCOUNT_HEIRLOOMS
@ PLAYER_DATA_ELEMENTS_ACCOUNT
@ ITEM_FAVORITE_APPEARANCES
@ PLAYER_DATA_FLAGS_ACCOUNT
bool Initialize(uint32 accountId, uint32 battlenetAccountId)
T & AddCallback(T &&query)
void ProcessReadyCallbacks()
ObjectGuid const & GetGUID() const
void SetDestroyedObject(bool destroyed)
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.
uint32 GetUInt32() const noexcept
uint8 GetUInt8() const noexcept
std::string GetString() const noexcept
int64 GetInt64() const noexcept
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
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 setFloat(uint8 index, float value)
void setUInt64(uint8 index, uint64 value)
void setInt32(uint8 index, int32 value)
void setUInt8(uint8 index, uint8 value)
void setNull(uint8 index)
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)
void ExitAllAreaTriggers()
bool HasAuraType(AuraType auraType) const
std::string const & GetName() const
ConnectionType GetConnection() const
WorldPacket const * Write() override
uint32 NativeRealmAddress
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
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)
std::unique_ptr< Battlenet::Account > _battlenetAccount
void LogoutPlayer(bool save)
Log the player out
AccountData _accountData[NUM_ACCOUNT_DATA_TYPES]
char const * GetTrinityString(uint32 entry) const
ObjectGuid GetBattlenetAccountGUID() const
void LoadTutorialsData(PreparedQueryResult result)
void SendClientCacheVersion(uint32 version)
void SetPlayerDataFlagAccount(uint32 dataFlagId, bool on)
void SendConnectToInstance(WorldPackets::Auth::ConnectToSerial serial)
void HandleMoveWorldportAck()
void SendNotification(char const *format,...) ATTR_PRINTF(2
std::array< std::shared_ptr< WorldSocket >, MAX_CONNECTION_TYPES > m_Socket
bool CanAccessAlliedRaces() const
AsyncCallbackProcessor< SQLQueryHolderCallback > _queryHolderProcessor
void SendAuthResponse(uint32 code, bool queued, uint32 queuePos=0)
void LoadPlayerDataAccount(PreparedQueryResult const &elementsResult, PreparedQueryResult const &flagsResult)
QueryCallbackProcessor _queryProcessor
std::array< uint32, MAX_ACCOUNT_TUTORIAL_VALUES > _tutorials
AccountTypes GetSecurity() const
LocaleConstant GetSessionDbLocaleIndex() const
bool PlayerDisconnected() const
int64 _timeSyncClockDelta
bool DisallowHyperlinksAndMaybeKick(std::string const &str)
uint32 AdjustClientMovementTime(uint32 time) const
class WorldSession::DosProtection AntiDOS
void LoadAccountData(PreparedQueryResult result, uint32 mask)
std::atomic< time_t > m_timeOutTime
uint64 GetConnectToInstanceKey() const
std::unordered_map< uint32, uint8 > _realmCharacterCounts
WorldSession(uint32 id, std::string &&name, uint32 battlenetAccountId, std::string &&battlenetAccountEmail, 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.
std::string GetPlayerInfo() const
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 SavePlayerDataAccount(LoginDatabaseTransaction const &transaction)
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
PlayerDataAccount _playerDataAccount
uint32 GetAccountId() const
uint8 GetAccountExpansion() const
ConnectToKey _instanceConnectKey
void QueuePacket(WorldPacket &&new_packet)
Add an incoming packet to the queue.
void SetPlayerDataElementAccount(uint32 dataElementId, float value)
uint32 GetLatency() const
void ProcessQueryCallbacks()
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
void ResetTimeOutTime(bool onlyActive)
void KickPlayer(std::string_view reason)
Kick a player out of the World.
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
uint32 GetVirtualRealmAddress()
@ 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
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
constexpr decltype(auto) EnsureWritableVectorIndex(std::vector< T > &vec, typename std::vector< T >::size_type i)
bool TC_GAME_API CheckAllLinks(std::string_view str)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
struct advstd::ranges::Contains contains
@ RBAC_PERM_IGNORE_IDLE_CONNECTION
PacketProcessing ProcessingPlace
PlayerDataElementType GetType() const
ConnectionType ConnectionIndex
std::array< uint8, 4 > V4
std::array< uint8, 16 > V6
union WorldPackets::Auth::ConnectTo::SocketAddress::@310 Address
std::vector< Element > Elements
std::vector< Flag > Flags
struct WorldSession::ConnectToKey::@318 Fields