aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h2
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp96
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h177
-rw-r--r--src/server/game/Server/Packets/SystemPackets.cpp43
-rw-r--r--src/server/game/Server/Packets/SystemPackets.h53
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp17
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h52
-rw-r--r--src/server/game/Server/WorldPacket.h2
-rw-r--r--src/server/game/Server/WorldSession.cpp42
-rw-r--r--src/server/game/Server/WorldSession.h114
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;