diff options
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/AuthenticationPackets.h | 2 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.cpp | 96 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.h | 177 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SystemPackets.cpp | 43 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/SystemPackets.h | 53 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 52 | ||||
| -rw-r--r-- | src/server/game/Server/WorldPacket.h | 2 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 42 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 114 |
10 files changed, 474 insertions, 124 deletions
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index 305a841d4e7..209300e023e 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -29,7 +29,7 @@ namespace WorldPackets class AuthChallenge final : public ServerPacket { public: - AuthChallenge() : ServerPacket(SMSG_AUTH_CHALLENGE, 8 + 32 + 1), Challenge(0) { } + AuthChallenge() : ServerPacket(SMSG_AUTH_CHALLENGE, 4 + 32 + 1), Challenge(0) { } void Write() override; diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index ff44777ac79..095eb452e2b 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -37,8 +37,8 @@ WorldPackets::Character::CharEnumResult::CharacterInfo::CharacterInfo(Field* fie HairColor = uint8((fields[5].GetUInt32() >> 24) & 0xFF); FacialHair = uint8(fields[6].GetUInt32() & 0xFF); Level = fields[7].GetUInt8(); - ZoneId = fields[8].GetUInt16(); - MapId = fields[9].GetUInt16(); + ZoneId = int32(fields[8].GetUInt16()); + MapId = int32(fields[9].GetUInt16()); PreLoadPosition.x = fields[10].GetFloat(); PreLoadPosition.y = fields[11].GetFloat(); PreLoadPosition.z = fields[12].GetFloat(); @@ -147,8 +147,8 @@ void WorldPackets::Character::CharEnumResult::Write() _worldPacket << uint8(charInfo.HairColor); _worldPacket << uint8(charInfo.FacialHair); _worldPacket << uint8(charInfo.Level); - _worldPacket << uint32(charInfo.ZoneId); - _worldPacket << uint32(charInfo.MapId); + _worldPacket << int32(charInfo.ZoneId); + _worldPacket << int32(charInfo.MapId); _worldPacket << float(charInfo.PreLoadPosition.x); _worldPacket << float(charInfo.PreLoadPosition.y); _worldPacket << float(charInfo.PreLoadPosition.z); @@ -178,11 +178,97 @@ void WorldPackets::Character::CharEnumResult::Write() for (RestrictedFactionChangeRuleInfo const& rule : FactionChangeRestrictions) { - _worldPacket << uint32(rule.Mask); + _worldPacket << int32(rule.Mask); _worldPacket << uint8(rule.Race); } } +WorldPackets::Character::CharacterCreate::CharacterCreate(WorldPacket&& packet) + : ClientPacket(std::move(packet)) +{ + ASSERT(_worldPacket.GetOpcode() == CMSG_CHAR_CREATE); +} + +void WorldPackets::Character::CharacterCreate::Read() +{ + CreateInfo.reset(new CharacterCreateInfo()); + uint32 nameLength = _worldPacket.ReadBits(6); + CreateInfo->TemplateSet.HasValue = _worldPacket.ReadBit(); + _worldPacket >> CreateInfo->Race; + _worldPacket >> CreateInfo->Class; + _worldPacket >> CreateInfo->Sex; + _worldPacket >> CreateInfo->Skin; + _worldPacket >> CreateInfo->Face; + _worldPacket >> CreateInfo->HairStyle; + _worldPacket >> CreateInfo->HairColor; + _worldPacket >> CreateInfo->FacialHairStyle; + _worldPacket >> CreateInfo->OutfitId; + CreateInfo->Name = _worldPacket.ReadString(nameLength); + if (CreateInfo->TemplateSet.HasValue) + _worldPacket >> CreateInfo->TemplateSet.value; +} + +WorldPackets::Character::CharacterCreateResponse::CharacterCreateResponse() + : ServerPacket(SMSG_CHAR_CREATE, 1) { } + +void WorldPackets::Character::CharacterCreateResponse::Write() +{ + _worldPacket << uint8(Code); +} + +WorldPackets::Character::CharacterDelete::CharacterDelete(WorldPacket&& packet) + : ClientPacket(std::move(packet)) +{ + ASSERT(_worldPacket.GetOpcode() == CMSG_CHAR_DELETE); +} + +void WorldPackets::Character::CharacterDelete::Read() +{ + _worldPacket >> Guid; +} + +WorldPackets::Character::CharacterDeleteResponse::CharacterDeleteResponse() + : ServerPacket(SMSG_CHAR_DELETE, 1) { } + +void WorldPackets::Character::CharacterDeleteResponse::Write() +{ + _worldPacket << uint8(Code); +} + +WorldPackets::Character::UndeleteCharacter::UndeleteCharacter(WorldPacket&& packet) + : ClientPacket(std::move(packet)) +{ + ASSERT(_worldPacket.GetOpcode() == CMSG_UNDELETE_CHARACTER); +} + +void WorldPackets::Character::UndeleteCharacter::Read() +{ + UndeleteInfo.reset(new CharacterUndeleteInfo()); + _worldPacket >> UndeleteInfo->ClientToken; + _worldPacket >> UndeleteInfo->CharacterGuid; +} + +WorldPackets::Character::UndeleteCharacterResponse::UndeleteCharacterResponse() + : ServerPacket(SMSG_UNDELETE_CHARACTER_RESPONSE, 26) { } + +void WorldPackets::Character::UndeleteCharacterResponse::Write() +{ + ASSERT(UndeleteInfo); + _worldPacket << int32(UndeleteInfo->ClientToken); + _worldPacket << uint32(Result); + _worldPacket << UndeleteInfo->CharacterGuid; +} + +WorldPackets::Character::UndeleteCooldownStatusResponse::UndeleteCooldownStatusResponse() + : ServerPacket(SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE, 9) { } + +void WorldPackets::Character::UndeleteCooldownStatusResponse::Write() +{ + _worldPacket.WriteBit(OnCooldown); + _worldPacket << uint32(MaxCooldown); + _worldPacket << uint32(CurrentCooldown); +} + WorldPackets::Character::PlayerLogin::PlayerLogin(WorldPacket&& packet) : ClientPacket(std::move(packet)) { diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 2f8b069164a..135d53f8e8c 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -25,6 +25,77 @@ namespace WorldPackets { namespace Character { + struct CharacterCreateInfo + { + friend class CharacterCreate; + friend class Player; + friend class WorldSession; + + protected: + /// User specified variables + uint8 Race = 0; + uint8 Class = 0; + uint8 Sex = GENDER_NONE; + uint8 Skin = 0; + uint8 Face = 0; + uint8 HairStyle = 0; + uint8 HairColor = 0; + uint8 FacialHairStyle = 0; + uint8 OutfitId = 0; + Optional<int32> TemplateSet; + std::string Name; + + /// Server side data + uint8 CharCount = 0; + }; + + struct CharacterRenameInfo + { + friend class WorldSession; + + protected: + ObjectGuid Guid; + std::string Name; + }; + + struct CharacterCustomizeInfo : public CharacterRenameInfo + { + friend class Player; + friend class WorldSession; + + protected: + uint8 Gender = GENDER_NONE; + uint8 Skin = 0; + uint8 Face = 0; + uint8 HairStyle = 0; + uint8 HairColor = 0; + uint8 FacialHair = 0; + }; + + struct CharacterFactionChangeInfo : public CharacterCustomizeInfo + { + friend class Player; + friend class WorldSession; + + protected: + uint8 Race = 0; + }; + + struct CharacterUndeleteInfo + { + friend class UndeleteCharacter; + friend class UndeleteCharacterResponse; + friend class WorldSession; + + protected: + /// User specified variables + ObjectGuid CharacterGuid; ///< Guid of the character to restore + int32 ClientToken = 0; ///< @todo: research + + /// Server side data + std::string Name; + }; + class CharEnumResult final : public ServerPacket { public: @@ -51,8 +122,8 @@ namespace WorldPackets uint8 HairColor = 0; uint8 FacialHair = 0; uint8 Level = 0; - uint32 ZoneId = 0; - uint32 MapId = 0; + int32 ZoneId = 0; + int32 MapId = 0; G3D::Vector3 PreLoadPosition; ObjectGuid GuildGuid; uint32 Flags = 0; ///< Character flag @see enum CharacterFlags @@ -68,7 +139,7 @@ namespace WorldPackets } Pet; bool BoostInProgress = false; ///< @todo - uint32 ProfessionIds[2]; ///< @todo + int32 ProfessionIds[2]; ///< @todo struct VisualItemInfo { @@ -82,11 +153,11 @@ namespace WorldPackets struct RestrictedFactionChangeRuleInfo { - RestrictedFactionChangeRuleInfo(uint32 mask, uint8 race) + RestrictedFactionChangeRuleInfo(int32 mask, uint8 race) : Mask(mask), Race(race) { } - uint32 Mask = 0; - uint8 Race = 0; + int32 Mask = 0; + uint8 Race = 0; }; CharEnumResult(); @@ -100,6 +171,100 @@ namespace WorldPackets std::list<RestrictedFactionChangeRuleInfo> FactionChangeRestrictions; ///< @todo: research }; + class CharacterCreate final : public ClientPacket + { + public: + CharacterCreate(WorldPacket&& packet); + + void Read() override; + + /** + * @var uint8 Race + * @var uint8 Class + * @var uint8 Sex + * @var uint8 Skin + * @var uint8 Face + * @var uint8 HairStyle + * @var uint8 HairColor + * @var uint8 FacialHairStyle + * @var uint8 OutfitId + * @var Optional<int32> TemplateSet + * @var std::string Name + */ + std::shared_ptr<CharacterCreateInfo> CreateInfo; + }; + + class CharacterCreateResponse final : public ServerPacket + { + public: + CharacterCreateResponse(); + + void Write() override; + + uint8 Code = 0; ///< Result code @see enum ResponseCodes + }; + + class CharacterDelete final : public ClientPacket + { + public: + CharacterDelete(WorldPacket&& packet); + + void Read() override; + + ObjectGuid Guid; ///< Guid of the character to delete + }; + + class CharacterDeleteResponse final : public ServerPacket + { + public: + CharacterDeleteResponse(); + + void Write() override; + + uint8 Code = 0; ///< Result code @see enum ResponseCodes + }; + + class UndeleteCharacter final : public ClientPacket + { + public: + UndeleteCharacter(WorldPacket&& packet); + + void Read() override; + + /** + * @var ObjectGuid CharacterGuid + * @var int32 ClientToken + */ + std::shared_ptr<CharacterUndeleteInfo> UndeleteInfo; + }; + + class UndeleteCharacterResponse final : public ServerPacket + { + public: + UndeleteCharacterResponse(); + + void Write() override; + + /** + * @var ObjectGuid CharacterGuid + * @var int32 ClientToken + */ + CharacterUndeleteInfo const* UndeleteInfo = nullptr; + uint32 Result = 0; ///< @see enum CharacterUndeleteResult + }; + + class UndeleteCooldownStatusResponse final : public ServerPacket + { + public: + UndeleteCooldownStatusResponse(); + + void Write() override; + + bool OnCooldown = false; ///< + uint32 MaxCooldown = 0; ///< Max. cooldown until next free character restoration. Displayed in undelete confirm message. (in sec) + uint32 CurrentCooldown = 0; ///< Current cooldown until next free character restoration. (in sec) + }; + class PlayerLogin final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp new file mode 100644 index 00000000000..c1d11db9ef9 --- /dev/null +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "SystemPackets.h" + +WorldPackets::System::FeatureSystemStatusGlueScreen::FeatureSystemStatusGlueScreen() + : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, 1) { } + +void WorldPackets::System::FeatureSystemStatusGlueScreen::Write() +{ + _worldPacket.WriteBit(BpayStoreEnabled); + _worldPacket.WriteBit(BpayStoreAvailable); + _worldPacket.WriteBit(BpayStoreDisabledByParentalControls); + _worldPacket.WriteBit(CharUndeleteEnabled); + _worldPacket.FlushBits(); +} + +WorldPackets::System::SetTimeZoneInformation::SetTimeZoneInformation() + : ServerPacket(SMSG_SET_TIME_ZONE_INFORMATION) { } + +void WorldPackets::System::SetTimeZoneInformation::Write() +{ + _worldPacket.reserve(1 + ServerTimeTZ.length() + GameTimeTZ.length()); + + _worldPacket.WriteBits(ServerTimeTZ.length(), 7); + _worldPacket.WriteBits(GameTimeTZ.length(), 7); + _worldPacket.WriteString(ServerTimeTZ); + _worldPacket.WriteString(GameTimeTZ); +} diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h new file mode 100644 index 00000000000..cb5a22a9b98 --- /dev/null +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef SystemPackets_h__ +#define SystemPackets_h__ + +#include "Packet.h" + +namespace WorldPackets +{ + namespace System + { + class FeatureSystemStatusGlueScreen final : public ServerPacket + { + public: + FeatureSystemStatusGlueScreen(); + + void Write() override; + + bool BpayStoreAvailable = false; // NYI + bool BpayStoreDisabledByParentalControls = false; // NYI + bool CharUndeleteEnabled = false; // NYI + bool BpayStoreEnabled = false; // NYI + }; + + class SetTimeZoneInformation final : public ServerPacket + { + public: + SetTimeZoneInformation(); + + void Write() override; + + std::string ServerTimeTZ; + std::string GameTimeTZ; + }; + } +} + +#endif // SystemPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 4d62b83552f..12dc1fd096c 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -214,13 +214,14 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_UNSILENCE_VOICE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_VOICE_OFF, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelVoiceOnOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANNEL_VOICE_ON, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelVoiceOnOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_CREATE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCreateOpcode ); + DEFINE_HANDLER(CMSG_CHAR_CREATE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharacterCreate, &WorldSession::HandleCharCreateOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_CUSTOMIZE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCustomize ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharDeleteOpcode ); + DEFINE_HANDLER(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharacterDelete, &WorldSession::HandleCharDeleteOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharEnumOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_FACTION_CHANGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharFactionOrRaceChange ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_RACE_CHANGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharFactionOrRaceChange ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_RENAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharRenameOpcode ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_UNDELETE_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharUndeleteEnumOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAT_FILTERED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAT_IGNORED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChatIgnoredOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CLEAR_CHANNEL_WATCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -259,6 +260,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDelete ); DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_SAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetSave ); DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_USE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetUse ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_FACTION_BONUS_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_FAR_SIGHT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleFarSightOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck ); DEFINE_OPCODE_HANDLER_OLD(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck ); @@ -585,6 +587,8 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_FLAG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialFlag ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TUTORIAL_RESET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialReset ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode ); + DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode); + DEFINE_OPCODE_HANDLER_OLD(CMSG_UNDELETE_COOLDOWN_STATUS_QUERY, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUndeleteCooldownStatusQuery); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SKILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnregisterAddonPrefixesOpcode); @@ -736,6 +740,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDPOINTUPDATE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDZONEREPLY, STATUS_UNHANDLED); @@ -774,7 +779,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_LOGIN_FAILED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CREATE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_DELETE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_DELETE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_ENUM, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_FACTION_CHANGE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_RENAME, STATUS_UNHANDLED); @@ -856,7 +861,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FAILED_PLAYER_CONDITION, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEIGN_DEATH_RESISTED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_ESCAPED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_NOT_HOOKED, STATUS_UNHANDLED); @@ -954,6 +959,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_INFO, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_NOTIFY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIALIZE_FACTIONS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SPELLS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_CURRENCY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_UNHANDLED); @@ -1231,6 +1237,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROJECTILE_POSITION, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOWTAXINODES, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_UNHANDLED); @@ -1324,6 +1331,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULTS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_CHARACTER_RESPONSE, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNIT_HEALTH_FREQUENT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNIT_SPELLCAST_START, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_UNHANDLED); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index c08a9409016..7155bd7970b 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -46,7 +46,7 @@ enum OpcodeClient : uint32 CMSG_ADD_IGNORE = 0xBADD, CMSG_ADD_VOICE_IGNORE = 0xBADD, CMSG_ALTER_APPEARANCE = 0xBADD, - CMSG_AREATRIGGER = 0xBADD, + CMSG_AREATRIGGER = 0x01B4, CMSG_AREA_SPIRIT_HEALER_QUERY = 0xBADD, CMSG_AREA_SPIRIT_HEALER_QUEUE = 0xBADD, CMSG_ARENA_TEAM_ACCEPT = 0xBADD, @@ -162,6 +162,7 @@ enum OpcodeClient : uint32 CMSG_CHAR_FACTION_CHANGE = 0xBADD, CMSG_CHAR_RACE_CHANGE = 0xBADD, CMSG_CHAR_RENAME = 0xBADD, + CMSG_CHAR_UNDELETE_ENUM = 0x0F2D, CMSG_CHAT_FILTERED = 0xBADD, CMSG_CHAT_IGNORED = 0xBADD, CMSG_CLEAR_CHANNEL_WATCH = 0xBADD, @@ -201,6 +202,7 @@ enum OpcodeClient : uint32 CMSG_EQUIPMENT_SET_DELETE = 0xBADD, CMSG_EQUIPMENT_SET_SAVE = 0x1B54, CMSG_EQUIPMENT_SET_USE = 0xBADD, + CMSG_FACTION_BONUS_INFO = 0x0928, CMSG_FAR_SIGHT = 0xBADD, CMSG_FORCE_MOVE_ROOT_ACK = 0xBADD, CMSG_FORCE_MOVE_UNROOT_ACK = 0xBADD, @@ -278,7 +280,7 @@ enum OpcodeClient : uint32 CMSG_GUILD_REPLACE_GUILD_MASTER = 0xBADD, CMSG_GUILD_REQUEST_CHALLENGE_UPDATE = 0xBADD, CMSG_GUILD_REQUEST_MAX_DAILY_XP = 0xBADD, - CMSG_GUILD_REQUEST_PARTY_STATE = 0xBADD, + CMSG_GUILD_REQUEST_PARTY_STATE = 0x0A8E, CMSG_GUILD_ROSTER = 0xBADD, CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0xBADD, CMSG_GUILD_SET_GUILD_MASTER = 0xBADD, @@ -443,8 +445,8 @@ enum OpcodeClient : uint32 CMSG_QUESTGIVER_QUERY_QUEST = 0x1924, CMSG_QUESTGIVER_QUEST_AUTOLAUNCH = 0xBADD, CMSG_QUESTGIVER_REQUEST_REWARD = 0xBADD, - CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0xBADD, - CMSG_QUESTGIVER_STATUS_QUERY = 0xBADD, + CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x0131, + CMSG_QUESTGIVER_STATUS_QUERY = 0x0704, CMSG_QUESTLOG_REMOVE_QUEST = 0xBADD, CMSG_QUESTLOG_SWAP_QUEST = 0xBADD, CMSG_QUEST_CONFIRM_ACCEPT = 0xBADD, @@ -458,7 +460,7 @@ enum OpcodeClient : uint32 CMSG_RECLAIM_CORPSE = 0xBADD, CMSG_REDIRECTION_AUTH_PROOF = 0x0485, CMSG_REFORGE_ITEM = 0xBADD, - CMSG_REORDER_CHARACTERS = 0xBADD, + CMSG_REORDER_CHARACTERS = 0x0DAA, CMSG_REPAIR_ITEM = 0xBADD, CMSG_REPLACE_ACCOUNT_DATA = 0xBADD, CMSG_REPOP_REQUEST = 0xBADD, @@ -567,6 +569,8 @@ enum OpcodeClient : uint32 CMSG_TUTORIAL_FLAG = 0xBADD, CMSG_TUTORIAL_RESET = 0xBADD, CMSG_UNACCEPT_TRADE = 0xBADD, + CMSG_UNDELETE_CHARACTER = 0x0D99, + CMSG_UNDELETE_COOLDOWN_STATUS_QUERY = 0x19A9, CMSG_UNLEARN_SKILL = 0xBADD, CMSG_UNLEARN_SPECIALIZATION = 0xBADD, CMSG_UNREGISTER_ALL_ADDON_PREFIXES = 0xBADD, @@ -738,6 +742,7 @@ enum OpcodeServer : uint32 SMSG_BATTLEGROUND_INFO_THROTTLED = 0xBADD, SMSG_BATTLEGROUND_PLAYER_JOINED = 0xBADD, SMSG_BATTLEGROUND_PLAYER_LEFT = 0xBADD, + SMSG_BATTLE_PET_JOURNAL = 0x19A2, SMSG_BINDER_CONFIRM = 0xBADD, SMSG_BINDPOINTUPDATE = 0x0A30, SMSG_BINDZONEREPLY = 0xBADD, @@ -916,7 +921,7 @@ enum OpcodeServer : uint32 SMSG_GROUP_SET_LEADER = 0xBADD, SMSG_GROUP_SET_ROLE = 0xBADD, SMSG_GROUP_UNINVITE = 0xBADD, - SMSG_GUILD_ACHIEVEMENT_DATA = 0xBADD, + SMSG_GUILD_ACHIEVEMENT_DATA = 0x1866, SMSG_GUILD_ACHIEVEMENT_DELETED = 0xBADD, SMSG_GUILD_ACHIEVEMENT_EARNED = 0xBADD, SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0xBADD, @@ -933,7 +938,7 @@ enum OpcodeServer : uint32 SMSG_GUILD_CRITERIA_DATA = 0xBADD, SMSG_GUILD_CRITERIA_DELETED = 0xBADD, SMSG_GUILD_DECLINE = 0xBADD, - SMSG_GUILD_EVENT = 0xBADD, + SMSG_GUILD_EVENT = 0x1027, SMSG_GUILD_EVENT_LOG_QUERY_RESULT = 0xBADD, SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x1228, SMSG_GUILD_FLAGGED_FOR_RENAME = 0xBADD, @@ -950,12 +955,12 @@ enum OpcodeServer : uint32 SMSG_GUILD_MOVE_STARTING = 0xBADD, SMSG_GUILD_NEWS_DELETED = 0xBADD, SMSG_GUILD_NEWS_UPDATE = 0xBADD, - SMSG_GUILD_PARTY_STATE_RESPONSE = 0xBADD, + SMSG_GUILD_PARTY_STATE_RESPONSE = 0x1225, SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0xBADD, SMSG_GUILD_QUERY_RESPONSE = 0x1046, SMSG_GUILD_RANK = 0x1218, SMSG_GUILD_RANKS_UPDATE = 0xBADD, - SMSG_GUILD_RECIPES = 0xBADD, + SMSG_GUILD_RECIPES = 0x1078, SMSG_GUILD_RENAMED = 0xBADD, SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0xBADD, SMSG_GUILD_REPUTATION_WEEKLY_CAP = 0xBADD, @@ -974,7 +979,8 @@ enum OpcodeServer : uint32 SMSG_HOTFIX_NOTIFY = 0xBADD, SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0xBADD, SMSG_IGNORE_REQUIREMENTS_CHEAT = 0xBADD, - SMSG_INITIALIZE_FACTIONS = 0xBADD, + SMSG_INITIALIZE_FACTIONS = 0x0B10, + SMSG_INITIAL_SETUP = 0x0B07, SMSG_INITIAL_SPELLS = 0x0A81, SMSG_INIT_CURRENCY = 0x0B06, SMSG_INIT_WORLD_STATES = 0x0B04, @@ -1013,7 +1019,7 @@ enum OpcodeServer : uint32 SMSG_LFG_OFFER_CONTINUE = 0xBADD, SMSG_LFG_OPEN_FROM_GOSSIP = 0xBADD, SMSG_LFG_PARTY_INFO = 0xBADD, - SMSG_LFG_PLAYER_INFO = 0xBADD, + SMSG_LFG_PLAYER_INFO = 0x0F36, SMSG_LFG_PLAYER_REWARD = 0xBADD, SMSG_LFG_PROPOSAL_UPDATE = 0xBADD, SMSG_LFG_QUEUE_STATUS = 0xBADD, @@ -1139,7 +1145,7 @@ enum OpcodeServer : uint32 SMSG_PARTY_MEMBER_STATS = 0xBADD, SMSG_PARTY_MEMBER_STATS_FULL = 0xBADD, SMSG_PAUSE_MIRROR_TIMER = 0xBADD, - SMSG_PERIODICAURALOG = 0xBADD, + SMSG_PERIODICAURALOG = 0x0B1B, SMSG_PETGODMODE = 0xBADD, SMSG_PETITION_ALREADY_SIGNED = 0xBADD, SMSG_PETITION_QUERY_RESPONSE = 0xBADD, @@ -1179,7 +1185,7 @@ enum OpcodeServer : uint32 SMSG_PLAY_SPELL_VISUAL_KIT = 0xBADD, SMSG_PLAY_TIME_WARNING = 0xBADD, SMSG_PONG = 0x17CA, - SMSG_POWER_UPDATE = 0xBADD, + SMSG_POWER_UPDATE = 0x0B27, SMSG_PRE_RESURRECT = 0xBADD, SMSG_PROCRESIST = 0xBADD, SMSG_PROPOSE_LEVEL_GRANT = 0xBADD, @@ -1196,8 +1202,8 @@ enum OpcodeServer : uint32 SMSG_QUESTGIVER_QUEST_INVALID = 0xBADD, SMSG_QUESTGIVER_QUEST_LIST = 0xBADD, SMSG_QUESTGIVER_REQUEST_ITEMS = 0xBADD, - SMSG_QUESTGIVER_STATUS = 0xBADD, - SMSG_QUESTGIVER_STATUS_MULTIPLE = 0xBADD, + SMSG_QUESTGIVER_STATUS = 0x1567, + SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x17C6, SMSG_QUESTLOG_FULL = 0xBADD, SMSG_QUESTUPDATE_ADD_ITEM = 0xBADD, SMSG_QUESTUPDATE_ADD_KILL = 0xBADD, @@ -1205,7 +1211,7 @@ enum OpcodeServer : uint32 SMSG_QUESTUPDATE_COMPLETE = 0xBADD, SMSG_QUESTUPDATE_FAILED = 0xBADD, SMSG_QUESTUPDATE_FAILEDTIMER = 0xBADD, - SMSG_QUEST_NPC_QUERY_RESPONSE = 0xBADD, + SMSG_QUEST_NPC_QUERY_RESPONSE = 0x1591, SMSG_QUEST_CONFIRM_ACCEPT = 0xBADD, SMSG_QUEST_FORCE_REMOVE = 0xBADD, SMSG_QUEST_POI_QUERY_RESPONSE = 0x1715, @@ -1245,7 +1251,6 @@ enum OpcodeServer : uint32 SMSG_RWHOIS = 0xBADD, SMSG_SELL_ITEM = 0xBADD, SMSG_SEND_MAIL_RESULT = 0x0302, - SMSG_SEND_SERVER_LOCATION = 0x153E, SMSG_SEND_UNLEARN_SPELLS = 0x1A82, SMSG_SERVERTIME = 0xBADD, SMSG_SERVER_FIRST_ACHIEVEMENT = 0xBADD, @@ -1268,6 +1273,7 @@ enum OpcodeServer : uint32 SMSG_SET_PLAY_HOVER_ANIM = 0xBADD, SMSG_SET_PROFICIENCY = 0x00D3, SMSG_SET_PROJECTILE_POSITION = 0xBADD, + SMSG_SET_TIME_ZONE_INFORMATION = 0x153E, SMSG_SET_VIGNETTE = 0x09AC, SMSG_SHOWTAXINODES = 0xBADD, SMSG_SHOW_BANK = 0x0204, @@ -1278,11 +1284,11 @@ enum OpcodeServer : uint32 SMSG_SPELLBREAKLOG = 0xBADD, SMSG_SPELLDAMAGESHIELD = 0xBADD, SMSG_SPELLDISPELLOG = 0xBADD, - SMSG_SPELLENERGIZELOG = 0xBADD, - SMSG_SPELLHEALLOG = 0xBADD, + SMSG_SPELLENERGIZELOG = 0x137C, + SMSG_SPELLHEALLOG = 0x0114, SMSG_SPELLINSTAKILLLOG = 0xBADD, SMSG_SPELLINTERRUPTLOG = 0xBADD, - SMSG_SPELLLOGEXECUTE = 0xBADD, + SMSG_SPELLLOGEXECUTE = 0x1823, SMSG_SPELLLOGMISS = 0xBADD, SMSG_SPELLNONMELEEDAMAGELOG = 0x11FB, SMSG_SPELLORDAMAGE_IMMUNE = 0xBADD, @@ -1358,14 +1364,16 @@ enum OpcodeServer : uint32 SMSG_TRAINER_BUY_SUCCEEDED = 0xBADD, SMSG_TRAINER_LIST = 0x0BA9, SMSG_TRANSFER_ABORTED = 0xBADD, - SMSG_TRANSFER_PENDING = 0xBADD, + SMSG_TRANSFER_PENDING = 0x172A, SMSG_TRIGGER_CINEMATIC = 0xBADD, SMSG_TRIGGER_MOVIE = 0xBADD, SMSG_TURN_IN_PETITION_RESULTS = 0xBADD, SMSG_TUTORIAL_FLAGS = 0x020F, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x0344, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x0310, SMSG_UNIT_HEALTH_FREQUENT = 0xBADD, SMSG_UNIT_SPELLCAST_START = 0xBADD, - SMSG_UPDATE_ACCOUNT_DATA = 0xBADD, + SMSG_UPDATE_ACCOUNT_DATA = 0x1520, SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0xBADD, SMSG_UPDATE_COMBO_POINTS = 0xBADD, SMSG_UPDATE_CURRENCY = 0xBADD, diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h index d04679adbd4..e7d6d4fb5b1 100644 --- a/src/server/game/Server/WorldPacket.h +++ b/src/server/game/Server/WorldPacket.h @@ -23,8 +23,6 @@ #include "Opcodes.h" #include "ByteBuffer.h" -struct z_stream_s; - class WorldPacket : public ByteBuffer { public: diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 1bc2dc7cc82..ac25da2d559 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -21,7 +21,6 @@ */ #include "WorldSocket.h" -#include "Packet.h" #include <zlib.h> #include "Config.h" #include "Common.h" @@ -49,6 +48,7 @@ #include "WardenWin.h" #include "WardenMac.h" #include "BattlenetServerManager.h" +#include "CharacterPackets.h" namespace { @@ -1042,25 +1042,32 @@ void WorldSession::SetPlayer(Player* player) void WorldSession::InitializeQueryCallbackParameters() { // Callback parameters that have pointers in them should be properly - // initialized to NULL here. - _charCreateCallback.SetParam(NULL); + // initialized to nullptr here. + _charRenameCallback.SetParam(nullptr); } void WorldSession::ProcessQueryCallbacks() { PreparedQueryResult result; - //! HandleCharEnumOpcode - if (_charEnumCallback.valid() && _charEnumCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + //! HandleCharEnumOpcode and HandleCharUndeleteEnumOpcode + if (_charEnumCallback.IsReady()) { - result = _charEnumCallback.get(); - HandleCharEnum(result); + _charEnumCallback.GetResult(result); + + if (bool undelete = _charEnumCallback.GetParam()) + HandleCharUndeleteEnum(result); + else + HandleCharEnum(result); + + _charEnumCallback.FreeResult(); } + //! HandleCharCreateOpcode if (_charCreateCallback.IsReady()) { _charCreateCallback.GetResult(result); - HandleCharCreateCallback(result, _charCreateCallback.GetParam()); + HandleCharCreateCallback(result, _charCreateCallback.GetParam().get()); } //! HandlePlayerLoginOpcode @@ -1083,12 +1090,27 @@ void WorldSession::ProcessQueryCallbacks() if (_charRenameCallback.IsReady()) { _charRenameCallback.GetResult(result); - CharacterRenameInfo* renameInfo = _charRenameCallback.GetParam(); - HandleChangePlayerNameOpcodeCallBack(result, renameInfo); + WorldPackets::Character::CharacterRenameInfo* renameInfo = _charRenameCallback.GetParam(); + HandleCharRenameCallBack(result, renameInfo); delete renameInfo; _charRenameCallback.Reset(); } + /// HandleUndeleteCooldownStatusOpcode + /// wait until no char undelete is in progress + if (!_charUndeleteCallback.GetStage() && _undeleteCooldownStatusCallback.IsReady()) + { + _undeleteCooldownStatusCallback.GetResult(result); + HandleUndeleteCooldownStatusCallback(result); + } + + /// HandleCharUndeleteOpcode + if (_charUndeleteCallback.IsReady()) + { + _charUndeleteCallback.GetResult(result); + HandleCharUndeleteCallback(result, _charUndeleteCallback.GetParam().get()); + } + //- HandleCharAddIgnoreOpcode if (_addIgnoreCallback.valid() && _addIgnoreCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready) { diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index f195bf2908d..6ab85070925 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -54,6 +54,7 @@ struct DeclinedName; struct ItemTemplate; struct MovementInfo; struct TradeStatusInfo; +struct z_stream_s; namespace lfg { @@ -73,10 +74,17 @@ class RBACData; namespace WorldPackets { - class ServerPacket; - namespace Character { + struct CharacterCreateInfo; + struct CharacterRenameInfo; + struct CharacterCustomizeInfo; + struct CharacterFactionChangeInfo; + struct CharacterUndeleteInfo; + + class CharacterCreate; + class CharacterDelete; + class UndeleteCharacter; class PlayerLogin; } } @@ -176,6 +184,7 @@ private: PacketFilter(PacketFilter const& right) = delete; PacketFilter& operator=(PacketFilter const& right) = delete; }; + //process only thread-safe packets in Map::Update() class MapSessionFilter : public PacketFilter { @@ -199,62 +208,6 @@ public: virtual bool Process(WorldPacket* packet) override; }; -// Proxy structure to contain data passed to callback function, -// only to prevent bloating the parameter list -class CharacterCreateInfo -{ - friend class WorldSession; - friend class Player; - - protected: - /// User specified variables - std::string Name; - uint8 Race = 0; - uint8 Class = 0; - uint8 Gender = GENDER_NONE; - uint8 Skin = 0; - uint8 Face = 0; - uint8 HairStyle = 0; - uint8 HairColor = 0; - uint8 FacialHair = 0; - uint8 OutfitId = 0; - - /// Server side data - uint8 CharCount = 0; -}; - -struct CharacterRenameInfo -{ - friend class WorldSession; - - protected: - ObjectGuid Guid; - std::string Name; -}; - -struct CharacterCustomizeInfo : public CharacterRenameInfo -{ - friend class Player; - friend class WorldSession; - - protected: - uint8 Gender = GENDER_NONE; - uint8 Skin = 0; - uint8 Face = 0; - uint8 HairStyle = 0; - uint8 HairColor = 0; - uint8 FacialHair = 0; -}; - -struct CharacterFactionChangeInfo : public CharacterCustomizeInfo -{ - friend class Player; - friend class WorldSession; - - protected: - uint8 Race = 0; -}; - struct PacketCounter { time_t lastReceiveTime; @@ -337,6 +290,9 @@ class WorldSession /// Handle the authentication waiting queue (to be completed) void SendAuthWaitQue(uint32 position); + void SendSetTimeZoneInformation(); + void SendFeatureSystemStatusGlueScreen(); + void SendNameQueryOpcode(ObjectGuid guid); void SendTrainerList(ObjectGuid guid); @@ -471,25 +427,38 @@ class WorldSession void Handle_ServerSide(WorldPacket& recvPacket); // sever side only, can't be accepted from client void Handle_Deprecated(WorldPacket& recvPacket); // never used anymore by client - void HandleCharEnumOpcode(WorldPacket& recvPacket); - void HandleCharDeleteOpcode(WorldPacket& recvPacket); - void HandleCharCreateOpcode(WorldPacket& recvPacket); - void HandleCharCreateCallback(PreparedQueryResult result, CharacterCreateInfo* createInfo); + void HandleCharEnum(PreparedQueryResult result); + void HandleCharEnumOpcode(WorldPacket& /*recvData*/); + void HandleCharUndeleteEnum(PreparedQueryResult result); + void HandleCharUndeleteEnumOpcode(WorldPacket& /*recvData*/); + void HandleCharDeleteOpcode(WorldPackets::Character::CharacterDelete& charDelete); + void HandleCharCreateOpcode(WorldPackets::Character::CharacterCreate& charCreate); + void HandleCharCreateCallback(PreparedQueryResult result, WorldPackets::Character::CharacterCreateInfo* createInfo); void HandlePlayerLoginOpcode(WorldPackets::Character::PlayerLogin& playerLogin); void HandleLoadScreenOpcode(WorldPacket& recvPacket); - void HandleCharEnum(PreparedQueryResult result); void HandlePlayerLogin(LoginQueryHolder * holder); + void HandleCharRenameOpcode(WorldPacket& recvData); + void HandleCharRenameCallBack(PreparedQueryResult result, WorldPackets::Character::CharacterRenameInfo const* renameInfo); + void HandleSetPlayerDeclinedNames(WorldPacket& recvData); + void HandleAlterAppearance(WorldPacket& recvData); void HandleCharFactionOrRaceChange(WorldPacket& recvData); void HandleRandomizeCharNameOpcode(WorldPacket& recvData); void HandleReorderCharacters(WorldPacket& recvData); void HandleOpeningCinematic(WorldPacket& recvData); + void HandleUndeleteCooldownStatusQuery(WorldPacket& /*recvData*/); + void HandleUndeleteCooldownStatusCallback(PreparedQueryResult result); + void HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCharacter& undeleteInfo); + void HandleCharUndeleteCallback(PreparedQueryResult result, WorldPackets::Character::CharacterUndeleteInfo* undeleteInfo); + void SendCharCreate(ResponseCodes result); void SendCharDelete(ResponseCodes result); - void SendCharRename(ResponseCodes result, CharacterRenameInfo const& renameInfo); - void SendCharCustomize(ResponseCodes result, CharacterCustomizeInfo const& customizeInfo); - void SendCharFactionChange(ResponseCodes result, CharacterFactionChangeInfo const& factionChangeInfo); + void SendCharRename(ResponseCodes result, WorldPackets::Character::CharacterRenameInfo const& renameInfo); + void SendCharCustomize(ResponseCodes result, WorldPackets::Character::CharacterCustomizeInfo const& customizeInfo); + void SendCharFactionChange(ResponseCodes result, WorldPackets::Character::CharacterFactionChangeInfo const& factionChangeInfo); void SendSetPlayerDeclinedNamesResult(DeclinedNameResult result, ObjectGuid guid); void SendBarberShopResult(BarberShopResult result); + void SendUndeleteCooldownStatusResponse(uint32 currentCooldown, uint32 maxCooldown); + void SendUndeleteCharacterResponse(CharacterUndeleteResult result, WorldPackets::Character::CharacterUndeleteInfo const* undeleteInfo); // played time void HandlePlayedTime(WorldPacket& recvPacket); @@ -858,10 +827,6 @@ class WorldSession void HandleSetActionBarToggles(WorldPacket& recvData); - void HandleCharRenameOpcode(WorldPacket& recvData); - void HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, CharacterRenameInfo const* renameInfo); - void HandleSetPlayerDeclinedNames(WorldPacket& recvData); - void HandleTotemDestroyed(WorldPacket& recvData); void HandleDismissCritter(WorldPacket& recvData); @@ -1026,7 +991,6 @@ class WorldSession // Miscellaneous void HandleSpellClick(WorldPacket& recvData); void HandleMirrorImageDataRequest(WorldPacket& recvData); - void HandleAlterAppearance(WorldPacket& recvData); void HandleRemoveGlyph(WorldPacket& recvData); void HandleCharCustomize(WorldPacket& recvData); void HandleQueryInspectAchievements(WorldPacket& recvData); @@ -1057,15 +1021,17 @@ class WorldSession void InitializeQueryCallbackParameters(); void ProcessQueryCallbacks(); - PreparedQueryResultFuture _charEnumCallback; PreparedQueryResultFuture _addIgnoreCallback; PreparedQueryResultFuture _stablePetCallback; - QueryCallback<PreparedQueryResult, CharacterRenameInfo*> _charRenameCallback; + QueryCallback<PreparedQueryResult, bool> _charEnumCallback; QueryCallback<PreparedQueryResult, std::string> _addFriendCallback; QueryCallback<PreparedQueryResult, uint32> _unstablePetCallback; QueryCallback<PreparedQueryResult, uint32> _stableSwapCallback; QueryCallback<PreparedQueryResult, ObjectGuid> _sendStabledPetCallback; - QueryCallback<PreparedQueryResult, CharacterCreateInfo*, true> _charCreateCallback; + QueryCallback<PreparedQueryResult, std::shared_ptr<WorldPackets::Character::CharacterCreateInfo>, true> _charCreateCallback; + QueryCallback<PreparedQueryResult, WorldPackets::Character::CharacterRenameInfo*> _charRenameCallback; + QueryCallback<PreparedQueryResult, bool, true> _undeleteCooldownStatusCallback; + QueryCallback<PreparedQueryResult, std::shared_ptr<WorldPackets::Character::CharacterUndeleteInfo>, true> _charUndeleteCallback; QueryResultHolderFuture _charLoginCallback; friend class World; |
