[9951] Fixed bug with raid subgroup size update at move member to another.

Also some code cleanups
This commit is contained in:
VladimirMangos 2010-05-22 11:31:27 +04:00
parent 5940bd7d07
commit 29c0efe9b4
3 changed files with 43 additions and 35 deletions

View file

@ -41,7 +41,7 @@ Group::Group() : m_Id(0), m_leaderGuid(0), m_mainTank(0), m_mainAssistant(0), m
m_bgGroup(NULL), m_lootMethod(FREE_FOR_ALL), m_looterGuid(0), m_lootThreshold(ITEM_QUALITY_UNCOMMON), m_bgGroup(NULL), m_lootMethod(FREE_FOR_ALL), m_looterGuid(0), m_lootThreshold(ITEM_QUALITY_UNCOMMON),
m_subGroupsCounts(NULL) m_subGroupsCounts(NULL)
{ {
for (int i = 0; i < TARGETICONCOUNT; ++i) for (int i = 0; i < TARGET_ICON_COUNT; ++i)
m_targetIcons[i] = 0; m_targetIcons[i] = 0;
} }
@ -159,7 +159,7 @@ bool Group::LoadGroupFromDB(Field* fields)
m_looterGuid = MAKE_NEW_GUID(fields[3].GetUInt32(), 0, HIGHGUID_PLAYER); m_looterGuid = MAKE_NEW_GUID(fields[3].GetUInt32(), 0, HIGHGUID_PLAYER);
m_lootThreshold = (ItemQualities)fields[4].GetUInt16(); m_lootThreshold = (ItemQualities)fields[4].GetUInt16();
for(int i = 0; i < TARGETICONCOUNT; ++i) for(int i = 0; i < TARGET_ICON_COUNT; ++i)
m_targetIcons[i] = fields[5+i].GetUInt64(); m_targetIcons[i] = fields[5+i].GetUInt64();
return true; return true;
@ -869,12 +869,12 @@ void Group::CountTheRoll(Rolls::iterator& rollI)
void Group::SetTargetIcon(uint8 id, uint64 whoGuid, uint64 targetGuid) void Group::SetTargetIcon(uint8 id, uint64 whoGuid, uint64 targetGuid)
{ {
if(id >= TARGETICONCOUNT) if(id >= TARGET_ICON_COUNT)
return; return;
// clean other icons // clean other icons
if( targetGuid != 0 ) if( targetGuid != 0 )
for(int i = 0; i < TARGETICONCOUNT; ++i) for(int i = 0; i < TARGET_ICON_COUNT; ++i)
if( m_targetIcons[i] == targetGuid ) if( m_targetIcons[i] == targetGuid )
SetTargetIcon(i, 0, 0); SetTargetIcon(i, 0, 0);
@ -934,10 +934,10 @@ void Group::SendTargetIconList(WorldSession *session)
if(!session) if(!session)
return; return;
WorldPacket data(MSG_RAID_TARGET_UPDATE, (1+TARGETICONCOUNT*9)); WorldPacket data(MSG_RAID_TARGET_UPDATE, (1+TARGET_ICON_COUNT*9));
data << uint8(1); // list targets data << uint8(1); // list targets
for(int i = 0; i < TARGETICONCOUNT; ++i) for(int i = 0; i < TARGET_ICON_COUNT; ++i)
{ {
if(m_targetIcons[i] == 0) if(m_targetIcons[i] == 0)
continue; continue;
@ -1066,9 +1066,9 @@ bool Group::_addMember(const uint64 &guid, const char* name, bool isAssistant)
if (m_subGroupsCounts) if (m_subGroupsCounts)
{ {
bool groupFound = false; bool groupFound = false;
for (; groupid < MAXRAIDSIZE / MAXGROUPSIZE; ++groupid) for (; groupid < MAX_RAID_SUBGROUPS; ++groupid)
{ {
if (m_subGroupsCounts[groupid] < MAXGROUPSIZE) if (m_subGroupsCounts[groupid] < MAX_GROUP_SIZE)
{ {
groupFound = true; groupFound = true;
break; break;
@ -1121,7 +1121,7 @@ bool Group::_addMember(const uint64 &guid, const char* name, bool isAssistant, u
if(!isRaidGroup()) // reset targetIcons for non-raid-groups if(!isRaidGroup()) // reset targetIcons for non-raid-groups
{ {
for(int i = 0; i < TARGETICONCOUNT; ++i) for(int i = 0; i < TARGET_ICON_COUNT; ++i)
m_targetIcons[i] = 0; m_targetIcons[i] = 0;
} }
@ -1260,7 +1260,7 @@ void Group::_removeRolls(const uint64 &guid)
} }
} }
bool Group::_setMembersGroup(const uint64 &guid, const uint8 &group) bool Group::_setMembersGroup(const uint64 &guid, uint8 group)
{ {
member_witerator slot = _getMemberWSlot(guid); member_witerator slot = _getMemberWSlot(guid);
if(slot == m_memberSlots.end()) if(slot == m_memberSlots.end())
@ -1327,21 +1327,24 @@ bool Group::SameSubGroup(Player const* member1, Player const* member2) const
} }
// allows setting subgroup for offline members // allows setting subgroup for offline members
void Group::ChangeMembersGroup(const uint64 &guid, const uint8 &group) void Group::ChangeMembersGroup(const uint64 &guid, uint8 group)
{ {
if(!isRaidGroup()) if (!isRaidGroup())
return; return;
Player *player = sObjectMgr.GetPlayer(guid); Player *player = sObjectMgr.GetPlayer(guid);
if (!player) if (!player)
{ {
uint8 prevSubGroup; uint8 prevSubGroup = GetMemberGroup(guid);
prevSubGroup = GetMemberGroup(guid); if (prevSubGroup == group)
return;
SubGroupCounterDecrease(prevSubGroup);
if(_setMembersGroup(guid, group)) if(_setMembersGroup(guid, group))
{
SubGroupCounterDecrease(prevSubGroup);
SendUpdate(); SendUpdate();
}
} }
else else
// This methods handles itself groupcounter decrease // This methods handles itself groupcounter decrease
@ -1349,14 +1352,18 @@ void Group::ChangeMembersGroup(const uint64 &guid, const uint8 &group)
} }
// only for online members // only for online members
void Group::ChangeMembersGroup(Player *player, const uint8 &group) void Group::ChangeMembersGroup(Player *player, uint8 group)
{ {
if(!player || !isRaidGroup()) if (!player || !isRaidGroup())
return; return;
if(_setMembersGroup(player->GetGUID(), group))
uint8 prevSubGroup = player->GetSubGroup();
if (prevSubGroup == group)
return;
if (_setMembersGroup(player->GetGUID(), group))
{ {
uint8 prevSubGroup = player->GetSubGroup(); if (player->GetGroup() == this)
if( player->GetGroup() == this )
player->GetGroupRef().setSubGroup(group); player->GetGroupRef().setSubGroup(group);
//if player is in BG raid, it is possible that he is also in normal raid - and that normal raid is stored in m_originalGroup reference //if player is in BG raid, it is possible that he is also in normal raid - and that normal raid is stored in m_originalGroup reference
else else

View file

@ -28,9 +28,10 @@
#include <map> #include <map>
#include <vector> #include <vector>
#define MAXGROUPSIZE 5 #define MAX_GROUP_SIZE 5
#define MAXRAIDSIZE 40 #define MAX_RAID_SIZE 40
#define TARGETICONCOUNT 8 #define MAX_RAID_SUBGROUPS (MAX_RAID_SIZE / MAX_GROUP_SIZE)
#define TARGET_ICON_COUNT 8
enum LootMethod enum LootMethod
{ {
@ -196,7 +197,7 @@ class MANGOS_DLL_SPEC Group
// properties accessories // properties accessories
uint32 GetId() const { return m_Id; } uint32 GetId() const { return m_Id; }
bool IsFull() const { return (m_groupType == GROUPTYPE_NORMAL) ? (m_memberSlots.size() >= MAXGROUPSIZE) : (m_memberSlots.size() >= MAXRAIDSIZE); } bool IsFull() const { return (m_groupType == GROUPTYPE_NORMAL) ? (m_memberSlots.size() >= MAX_GROUP_SIZE) : (m_memberSlots.size() >= MAX_RAID_SIZE); }
bool isRaidGroup() const { return m_groupType & GROUPTYPE_RAID; } bool isRaidGroup() const { return m_groupType & GROUPTYPE_RAID; }
bool isBGGroup() const { return m_bgGroup != NULL; } bool isBGGroup() const { return m_bgGroup != NULL; }
bool IsCreated() const { return GetMembersCount() > 0; } bool IsCreated() const { return GetMembersCount() > 0; }
@ -251,7 +252,7 @@ class MANGOS_DLL_SPEC Group
bool HasFreeSlotSubGroup(uint8 subgroup) const bool HasFreeSlotSubGroup(uint8 subgroup) const
{ {
return (m_subGroupsCounts && m_subGroupsCounts[subgroup] < MAXGROUPSIZE); return (m_subGroupsCounts && m_subGroupsCounts[subgroup] < MAX_GROUP_SIZE);
} }
bool SameSubGroup(Player const* member1, Player const* member2) const; bool SameSubGroup(Player const* member1, Player const* member2) const;
@ -264,7 +265,7 @@ class MANGOS_DLL_SPEC Group
{ {
member_citerator mslot = _getMemberCSlot(guid); member_citerator mslot = _getMemberCSlot(guid);
if(mslot==m_memberSlots.end()) if(mslot==m_memberSlots.end())
return (MAXRAIDSIZE/MAXGROUPSIZE+1); return MAX_RAID_SUBGROUPS + 1;
return mslot->group; return mslot->group;
} }
@ -275,10 +276,10 @@ class MANGOS_DLL_SPEC Group
void SetBattlegroundGroup(BattleGround *bg) { m_bgGroup = bg; } void SetBattlegroundGroup(BattleGround *bg) { m_bgGroup = bg; }
GroupJoinBattlegroundResult CanJoinBattleGroundQueue(BattleGround const* bgOrTemplate, BattleGroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot); GroupJoinBattlegroundResult CanJoinBattleGroundQueue(BattleGround const* bgOrTemplate, BattleGroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot);
void ChangeMembersGroup(const uint64 &guid, const uint8 &group); void ChangeMembersGroup(const uint64 &guid, uint8 group);
void ChangeMembersGroup(Player *player, const uint8 &group); void ChangeMembersGroup(Player *player, uint8 group);
void SetAssistant(uint64 guid, const bool &state) void SetAssistant(uint64 guid, bool state)
{ {
if(!isRaidGroup()) if(!isRaidGroup())
return; return;
@ -355,7 +356,7 @@ class MANGOS_DLL_SPEC Group
void _removeRolls(const uint64 &guid); void _removeRolls(const uint64 &guid);
bool _setMembersGroup(const uint64 &guid, const uint8 &group); bool _setMembersGroup(const uint64 &guid, uint8 group);
bool _setAssistantFlag(const uint64 &guid, const bool &state); bool _setAssistantFlag(const uint64 &guid, const bool &state);
bool _setMainTank(const uint64 &guid); bool _setMainTank(const uint64 &guid);
bool _setMainAssistant(const uint64 &guid); bool _setMainAssistant(const uint64 &guid);
@ -366,9 +367,9 @@ class MANGOS_DLL_SPEC Group
{ {
// Sub group counters initialization // Sub group counters initialization
if (!m_subGroupsCounts) if (!m_subGroupsCounts)
m_subGroupsCounts = new uint8[MAXRAIDSIZE / MAXGROUPSIZE]; m_subGroupsCounts = new uint8[MAX_RAID_SUBGROUPS];
memset((void*)m_subGroupsCounts, 0, (MAXRAIDSIZE / MAXGROUPSIZE)*sizeof(uint8)); memset((void*)m_subGroupsCounts, 0, MAX_RAID_SUBGROUPS * sizeof(uint8));
for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr) for (member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr)
++m_subGroupsCounts[itr->group]; ++m_subGroupsCounts[itr->group];
@ -421,7 +422,7 @@ class MANGOS_DLL_SPEC Group
Difficulty m_dungeonDifficulty; Difficulty m_dungeonDifficulty;
Difficulty m_raidDifficulty; Difficulty m_raidDifficulty;
BattleGround* m_bgGroup; BattleGround* m_bgGroup;
uint64 m_targetIcons[TARGETICONCOUNT]; uint64 m_targetIcons[TARGET_ICON_COUNT];
LootMethod m_lootMethod; LootMethod m_lootMethod;
ItemQualities m_lootThreshold; ItemQualities m_lootThreshold;
uint64 m_looterGuid; uint64 m_looterGuid;

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "9950" #define REVISION_NR "9951"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__