diff options
author | Shauren <krzysiek.7.5.4@gmail.com> | 2010-05-21 22:45:47 +0200 |
---|---|---|
committer | Shauren <krzysiek.7.5.4@gmail.com> | 2010-05-21 22:45:47 +0200 |
commit | 7c1a189bd39ea11bbb42c412b57fa7421286cf98 (patch) | |
tree | 1a624bdb7f4f558c7e71959501ba1d1fb8217b8f | |
parent | 1b5d171d0bf617fe00a41314d6b264fc679e7d56 (diff) |
Fixed disenchanting rolls being allowed for all items, now works as intended
Renamed Faction to Flags2 in ItemPrototype and added use for some of them
yay, my first commit :D
--HG--
branch : trunk
-rw-r--r-- | sql/updates/8255_world_item_template.sql | 1 | ||||
-rw-r--r-- | src/game/CharacterHandler.cpp | 1 | ||||
-rw-r--r-- | src/game/Group.cpp | 29 | ||||
-rw-r--r-- | src/game/Group.h | 7 | ||||
-rw-r--r-- | src/game/ItemHandler.cpp | 4 | ||||
-rw-r--r-- | src/game/ItemPrototype.h | 12 | ||||
-rw-r--r-- | src/game/LootMgr.h | 11 | ||||
-rw-r--r-- | src/game/WorldSession.cpp | 5 |
8 files changed, 62 insertions, 8 deletions
diff --git a/sql/updates/8255_world_item_template.sql b/sql/updates/8255_world_item_template.sql new file mode 100644 index 00000000000..7fc29b24834 --- /dev/null +++ b/sql/updates/8255_world_item_template.sql @@ -0,0 +1 @@ +ALTER TABLE `item_template` CHANGE `Faction` `FlagsExtra` INT(10) UNSIGNED NOT NULL DEFAULT '0'; diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index d7f5d11cdfe..f82b6edfc56 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -732,6 +732,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) { //pCurrChar->groupInfo.group->SendInit(this); // useless group->SendUpdate(); + group->ResetMaxEnchantingLevel(); } // friend status diff --git a/src/game/Group.cpp b/src/game/Group.cpp index 02708bae0bb..87e02cb8148 100644 --- a/src/game/Group.cpp +++ b/src/game/Group.cpp @@ -46,6 +46,7 @@ Group::Group() m_subGroupsCounts = NULL; m_guid = 0; m_counter = 0; + m_maxEnchantingLevel= 0; for (uint8 i = 0; i < TARGETICONCOUNT; ++i) m_targetIcons[i] = 0; @@ -332,6 +333,9 @@ bool Group::AddMember(const uint64 &guid, const char* name) // quest related GO state dependent from raid memebership if (isRaidGroup()) player->UpdateForQuestWorldObjects(); + + if (m_maxEnchantingLevel < player->GetSkillValue(SKILL_ENCHANTING)) + m_maxEnchantingLevel = player->GetSkillValue(SKILL_ENCHANTING); } return true; @@ -384,6 +388,7 @@ uint32 Group::RemoveMember(const uint64 &guid, const uint8 &method) } SendUpdate(); + ResetMaxEnchantingLevel(); } // if group before remove <= 2 disband it else @@ -504,7 +509,7 @@ void Group::SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll &r) data << uint32(r.itemRandomPropId); // item random property ID data << uint32(r.itemCount); // items in stack data << uint32(CountDown); // the countdown time to choose "need" or "greed" - data << uint8(ALL_ROLL_TYPE_MASK); // roll type mask + data << uint8(r.rollVoteMask); // roll type mask for (Roll::PlayerVote::const_iterator itr=r.playerVote.begin(); itr != r.playerVote.end(); ++itr) { @@ -655,6 +660,11 @@ void Group::GroupLoot(Loot *loot, WorldObject* pLootedObject) { r->setLoot(loot); r->itemSlot = itemSlot; + if (item->DisenchantID && m_maxEnchantingLevel >= item->RequiredDisenchantSkill) + r->rollVoteMask |= ROLL_FLAG_TYPE_DISENCHANT; + + if (item->Flags2 & ITEM_FLAGS_EXTRA_NEED_ROLL_DISABLED) + r->rollVoteMask &= ~ROLL_FLAG_TYPE_NEED; loot->items[itemSlot].is_blocked = true; @@ -744,6 +754,11 @@ void Group::NeedBeforeGreed(Loot *loot, WorldObject* pLootedObject) { r->setLoot(loot); r->itemSlot = itemSlot; + if (item->DisenchantID && m_maxEnchantingLevel >= item->RequiredDisenchantSkill) + r->rollVoteMask |= ROLL_FLAG_TYPE_DISENCHANT; + + if (item->Flags2 & ITEM_FLAGS_EXTRA_NEED_ROLL_DISABLED) + r->rollVoteMask &= ~ROLL_FLAG_TYPE_NEED; loot->items[itemSlot].is_blocked = true; @@ -1827,3 +1842,15 @@ void Group::BroadcastGroupUpdate(void) } } } + +void Group::ResetMaxEnchantingLevel() +{ + m_maxEnchantingLevel = 0; + Player *pMember = NULL; + for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) + { + if (pMember = objmgr.GetPlayer(citr->guid)) + if (m_maxEnchantingLevel < pMember->GetSkillValue(SKILL_ENCHANTING)) + m_maxEnchantingLevel = pMember->GetSkillValue(SKILL_ENCHANTING); + } +} diff --git a/src/game/Group.h b/src/game/Group.h index 3dc98ee6d04..c8f49b5702a 100644 --- a/src/game/Group.h +++ b/src/game/Group.h @@ -115,7 +115,7 @@ class Roll : public LootValidatorRef public: Roll(uint64 _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid), itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count), - totalPlayersRolling(0), totalNeed(0), totalGreed(0), totalPass(0), itemSlot(0) {} + totalPlayersRolling(0), totalNeed(0), totalGreed(0), totalPass(0), itemSlot(0), rollVoteMask(ROLL_ALL_TYPE_NO_DISENCHANT) {} ~Roll() { } void setLoot(Loot *pLoot) { link(pLoot, this); } Loot *getLoot() { return getTarget(); } @@ -133,6 +133,7 @@ class Roll : public LootValidatorRef uint8 totalGreed; uint8 totalPass; uint8 itemSlot; + uint8 rollVoteMask; }; struct InstanceGroupBind @@ -345,6 +346,9 @@ class Group void CountRollVote(const uint64& playerGUID, const uint64& Guid, uint32 NumberOfPlayers, uint8 Choise); void EndRoll(Loot *loot); + // related to disenchant rolls + void ResetMaxEnchantingLevel(); + void LinkMember(GroupReference *pRef) { m_memberMgr.insertFirst(pRef); } void DelinkMember(GroupReference* /*pRef*/) { } @@ -451,5 +455,6 @@ class Group uint8* m_subGroupsCounts; uint64 m_guid; uint32 m_counter; // used only in SMSG_GROUP_LIST + uint32 m_maxEnchantingLevel; }; #endif diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp index c42c104afae..8ce578055b7 100644 --- a/src/game/ItemHandler.cpp +++ b/src/game/ItemHandler.cpp @@ -319,7 +319,7 @@ void WorldSession::HandleItemQuerySingleOpcode(WorldPacket & recv_data) data << pProto->DisplayInfoID; data << pProto->Quality; data << pProto->Flags; - data << pProto->Faction; // 3.2 faction? + data << pProto->Flags2; data << pProto->BuyPrice; data << pProto->SellPrice; data << pProto->InventoryType; @@ -765,7 +765,7 @@ void WorldSession::SendListInventory(uint64 vendorguid) // `item_template`.`Faction` is actually `Team`. // 1 == Horde / 2 == Alliance. Field will be renamed in later // patch. - if (pProto->Faction == 1 && _player->GetTeam() == ALLIANCE || pProto->Faction == 2 && _player->GetTeam() == HORDE && !_player->isGameMaster()) + if (pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && _player->GetTeam() == ALLIANCE || pProto->Flags2 == ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && _player->GetTeam() == HORDE && !_player->isGameMaster()) continue; ++count; diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h index e547f56db84..31025005a15 100644 --- a/src/game/ItemPrototype.h +++ b/src/game/ItemPrototype.h @@ -131,6 +131,14 @@ enum ITEM_FLAGS ITEM_FLAGS_BOP_TRADEABLE = 0x80000000 }; +enum ItemFlagsExtra +{ + ITEM_FLAGS_EXTRA_HORDE_ONLY = 0x00000001, + ITEM_FLAGS_EXTRA_ALLIANCE_ONLY = 0x00000002, + ITEM_FLAGS_EXTRA_REFUNDABLE = 0x00000004, + ITEM_FLAGS_EXTRA_NEED_ROLL_DISABLED = 0x00000100 +}; + enum BAG_FAMILY_MASK { BAG_FAMILY_MASK_NONE = 0x00000000, @@ -524,8 +532,8 @@ struct ItemPrototype char* Name1; uint32 DisplayInfoID; // id from ItemDisplayInfo.dbc uint32 Quality; - int32 Flags; - uint32 Faction; + uint32 Flags; + uint32 Flags2; uint32 BuyCount; int32 BuyPrice; uint32 SellPrice; diff --git a/src/game/LootMgr.h b/src/game/LootMgr.h index 2e095fb35ba..1f443f47fb9 100644 --- a/src/game/LootMgr.h +++ b/src/game/LootMgr.h @@ -38,7 +38,16 @@ enum RollType MAX_ROLL_TYPE = 4 }; -#define ALL_ROLL_TYPE_MASK 0x0F +enum RollMask +{ + ROLL_FLAG_TYPE_PASS = 0x01, + ROLL_FLAG_TYPE_NEED = 0x02, + ROLL_FLAG_TYPE_GREED = 0x04, + ROLL_FLAG_TYPE_DISENCHANT = 0x08, + + ROLL_ALL_TYPE_NO_DISENCHANT = 0x07, + ROLL_ALL_TYPE_MASK = 0x0F +}; #define MAX_NR_LOOT_ITEMS 16 // note: the client cannot show more than 16 items total diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index ee1dee0859c..ea78eb22fb8 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -433,9 +433,12 @@ void WorldSession::LogoutPlayer(bool Save) if (_player->GetGroup() && !_player->GetGroup()->isRaidGroup() && m_Socket) _player->RemoveFromGroup(); - ///- Send update to group + ///- Send update to group and reset stored max enchanting level if (_player->GetGroup()) + { _player->GetGroup()->SendUpdate(); + _player->GetGroup()->ResetMaxEnchantingLevel(); + } ///- Broadcast a logout message to the player's friends sSocialMgr.SendFriendStatus(_player, FRIEND_OFFLINE, _player->GetGUIDLow(), true); |