Core/Packets: implement SMSG_DISENCHANT_CREDIT

This commit is contained in:
Ovahlord committed 2020-11-17 01:17:38 +01:00
1 parent 04d3144b5b
commit d72fde4309
4 files changed
+77 -9

No files matched your search

+23 -8
View File
@@ -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();
}
}
}
+14 -1
View File
@@ -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<Player*> 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;
};
@@ -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;
}
@@ -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;
};
}
}