aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-01-18 19:52:49 +0100
committerShauren <shauren.trinity@gmail.com>2016-01-18 19:52:49 +0100
commita50b1d09240fee0650b0a22b0456d41c4a45abe4 (patch)
tree46819ace349fc6500de3e538fa46798121536f28 /src
parent34a07db263d7f6f6099af79acb131ce744633c3b (diff)
Core/Items: Updated item socketing opcodes
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Item/Container/Bag.cpp2
-rw-r--r--src/server/game/Entities/Item/Item.cpp12
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp25
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp16
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h23
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h1
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h3
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);