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
This commit is contained in:
Shauren
2010-05-21 22:45:47 +02:00
parent 1b5d171d0b
commit 7c1a189bd3
8 changed files with 62 additions and 8 deletions
+1
View File
@@ -732,6 +732,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
{
//pCurrChar->groupInfo.group->SendInit(this); // useless
group->SendUpdate();
group->ResetMaxEnchantingLevel();
}
// friend status
+28 -1
View File
@@ -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);
}
}
+6 -1
View File
@@ -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
+2 -2
View File
@@ -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;
+10 -2
View File
@@ -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;
+10 -1
View File
@@ -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
+4 -1
View File
@@ -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);