diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-01-18 19:52:49 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-01-18 19:52:49 +0100 |
commit | a50b1d09240fee0650b0a22b0456d41c4a45abe4 (patch) | |
tree | 46819ace349fc6500de3e538fa46798121536f28 /src | |
parent | 34a07db263d7f6f6099af79acb131ce744633c3b (diff) |
Core/Items: Updated item socketing opcodes
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Item/Container/Bag.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ItemPackets.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ItemPackets.h | 23 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PacketUtilities.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
8 files changed, 61 insertions, 25 deletions
diff --git a/src/server/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp index f5d77ff1d55..315362be09d 100644 --- a/src/server/game/Entities/Item/Container/Bag.cpp +++ b/src/server/game/Entities/Item/Container/Bag.cpp @@ -210,7 +210,7 @@ uint32 Bag::GetItemCount(uint32 item, Item* eItem) const for (uint32 i=0; i < GetBagSize(); ++i) { pItem = m_bagslot[i]; - if (pItem && pItem != eItem && pItem->GetTemplate()->ExtendedData->SocketColor[0]) + if (pItem && pItem != eItem && pItem->GetSocketColor(0)) count += pItem->GetGemCountWithID(item); } } diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index dc53f5937d8..7efcd196372 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1040,12 +1040,14 @@ bool Item::IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) cons void Item::SendUpdateSockets() { - WorldPacket data(SMSG_SOCKET_GEMS, 8+4+4+4+4); - data << GetGUID(); - for (uint32 i = SOCK_ENCHANTMENT_SLOT; i <= BONUS_ENCHANTMENT_SLOT; ++i) - data << uint32(GetEnchantmentId(EnchantmentSlot(i))); + WorldPackets::Item::SocketGemsResult socketGems; + socketGems.Item = GetGUID(); + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) + socketGems.Sockets[i] = int32(GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + i))); - GetOwner()->GetSession()->SendPacket(&data); + socketGems.SocketMatch = int32(GetEnchantmentId(BONUS_ENCHANTMENT_SLOT)); + + GetOwner()->GetSession()->SendPacket(socketGems.Write()); } // Though the client has the information in the item's data field, diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index a85f6788e3a..7a88c3a1315 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -851,24 +851,17 @@ void WorldSession::HandleWrapItem(WorldPackets::Item::WrapItem& packet) _player->DestroyItemCount(gift, count, true); } -void WorldSession::HandleSocketOpcode(WorldPacket& recvData) +void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) { - ObjectGuid item_guid; - ObjectGuid gem_guids[MAX_GEM_SOCKETS]; - - recvData >> item_guid; - if (!item_guid) + if (!socketGems.ItemGuid) return; - for (int i = 0; i < MAX_GEM_SOCKETS; ++i) - recvData >> gem_guids[i]; - //cheat -> tried to socket same gem multiple times - if ((!gem_guids[0].IsEmpty() && (gem_guids[0] == gem_guids[1] || gem_guids[0] == gem_guids[2])) || - (!gem_guids[1].IsEmpty() && (gem_guids[1] == gem_guids[2]))) + if ((!socketGems.GemItem[0].IsEmpty() && (socketGems.GemItem[0] == socketGems.GemItem[1] || socketGems.GemItem[0] == socketGems.GemItem[2])) || + (!socketGems.GemItem[1].IsEmpty() && (socketGems.GemItem[1] == socketGems.GemItem[2]))) return; - Item* itemTarget = _player->GetItemByGuid(item_guid); + Item* itemTarget = _player->GetItemByGuid(socketGems.ItemGuid); if (!itemTarget) //missing item to socket return; @@ -881,7 +874,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData) Item* Gems[MAX_GEM_SOCKETS]; for (int i = 0; i < MAX_GEM_SOCKETS; ++i) - Gems[i] = !gem_guids[i].IsEmpty() ? _player->GetItemByGuid(gem_guids[i]) : NULL; + Gems[i] = !socketGems.GemItem[i].IsEmpty() ? _player->GetItemByGuid(socketGems.GemItem[i]) : NULL; GemPropertiesEntry const* GemProps[MAX_GEM_SOCKETS]; for (int i = 0; i < MAX_GEM_SOCKETS; ++i) //get geminfo from dbc storage @@ -889,7 +882,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData) // Find first prismatic socket int32 firstPrismatic = 0; - while (firstPrismatic < MAX_GEM_SOCKETS && itemProto->ExtendedData->SocketColor[firstPrismatic]) + while (firstPrismatic < MAX_GEM_SOCKETS && itemTarget->GetSocketColor(firstPrismatic)) ++firstPrismatic; for (int i = 0; i < MAX_GEM_SOCKETS; ++i) //check for hack maybe @@ -898,7 +891,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData) continue; // tried to put gem in socket where no socket exists (take care about prismatic sockets) - if (!itemProto->ExtendedData->SocketColor[i]) + if (!itemTarget->GetSocketColor(i)) { // no prismatic socket if (!itemTarget->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT)) @@ -1030,7 +1023,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData) if (GemEnchants[i]) { itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID()); - if (Item* guidItem = _player->GetItemByGuid(gem_guids[i])) + if (Item* guidItem = _player->GetItemByGuid(socketGems.GemItem[i])) { uint32 gemCount = 1; _player->DestroyItemCount(guidItem, gemCount, true); diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 4bc04201cab..ab25edcecf0 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -523,3 +523,19 @@ void WorldPackets::Item::UseCritterItem::Read() { _worldPacket >> ItemGuid; } + +void WorldPackets::Item::SocketGems::Read() +{ + _worldPacket >> ItemGuid; + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) + _worldPacket >> GemItem[i]; +} + +WorldPacket const* WorldPackets::Item::SocketGemsResult::Write() +{ + _worldPacket << Item; + _worldPacket.append(Sockets, MAX_GEM_SOCKETS); + _worldPacket << int32(SocketMatch); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index 143796bc66d..ecf264b1fde 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -492,6 +492,29 @@ namespace WorldPackets ObjectGuid ItemGuid; }; + class SocketGems final : public ClientPacket + { + public: + SocketGems(WorldPacket&& packet) : ClientPacket(CMSG_SOCKET_GEMS, std::move(packet)) { } + + void Read() override; + + ObjectGuid ItemGuid; + ObjectGuid GemItem[MAX_GEM_SOCKETS]; + }; + + class SocketGemsResult final : public ServerPacket + { + public: + SocketGemsResult() : ServerPacket(SMSG_SOCKET_GEMS, 16 + 4 * 3 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid Item; + int32 Sockets[MAX_GEM_SOCKETS] = {}; + int32 SocketMatch = 0; + }; + ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate); } } diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index 9e655360834..60c8994afc5 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -22,6 +22,7 @@ #include <G3D/Vector2.h> #include <G3D/Vector3.h> #include <sstream> +#include <array> inline ByteBuffer& operator<<(ByteBuffer& data, G3D::Vector2 const& v) { diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 2bb394a289e..b768cb8dc2a 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -716,7 +716,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SHOW_TRADE_SKILL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SIGN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::SignPetition, &WorldSession::HandleSignPetition); DEFINE_HANDLER(CMSG_SILENCE_PARTY_TALKER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SOCKET_GEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSocketOpcode ); + DEFINE_HANDLER(CMSG_SOCKET_GEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SocketGems, &WorldSession::HandleSocketGems); DEFINE_HANDLER(CMSG_SORT_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SORT_BANK_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SORT_REAGENT_BANK_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -1596,7 +1596,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_TAXI_NODES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_TRADE_SKILL_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOCKET_GEMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOCKET_GEMS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOR_START_EXPERIENCE_INCOMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPECIAL_MOUNT_ANIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ABSORB_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 9743000fec5..506ecddd1a2 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -355,6 +355,7 @@ namespace WorldPackets class CancelTempEnchantment; class TransmogrifyItems; class UseCritterItem; + class SocketGems; } namespace Loot @@ -1522,7 +1523,7 @@ class WorldSession void HandleRequestPetInfoOpcode(WorldPacket& recvData); // Socket gem - void HandleSocketOpcode(WorldPacket& recvData); + void HandleSocketGems(WorldPackets::Item::SocketGems& socketGems); void HandleCancelTempEnchantmentOpcode(WorldPackets::Item::CancelTempEnchantment& cancelTempEnchantment); |