diff options
| author | joschiwald <joschiwald.trinity@gmail.com> | 2014-10-31 14:47:56 +0100 |
|---|---|---|
| committer | joschiwald <joschiwald.trinity@gmail.com> | 2014-10-31 14:47:56 +0100 |
| commit | 310c33d96f77909dd38cd2bb89d20ec858ace807 (patch) | |
| tree | 7346cce82178f40dd13cabe56a71cf399e7ebc56 /src/server/game/Server | |
| parent | e9e1f5b018f8d526b605e48eae686c2a68c66811 (diff) | |
Core/NetworkIO: update SMSG_CHAR_ENUM and CMSG_PLAYER_LOGIN
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packet.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Server/Packet.h | 6 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/AuthenticationPackets.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/AuthenticationPackets.h | 5 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.cpp | 196 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.h | 116 |
6 files changed, 320 insertions, 7 deletions
diff --git a/src/server/game/Server/Packet.cpp b/src/server/game/Server/Packet.cpp index bff5643f410..10b472bee67 100644 --- a/src/server/game/Server/Packet.cpp +++ b/src/server/game/Server/Packet.cpp @@ -17,6 +17,6 @@ #include "Packet.h" -WorldPackets::ServerPacket::ServerPacket(OpcodeServer opcode, size_t initialSize = 200) : Packet(WorldPacket(opcode, initialSize)) +WorldPackets::ServerPacket::ServerPacket(OpcodeServer opcode, size_t initialSize /*= 200*/) : Packet(WorldPacket(opcode, initialSize)) { } diff --git a/src/server/game/Server/Packet.h b/src/server/game/Server/Packet.h index bda0166098d..e7baf830944 100644 --- a/src/server/game/Server/Packet.h +++ b/src/server/game/Server/Packet.h @@ -33,6 +33,7 @@ namespace WorldPackets virtual void Read() = 0; WorldPacket& GetWorldPacket() { return _worldPacket; } + size_t GetSize() const { return _worldPacket.size(); } protected: WorldPacket _worldPacket; @@ -41,11 +42,10 @@ namespace WorldPackets class ServerPacket : public Packet { public: - ServerPacket(OpcodeServer opcode, size_t initialSize); + ServerPacket(OpcodeServer opcode, size_t initialSize = 200); void Read() override final { ASSERT(!"Read not implemented for server packets."); } - size_t GetSize() const { return _worldPacket.size(); } void Reset() { _worldPacket.clear(); } }; @@ -58,4 +58,4 @@ namespace WorldPackets }; } -#endif +#endif // PacketBaseWorld_h__ diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index c64ef37d320..ae3c13b64f5 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -49,7 +49,7 @@ void WorldPackets::Auth::AuthSession::Read() } WorldPackets::Auth::AuthResponse::AuthResponse() - : ServerPacket(SMSG_AUTH_RESPONSE, 132) + : ServerPacket(SMSG_AUTH_RESPONSE, 132) { WaitInfo.HasValue = false; SuccessInfo.HasValue = false; diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index 41b3d7cb257..305a841d4e7 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -15,7 +15,8 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef AuthenticationPackets_h__ +#ifndef AuthenticationPacketsWorld_h__ +#define AuthenticationPacketsWorld_h__ #include "Packet.h" #include "Util.h" @@ -134,4 +135,4 @@ namespace WorldPackets } } -#endif +#endif // AuthenticationPacketsWorld_h__ diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp new file mode 100644 index 00000000000..ff44777ac79 --- /dev/null +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -0,0 +1,196 @@ +/* + * 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 "CharacterPackets.h" + +WorldPackets::Character::CharEnumResult::CharacterInfo::CharacterInfo(Field* fields) +{ + // 0 1 2 3 4 5 6 7 + // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.playerBytes, characters.playerBytes2, characters.level, " + // 8 9 10 11 12 13 14 + // "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, guild_member.guildid, characters.playerFlags, " + // 15 16 17 18 19 20 21 22 + // "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.data, character_banned.guid, characters.slot, character_declinedname.genitive" + + Guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); + Name = fields[1].GetString(); + Race = fields[2].GetUInt8(); + Class = fields[3].GetUInt8(); + Sex = fields[4].GetUInt8(); + Skin = uint8(fields[5].GetUInt32() & 0xFF); + Face = uint8((fields[5].GetUInt32() >> 8) & 0xFF); + HairStyle = uint8((fields[5].GetUInt32() >> 16) & 0xFF); + 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(); + PreLoadPosition.x = fields[10].GetFloat(); + PreLoadPosition.y = fields[11].GetFloat(); + PreLoadPosition.z = fields[12].GetFloat(); + + if (uint32 guildId = fields[13].GetUInt32()) + GuildGuid = ObjectGuid::Create<HighGuid::Guild>(guildId); + + uint32 playerFlags = fields[14].GetUInt32(); + uint32 atLoginFlags = fields[15].GetUInt16(); + + if (playerFlags & PLAYER_FLAGS_HIDE_HELM) + Flags |= CHARACTER_FLAG_HIDE_HELM; + + if (playerFlags & PLAYER_FLAGS_HIDE_CLOAK) + Flags |= CHARACTER_FLAG_HIDE_CLOAK; + + if (playerFlags & PLAYER_FLAGS_GHOST) + Flags |= CHARACTER_FLAG_GHOST; + + if (atLoginFlags & AT_LOGIN_RENAME) + Flags |= CHARACTER_FLAG_RENAME; + + if (fields[20].GetUInt32()) + Flags |= CHARACTER_FLAG_LOCKED_BY_BILLING; + + if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[22].GetString().empty()) + Flags |= CHARACTER_FLAG_DECLINED; + + if (atLoginFlags & AT_LOGIN_CUSTOMIZE) + CustomizationFlag = CHAR_CUSTOMIZE_FLAG_CUSTOMIZE; + else if (atLoginFlags & AT_LOGIN_CHANGE_FACTION) + CustomizationFlag = CHAR_CUSTOMIZE_FLAG_FACTION; + else if (atLoginFlags & AT_LOGIN_CHANGE_RACE) + CustomizationFlag = CHAR_CUSTOMIZE_FLAG_RACE; + + Flags3 = 0; + FirstLogin = (atLoginFlags & AT_LOGIN_FIRST) != 0; + + // show pet at selection character in character list only for non-ghost character + if (!(playerFlags & PLAYER_FLAGS_GHOST) && (Class == CLASS_WARLOCK || Class == CLASS_HUNTER || Class == CLASS_DEATH_KNIGHT)) + { + if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(fields[16].GetUInt32())) + { + Pet.CreatureDisplayId = fields[17].GetUInt32(); + Pet.Level = fields[18].GetUInt16(); + Pet.CreatureFamily = creatureInfo->family; + } + } + + BoostInProgress = false; + ProfessionIds[0] = 0; + ProfessionIds[1] = 0; + + Tokenizer equipment(fields[19].GetString(), ' '); + ListPosition = fields[21].GetUInt8(); + + for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) + { + uint32 visualBase = slot * 2; + uint32 itemId = Player::GetUInt32ValueFromArray(equipment, visualBase); + if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId)) + { + uint32 enchants = Player::GetUInt32ValueFromArray(equipment, visualBase + 1); + for (uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot) + { + // values stored in 2 uint16 + uint32 enchantId = 0x0000FFFF & (enchants >> enchantSlot * 16); + if (!enchantId) + continue; + + if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId)) + { + VisualItems[slot].DisplayEnchantId = enchant->aura_id; + break; + } + } + + VisualItems[slot].DisplayId = proto->DisplayInfoID; + VisualItems[slot].InventoryType = uint8(proto->InventoryType); + } + } +} + +WorldPackets::Character::CharEnumResult::CharEnumResult() + : ServerPacket(SMSG_CHAR_ENUM) { } + +void WorldPackets::Character::CharEnumResult::Write() +{ + _worldPacket.reserve(9 + Characters.size() * sizeof(CharacterInfo) + FactionChangeRestrictions.size() * sizeof(RestrictedFactionChangeRuleInfo)); + + _worldPacket.WriteBit(Success); + _worldPacket.WriteBit(IsDeletedCharacters); + _worldPacket << uint32(Characters.size()); + _worldPacket << uint32(FactionChangeRestrictions.size()); + + for (CharacterInfo const& charInfo : Characters) + { + _worldPacket << charInfo.Guid; + _worldPacket << uint8(charInfo.ListPosition); + _worldPacket << uint8(charInfo.Race); + _worldPacket << uint8(charInfo.Class); + _worldPacket << uint8(charInfo.Sex); + _worldPacket << uint8(charInfo.Skin); + _worldPacket << uint8(charInfo.Face); + _worldPacket << uint8(charInfo.HairStyle); + _worldPacket << uint8(charInfo.HairColor); + _worldPacket << uint8(charInfo.FacialHair); + _worldPacket << uint8(charInfo.Level); + _worldPacket << uint32(charInfo.ZoneId); + _worldPacket << uint32(charInfo.MapId); + _worldPacket << float(charInfo.PreLoadPosition.x); + _worldPacket << float(charInfo.PreLoadPosition.y); + _worldPacket << float(charInfo.PreLoadPosition.z); + _worldPacket << charInfo.GuildGuid; + _worldPacket << uint32(charInfo.Flags); + _worldPacket << uint32(charInfo.CustomizationFlag); + _worldPacket << uint32(charInfo.Flags3); + _worldPacket << uint32(charInfo.Pet.CreatureDisplayId); + _worldPacket << uint32(charInfo.Pet.Level); + _worldPacket << uint32(charInfo.Pet.CreatureFamily); + + _worldPacket << uint32(charInfo.ProfessionIds[0]); + _worldPacket << uint32(charInfo.ProfessionIds[1]); + + for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) + { + _worldPacket << uint32(charInfo.VisualItems[slot].DisplayId); + _worldPacket << uint32(charInfo.VisualItems[slot].DisplayEnchantId); + _worldPacket << uint8(charInfo.VisualItems[slot].InventoryType); + } + + _worldPacket.WriteBits(charInfo.Name.length(), 6); + _worldPacket.WriteBit(charInfo.FirstLogin); + _worldPacket.WriteBit(charInfo.BoostInProgress); + _worldPacket.WriteString(charInfo.Name); + } + + for (RestrictedFactionChangeRuleInfo const& rule : FactionChangeRestrictions) + { + _worldPacket << uint32(rule.Mask); + _worldPacket << uint8(rule.Race); + } +} + +WorldPackets::Character::PlayerLogin::PlayerLogin(WorldPacket&& packet) + : ClientPacket(std::move(packet)) +{ + ASSERT(_worldPacket.GetOpcode() == CMSG_PLAYER_LOGIN); +} + +void WorldPackets::Character::PlayerLogin::Read() +{ + _worldPacket >> Guid; + _worldPacket >> FarClip; +} diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h new file mode 100644 index 00000000000..2f8b069164a --- /dev/null +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -0,0 +1,116 @@ +/* + * 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 CharacterPackets_h__ +#define CharacterPackets_h__ + +#include "Packet.h" +#include "Player.h" + +namespace WorldPackets +{ + namespace Character + { + class CharEnumResult final : public ServerPacket + { + public: + struct CharacterInfo + { + /** + * @fn void WorldPackets::Character::CharEnumResult::CharacterInfo::CharacterInfo(Field* fields); + * + * @brief Initialize the struct with values from QueryResult + * + * @param fields Field set of CharacterDatabaseStatements::CHAR_SEL_ENUM + */ + CharacterInfo(Field* fields); + + ObjectGuid Guid; + std::string Name; + uint8 ListPosition = 0; ///< Order of the characters in list + uint8 Race = 0; + uint8 Class = 0; + uint8 Sex = 0; + uint8 Skin = 0; + uint8 Face = 0; + uint8 HairStyle = 0; + uint8 HairColor = 0; + uint8 FacialHair = 0; + uint8 Level = 0; + uint32 ZoneId = 0; + uint32 MapId = 0; + G3D::Vector3 PreLoadPosition; + ObjectGuid GuildGuid; + uint32 Flags = 0; ///< Character flag @see enum CharacterFlags + uint32 CustomizationFlag = 0; ///< Character customization flags @see enum CharacterCustomizeFlags + uint32 Flags3 = 0; ///< Character flags 3 @todo research + bool FirstLogin = false; + + struct PetInfo + { + uint32 CreatureDisplayId = 0; ///< PetCreatureDisplayID + uint32 Level = 0; ///< PetExperienceLevel + uint32 CreatureFamily = 0; ///< PetCreatureFamilyID + } Pet; + + bool BoostInProgress = false; ///< @todo + uint32 ProfessionIds[2]; ///< @todo + + struct VisualItemInfo + { + uint32 DisplayId = 0; + uint32 DisplayEnchantId = 0; + uint8 InventoryType = 0; + }; + + VisualItemInfo VisualItems[INVENTORY_SLOT_BAG_END]; + }; + + struct RestrictedFactionChangeRuleInfo + { + RestrictedFactionChangeRuleInfo(uint32 mask, uint8 race) + : Mask(mask), Race(race) { } + + uint32 Mask = 0; + uint8 Race = 0; + }; + + CharEnumResult(); + + void Write() override; + + bool Success = false; ///< + bool IsDeletedCharacters = false; ///< used for character undelete list + + std::list<CharacterInfo> Characters; ///< all characters on the list + std::list<RestrictedFactionChangeRuleInfo> FactionChangeRestrictions; ///< @todo: research + }; + + class PlayerLogin final : public ClientPacket + { + public: + PlayerLogin(WorldPacket&& packet); + + void Read() override; + + ObjectGuid Guid; ///< Guid of the player that is logging in + float FarClip = 0.0f; ///< Visibility distance (for terrain) + }; + } +} + +#endif // CharacterPackets_h__ |
