Temp: env-var toggles to bisect post-auth crash packet
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "WorldSession.h"
|
#include "WorldSession.h"
|
||||||
|
#include "Playerbot/PlayerbotHooks.h"
|
||||||
#include "Account.h"
|
#include "Account.h"
|
||||||
#include "AccountMgr.h"
|
#include "AccountMgr.h"
|
||||||
#include "AuthenticationPackets.h"
|
#include "AuthenticationPackets.h"
|
||||||
@@ -108,7 +109,11 @@ bool WorldSessionFilter::Process(WorldPacket* packet)
|
|||||||
/// WorldSession constructor
|
/// WorldSession constructor
|
||||||
WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccountId, std::string&& battlenetAccountEmail,
|
WorldSession::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,
|
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) :
|
uint32 build, ClientBuild::VariantId clientBuildVariant, LocaleConstant locale, uint32 recruiter, bool isARecruiter
|
||||||
|
#if defined(TRINITY_PLAYERBOT_V2)
|
||||||
|
, bool is_bot
|
||||||
|
#endif
|
||||||
|
) :
|
||||||
m_muteTime(mute_time),
|
m_muteTime(mute_time),
|
||||||
m_timeOutTime(0),
|
m_timeOutTime(0),
|
||||||
AntiDOS(this),
|
AntiDOS(this),
|
||||||
@@ -151,6 +156,9 @@ WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccoun
|
|||||||
_calendarEventCreationCooldown(0),
|
_calendarEventCreationCooldown(0),
|
||||||
_battlePetMgr(std::make_unique<BattlePets::BattlePetMgr>(this)),
|
_battlePetMgr(std::make_unique<BattlePets::BattlePetMgr>(this)),
|
||||||
_collectionMgr(std::make_unique<CollectionMgr>(this))
|
_collectionMgr(std::make_unique<CollectionMgr>(this))
|
||||||
|
#if defined(TRINITY_PLAYERBOT_V2)
|
||||||
|
, _isBot(is_bot)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
if (m_Socket[CONNECTION_TYPE_REALM])
|
if (m_Socket[CONNECTION_TYPE_REALM])
|
||||||
{
|
{
|
||||||
@@ -158,6 +166,12 @@ WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccoun
|
|||||||
ResetTimeOutTime(false);
|
ResetTimeOutTime(false);
|
||||||
LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = {};", GetAccountId()); // One-time query
|
LoginDatabase.PExecute("UPDATE account SET online = 1 WHERE id = {};", GetAccountId()); // One-time query
|
||||||
}
|
}
|
||||||
|
#if defined(TRINITY_PLAYERBOT_V2)
|
||||||
|
else if (is_bot)
|
||||||
|
{
|
||||||
|
m_Address = "bot";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
_instanceConnectKey.Raw = UI64LIT(0);
|
_instanceConnectKey.Raw = UI64LIT(0);
|
||||||
}
|
}
|
||||||
@@ -174,7 +188,10 @@ WorldSession::~WorldSession()
|
|||||||
{
|
{
|
||||||
if (m_Socket[i])
|
if (m_Socket[i])
|
||||||
{
|
{
|
||||||
m_Socket[i]->CloseSocket();
|
#if defined(TRINITY_PLAYERBOT_V2)
|
||||||
|
if (!IsBot()) // Bot sessions have nullptr sockets
|
||||||
|
#endif
|
||||||
|
m_Socket[i]->CloseSocket();
|
||||||
m_Socket[i].reset();
|
m_Socket[i].reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -186,7 +203,15 @@ WorldSession::~WorldSession()
|
|||||||
while (_recvQueue.next(packet))
|
while (_recvQueue.next(packet))
|
||||||
delete packet;
|
delete packet;
|
||||||
|
|
||||||
LoginDatabase.PExecute("UPDATE account SET online = 0 WHERE id = {};", GetAccountId()); // One-time query
|
#if defined(TRINITY_PLAYERBOT_V2)
|
||||||
|
// Bot sessions share the owner GM's account id. The ctor never sets
|
||||||
|
// online=1 for them (the ctor's online=1 query is gated on a non-null
|
||||||
|
// socket), so the dtor must symmetrically skip clearing it — otherwise
|
||||||
|
// a bot logging out flips the GM's account.online to 0 while the GM is
|
||||||
|
// still in-world.
|
||||||
|
if (!IsBot())
|
||||||
|
#endif
|
||||||
|
LoginDatabase.PExecute("UPDATE account SET online = 0 WHERE id = {};", GetAccountId()); // One-time query
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WorldSession::PlayerDisconnected() const
|
bool WorldSession::PlayerDisconnected() const
|
||||||
@@ -356,7 +381,12 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
|
|||||||
///- Before we process anything:
|
///- Before we process anything:
|
||||||
/// If necessary, kick the player because the client didn't send anything for too long
|
/// If necessary, kick the player because the client didn't send anything for too long
|
||||||
/// (or they've been idling in character select)
|
/// (or they've been idling in character select)
|
||||||
|
/// Note: Bots don't have sockets, so skip idle check for them
|
||||||
|
#if defined(TRINITY_PLAYERBOT_V2)
|
||||||
|
if (!IsBot() && IsConnectionIdle() && !HasPermission(rbac::RBAC_PERM_IGNORE_IDLE_CONNECTION) && m_Socket[CONNECTION_TYPE_REALM])
|
||||||
|
#else
|
||||||
if (IsConnectionIdle() && !HasPermission(rbac::RBAC_PERM_IGNORE_IDLE_CONNECTION))
|
if (IsConnectionIdle() && !HasPermission(rbac::RBAC_PERM_IGNORE_IDLE_CONNECTION))
|
||||||
|
#endif
|
||||||
m_Socket[CONNECTION_TYPE_REALM]->CloseSocket();
|
m_Socket[CONNECTION_TYPE_REALM]->CloseSocket();
|
||||||
|
|
||||||
///- Retrieve packets from the receive queue and call the appropriate handlers
|
///- Retrieve packets from the receive queue and call the appropriate handlers
|
||||||
@@ -567,6 +597,12 @@ void WorldSession::LogoutPlayer(bool save)
|
|||||||
|
|
||||||
if (_player)
|
if (_player)
|
||||||
{
|
{
|
||||||
|
#if defined(TRINITY_PLAYERBOT_V2)
|
||||||
|
// Captured early because the bot-only per-character offline write
|
||||||
|
// below runs after _player is nulled out by SetPlayer(nullptr).
|
||||||
|
uint64 const playerGuidLow = _player->GetGUID().GetCounter();
|
||||||
|
#endif
|
||||||
|
|
||||||
//WowCommunity
|
//WowCommunity
|
||||||
// Remove any premade group finder listing this player owns.
|
// Remove any premade group finder listing this player owns.
|
||||||
// Remove any premade group finder listing this player owns, and any outstanding applications.
|
// Remove any premade group finder listing this player owns, and any outstanding applications.
|
||||||
@@ -679,6 +715,11 @@ void WorldSession::LogoutPlayer(bool save)
|
|||||||
//! Call script hook before deletion
|
//! Call script hook before deletion
|
||||||
sScriptMgr->OnPlayerLogout(_player);
|
sScriptMgr->OnPlayerLogout(_player);
|
||||||
|
|
||||||
|
#if TRINITY_PLAYERBOT_V2
|
||||||
|
// PlayerbotV2: unregister bot AI / log altbots out with their owner.
|
||||||
|
Playerbot::Hooks::OnPlayerLogout(_player);
|
||||||
|
#endif
|
||||||
|
|
||||||
TC_METRIC_EVENT("player_events", "Logout", _player->GetName());
|
TC_METRIC_EVENT("player_events", "Logout", _player->GetName());
|
||||||
|
|
||||||
//! Remove the player from the world
|
//! Remove the player from the world
|
||||||
@@ -701,10 +742,24 @@ void WorldSession::LogoutPlayer(bool save)
|
|||||||
SendPacket(WorldPackets::Character::LogoutComplete().Write());
|
SendPacket(WorldPackets::Character::LogoutComplete().Write());
|
||||||
TC_LOG_DEBUG("network", "SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
|
TC_LOG_DEBUG("network", "SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
|
||||||
|
|
||||||
//! Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline
|
#if defined(TRINITY_PLAYERBOT_V2)
|
||||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ACCOUNT_ONLINE);
|
// Bots violate the "one online char per account" assumption: a GM can
|
||||||
stmt->setUInt32(0, GetAccountId());
|
// be in-world alongside several bot chars on the same account. The
|
||||||
CharacterDatabase.Execute(stmt);
|
// bulk `WHERE account = ?` query below would mark the GM's own char
|
||||||
|
// (and other still-active bots) offline. For bot sessions, restrict
|
||||||
|
// the offline write to just this character.
|
||||||
|
if (IsBot())
|
||||||
|
{
|
||||||
|
CharacterDatabase.PExecute("UPDATE characters SET online = 0 WHERE guid = {}", playerGuidLow);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
//! Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline
|
||||||
|
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ACCOUNT_ONLINE);
|
||||||
|
stmt->setUInt32(0, GetAccountId());
|
||||||
|
CharacterDatabase.Execute(stmt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_Socket[CONNECTION_TYPE_INSTANCE])
|
if (m_Socket[CONNECTION_TYPE_INSTANCE])
|
||||||
@@ -1462,13 +1517,18 @@ void WorldSession::InitializeSessionCallback(LoginDatabaseQueryHolder const& hol
|
|||||||
SetInQueue(false);
|
SetInQueue(false);
|
||||||
ResetTimeOutTime(false);
|
ResetTimeOutTime(false);
|
||||||
|
|
||||||
SendSetTimeZoneInformation();
|
if (!std::getenv("TC_SKIP_SET_TZ"))
|
||||||
SendFeatureSystemStatusGlueScreen();
|
SendSetTimeZoneInformation();
|
||||||
SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION));
|
if (!std::getenv("TC_SKIP_FEATURE"))
|
||||||
SendAvailableHotfixes();
|
SendFeatureSystemStatusGlueScreen();
|
||||||
SendAccountDataTimes(ObjectGuid::Empty, GLOBAL_CACHE_MASK);
|
if (!std::getenv("TC_SKIP_CACHE"))
|
||||||
SendTutorialsData();
|
SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION));
|
||||||
|
if (!std::getenv("TC_SKIP_HOTFIX"))
|
||||||
|
SendAvailableHotfixes();
|
||||||
|
if (!std::getenv("TC_SKIP_ACCTDATA"))
|
||||||
|
SendAccountDataTimes(ObjectGuid::Empty, GLOBAL_CACHE_MASK);
|
||||||
|
if (!std::getenv("TC_SKIP_TUTORIAL"))
|
||||||
|
SendTutorialsData();
|
||||||
if (PreparedQueryResult characterCountsResult = holder.GetPreparedResult(AccountInfoQueryHolder::GLOBAL_REALM_CHARACTER_COUNTS))
|
if (PreparedQueryResult characterCountsResult = holder.GetPreparedResult(AccountInfoQueryHolder::GLOBAL_REALM_CHARACTER_COUNTS))
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
@@ -1481,7 +1541,8 @@ void WorldSession::InitializeSessionCallback(LoginDatabaseQueryHolder const& hol
|
|||||||
|
|
||||||
WorldPackets::Battlenet::ConnectionStatus bnetConnected;
|
WorldPackets::Battlenet::ConnectionStatus bnetConnected;
|
||||||
bnetConnected.State = 1;
|
bnetConnected.State = 1;
|
||||||
SendPacket(bnetConnected.Write());
|
if (!std::getenv("TC_SKIP_BNETCONN"))
|
||||||
|
SendPacket(bnetConnected.Write());
|
||||||
|
|
||||||
_battlePetMgr->LoadFromDB(holder.GetPreparedResult(AccountInfoQueryHolder::BATTLE_PETS),
|
_battlePetMgr->LoadFromDB(holder.GetPreparedResult(AccountInfoQueryHolder::BATTLE_PETS),
|
||||||
holder.GetPreparedResult(AccountInfoQueryHolder::BATTLE_PET_SLOTS));
|
holder.GetPreparedResult(AccountInfoQueryHolder::BATTLE_PET_SLOTS));
|
||||||
|
|||||||
Reference in New Issue
Block a user