More packets

This commit is contained in:
luis
2026-09-23 13:07:26 -03:00
parent 1a914f5d74
commit 0811620d76
4 changed files with 41 additions and 9 deletions
@@ -1536,9 +1536,9 @@ void WorldSession::HandleBattlePayGetPurchaseList(WorldPackets::BattlePay::GetPu
// VAS (Value Added Services) status queries.
//
// These are the only two VAS opcodes a retail client actually sends unprompted - both appear at character
// select in every capture on this machine, and both have empty bodies. They were registered STATUS_IGNORED,
// which in this core is a bare `break;` in WorldSession: the packet was dropped without even a log line, so
// the client's VAS caches were never refreshed and never cleared.
// select in every capture on this machine, and both have empty bodies. The replies were already written,
// but the client opcodes were STATUS_IGNORED and the server opcodes were STATUS_UNHANDLED, so SendPacket
// dropped them and the client's VAS caches were never cleared.
//
// Answering with "nothing in flight" is the accurate state of this realm, and it is byte-identical to what
// retail sends when a player has no pending purchase.
@@ -1452,6 +1452,30 @@ namespace WorldPackets
// viewer's own faction group to decide whether to show the win or the loss pose. Client default is -1.
int32 Winner = -1;
};
// SMSG_DISPLAY_PROMOTION at the glue screen. Captures send uint32 0: no promotion.
class DisplayPromotion final : public ServerPacket
{
public:
explicit DisplayPromotion() : ServerPacket(SMSG_DISPLAY_PROMOTION, 4) {}
WorldPacket const* Write() override
{
_worldPacket << uint32(PromotionID);
return &_worldPacket;
}
uint32 PromotionID = 0;
};
// SMSG_UNSET_INSTANCE_LEAVER at the glue screen. Captures send an empty body.
class UnsetInstanceLeaver final : public ServerPacket
{
public:
explicit UnsetInstanceLeaver() : ServerPacket(SMSG_UNSET_INSTANCE_LEAVER, 0) {}
WorldPacket const* Write() override { return &_worldPacket; }
};
}
}
+6 -6
View File
@@ -1150,7 +1150,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory);
DEFINE_HANDLER(CMSG_UPDATE_RAID_TARGET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateRaidTargetOpcode);
DEFINE_HANDLER(CMSG_UPDATE_SPELL_VISUAL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUpdateAuraVisual);
DEFINE_HANDLER(CMSG_UPDATE_VAS_PURCHASE_STATES, STATUS_IGNORED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPDATE_VAS_PURCHASE_STATES, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleUpdateVasPurchaseStates);
DEFINE_HANDLER(CMSG_UPGRADE_GARRISON, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpgradeGarrison);
DEFINE_HANDLER(CMSG_UPGRADE_RUNEFORGE_LEGENDARY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUpgradeRuneforgeLegendary);
DEFINE_HANDLER(CMSG_USED_FOLLOW, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUsedFollowOpcode);
@@ -1160,7 +1160,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_USE_TOY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUseToy);
DEFINE_HANDLER(CMSG_VAS_CHECK_TRANSFER_OK, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleVasCheckTransferOk);
DEFINE_HANDLER(CMSG_VAS_GET_QUEUE_MINUTES, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleVasGetQueueMinutes);
DEFINE_HANDLER(CMSG_VAS_GET_SERVICE_STATUS, STATUS_IGNORED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_VAS_GET_SERVICE_STATUS, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleVasGetServiceStatus);
DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleViolenceLevel);
DEFINE_HANDLER(CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_VOICE_CHAT_JOIN_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
@@ -1517,7 +1517,7 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_GAME_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PLAYER_CHOICE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PROMOTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PROMOTION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_QUEST_POPUP, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_TOAST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_WORLD_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1540,7 +1540,7 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_END_LIGHTNING_STORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENTER_ENCRYPTED_MODE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENUM_CHARACTERS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTAL_DAMAGE_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -2519,7 +2519,7 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNIT_DIMINISHING_RETURN_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLOAD_CHILD_MAP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNSET_INSTANCE_LEAVER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNSET_INSTANCE_LEAVER, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_AADC_STATUS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -2547,7 +2547,7 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_USE_EQUIPMENT_SET_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_GET_SERVICE_STATUS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_GET_SERVICE_STATUS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_PURCHASE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_PURCHASE_STATE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VENDOR_INVENTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+8
View File
@@ -1475,6 +1475,10 @@ void WorldSession::InitializeSessionCallback(LoginDatabaseQueryHolder const& hol
SendAccountDataTimes(ObjectGuid::Empty, GLOBAL_CACHE_MASK);
SendTutorialsData();
// Glue captures send promotion id 0 immediately after the tutorial flags.
WorldPackets::Misc::DisplayPromotion displayPromotion;
SendPacket(displayPromotion.Write());
if (PreparedQueryResult characterCountsResult = holder.GetPreparedResult(AccountInfoQueryHolder::GLOBAL_REALM_CHARACTER_COUNTS))
{
do
@@ -1485,6 +1489,10 @@ void WorldSession::InitializeSessionCallback(LoginDatabaseQueryHolder const& hol
} while (characterCountsResult->NextRow());
}
// Glue captures clear the instance-leaver flag with an empty packet next to the bnet status.
WorldPackets::Misc::UnsetInstanceLeaver unsetInstanceLeaver;
SendPacket(unsetInstanceLeaver.Write());
WorldPackets::Battlenet::ConnectionStatus bnetConnected;
bnetConnected.State = 1;
SendPacket(bnetConnected.Write());