aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/CharacterHandler.cpp1
-rw-r--r--src/game/Group.cpp29
-rw-r--r--src/game/Group.h7
-rw-r--r--src/game/ItemHandler.cpp4
-rw-r--r--src/game/ItemPrototype.h12
-rw-r--r--src/game/LootMgr.h11
-rw-r--r--src/game/WorldSession.cpp5
7 files changed, 61 insertions, 8 deletions
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);