From d72fde430929a6b7f2cafb5f55cbfe90d5986431 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Tue, 17 Nov 2020 01:17:38 +0100 Subject: [PATCH] Core/Packets: implement SMSG_DISENCHANT_CREDIT --- src/server/game/Groups/Group.cpp | 31 ++++++++++++++----- src/server/game/Groups/Group.h | 15 ++++++++- .../game/Server/Packets/LootPackets.cpp | 29 +++++++++++++++++ src/server/game/Server/Packets/LootPackets.h | 11 +++++++ 4 files changed, 77 insertions(+), 9 deletions(-) diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index b60a5c22e4..1f25dfd861 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -65,8 +65,10 @@ Loot* Roll::getLoot() Group::Group() : m_leaderGuid(), m_leaderName(""), m_groupType(GROUPTYPE_NORMAL), m_dungeonDifficulty(DUNGEON_DIFFICULTY_NORMAL), m_raidDifficulty(RAID_DIFFICULTY_10MAN_NORMAL), m_bgGroup(nullptr), m_bfGroup(nullptr), m_lootMethod(FREE_FOR_ALL), m_lootThreshold(ITEM_QUALITY_UNCOMMON), m_looterGuid(), -m_masterLooterGuid(), m_subGroupsCounts(nullptr), m_guid(), m_counter(0), m_maxEnchantingLevel(0), m_dbStoreId(0) +m_masterLooterGuid(), m_subGroupsCounts(nullptr), m_guid(), m_counter(0), m_dbStoreId(0) { + m_disenchantInfo.Initialize(); + for (uint8 i = 0; i < TARGETICONCOUNT; ++i) m_targetIcons[i].Clear(); } @@ -540,8 +542,11 @@ bool Group::AddMember(Player* player) player->RemoveFieldNotifyFlag(UF_FLAG_PARTY_MEMBER); } - if (m_maxEnchantingLevel < player->GetSkillValue(SKILL_ENCHANTING)) - m_maxEnchantingLevel = player->GetSkillValue(SKILL_ENCHANTING); + if (m_disenchantInfo.MaxDisenchantSkillLevel < player->GetSkillValue(SKILL_ENCHANTING)) + { + m_disenchantInfo.MaxDisenchantSkillLevel = player->GetSkillValue(SKILL_ENCHANTING); + m_disenchantInfo.DisenchanterGUID = player->GetGUID(); + } return true; } @@ -1079,7 +1084,7 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) { r->setLoot(loot); r->itemSlot = itemSlot; - if (item->DisenchantID && m_maxEnchantingLevel >= item->RequiredDisenchantSkill) + if (item->DisenchantID && m_disenchantInfo.MaxDisenchantSkillLevel >= item->RequiredDisenchantSkill) r->rollVoteMask |= ROLL_FLAG_TYPE_DISENCHANT; loot->items[itemSlot].is_blocked = true; @@ -1219,7 +1224,7 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) { r->setLoot(loot); r->itemSlot = itemSlot; - if (item->DisenchantID && m_maxEnchantingLevel >= item->RequiredDisenchantSkill) + if (item->DisenchantID && m_disenchantInfo.MaxDisenchantSkillLevel >= item->RequiredDisenchantSkill) r->rollVoteMask |= ROLL_FLAG_TYPE_DISENCHANT; if (item->GetFlags2() & ITEM_FLAG2_CAN_ONLY_ROLL_GREED) @@ -1562,6 +1567,13 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap) } else if (rollvote == DISENCHANT) { + WorldPackets::Loot::DisenchantCredit disenchantCredit; + disenchantCredit.Disenchanter = m_disenchantInfo.DisenchanterGUID; + disenchantCredit.Item.ItemID = item->itemid; + disenchantCredit.Item.RandomPropertiesID = item->randomPropertyId; + disenchantCredit.Item.RandomPropertiesSeed = item->randomSuffix; + BroadcastPacket(disenchantCredit.Write(), false); + item->is_looted = true; roll->getLoot()->NotifyItemRemoved(roll->itemSlot); roll->getLoot()->unlootedCount--; @@ -2523,13 +2535,16 @@ void Group::BroadcastGroupUpdate(void) void Group::ResetMaxEnchantingLevel() { - m_maxEnchantingLevel = 0; + m_disenchantInfo.Initialize(); Player* member = nullptr; for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { member = ObjectAccessor::FindPlayer(citr->guid); - if (member && m_maxEnchantingLevel < member->GetSkillValue(SKILL_ENCHANTING)) - m_maxEnchantingLevel = member->GetSkillValue(SKILL_ENCHANTING); + if (member && m_disenchantInfo.MaxDisenchantSkillLevel < member->GetSkillValue(SKILL_ENCHANTING)) + { + m_disenchantInfo.MaxDisenchantSkillLevel = member->GetSkillValue(SKILL_ENCHANTING); + m_disenchantInfo.DisenchanterGUID = member->GetGUID(); + } } } diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 19a79516f4..27a01315db 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -200,6 +200,19 @@ class TC_GAME_API Group typedef MemberSlotList::const_iterator member_citerator; typedef std::unordered_map< uint32 /*mapId*/, InstanceGroupBind> BoundInstancesMap; + + struct GroupDisenchantInfo + { + ObjectGuid DisenchanterGUID; + uint32 MaxDisenchantSkillLevel; + + void Initialize() + { + DisenchanterGUID = ObjectGuid::Empty; + MaxDisenchantSkillLevel = 0; + } + }; + protected: typedef MemberSlotList::iterator member_witerator; typedef std::set InvitesList; @@ -415,7 +428,7 @@ class TC_GAME_API Group uint8* m_subGroupsCounts; ObjectGuid m_guid; uint32 m_counter; // used only in SMSG_GROUP_LIST - uint32 m_maxEnchantingLevel; + GroupDisenchantInfo m_disenchantInfo; uint32 m_dbStoreId; // Represents the ID used in database (Can be reused by other groups if group was disbanded) RaidMarkerList m_raidMarkers; }; diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp index edb3f5fc18..bcecaa919d 100644 --- a/src/server/game/Server/Packets/LootPackets.cpp +++ b/src/server/game/Server/Packets/LootPackets.cpp @@ -48,3 +48,32 @@ WorldPacket const* WorldPackets::Loot::LootList::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Loot::DisenchantCredit::Write() +{ + _worldPacket.WriteBit(Disenchanter[0]); + _worldPacket.WriteBit(Disenchanter[6]); + _worldPacket.WriteBit(Disenchanter[3]); + _worldPacket.WriteBit(Disenchanter[1]); + _worldPacket.WriteBit(Disenchanter[7]); + _worldPacket.WriteBit(Disenchanter[5]); + _worldPacket.WriteBit(Disenchanter[2]); + _worldPacket.WriteBit(Disenchanter[4]); + + _worldPacket << int32(Item.ItemID); + + _worldPacket.WriteByteSeq(Disenchanter[4]); + _worldPacket.WriteByteSeq(Disenchanter[1]); + + _worldPacket << int32(Item.RandomPropertiesID); + _worldPacket << int32(Item.RandomPropertiesSeed); + + _worldPacket.WriteByteSeq(Disenchanter[6]); + _worldPacket.WriteByteSeq(Disenchanter[5]); + _worldPacket.WriteByteSeq(Disenchanter[2]); + _worldPacket.WriteByteSeq(Disenchanter[7]); + _worldPacket.WriteByteSeq(Disenchanter[3]); + _worldPacket.WriteByteSeq(Disenchanter[0]); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h index 793405e3e0..0e6e680938 100644 --- a/src/server/game/Server/Packets/LootPackets.h +++ b/src/server/game/Server/Packets/LootPackets.h @@ -77,6 +77,17 @@ namespace WorldPackets ObjectGuid Master; ObjectGuid RoundRobinWinner; }; + + class DisenchantCredit final : public ServerPacket + { + public: + DisenchantCredit() : ServerPacket(SMSG_DISENCHANT_CREDIT, 8 + 12) { } + + WorldPacket const* Write() override; + + ObjectGuid Disenchanter; + WorldPackets::Item::ItemInstance Item; + }; } }