[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_subGroupsCounts(NULL)
{
for (int i = 0; i < TARGETICONCOUNT; ++i)
for (int i = 0; i < TARGET_ICON_COUNT; ++i)
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_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();
return true;
@ -869,12 +869,12 @@ void Group::CountTheRoll(Rolls::iterator& rollI)
void Group::SetTargetIcon(uint8 id, uint64 whoGuid, uint64 targetGuid)
{
if(id >= TARGETICONCOUNT)
if(id >= TARGET_ICON_COUNT)
return;
// clean other icons
if( targetGuid != 0 )
for(int i = 0; i < TARGETICONCOUNT; ++i)
for(int i = 0; i < TARGET_ICON_COUNT; ++i)
if( m_targetIcons[i] == targetGuid )
SetTargetIcon(i, 0, 0);
@ -934,10 +934,10 @@ void Group::SendTargetIconList(WorldSession *session)
if(!session)
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
for(int i = 0; i < TARGETICONCOUNT; ++i)
for(int i = 0; i < TARGET_ICON_COUNT; ++i)
{
if(m_targetIcons[i] == 0)
continue;
@ -1066,9 +1066,9 @@ bool Group::_addMember(const uint64 &guid, const char* name, bool isAssistant)
if (m_subGroupsCounts)
{
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;
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
{
for(int i = 0; i < TARGETICONCOUNT; ++i)
for(int i = 0; i < TARGET_ICON_COUNT; ++i)
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);
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
void Group::ChangeMembersGroup(const uint64 &guid, const uint8 &group)
void Group::ChangeMembersGroup(const uint64 &guid, uint8 group)
{
if(!isRaidGroup())
if (!isRaidGroup())
return;
Player *player = sObjectMgr.GetPlayer(guid);
if (!player)
{
uint8 prevSubGroup;
prevSubGroup = GetMemberGroup(guid);
SubGroupCounterDecrease(prevSubGroup);
uint8 prevSubGroup = GetMemberGroup(guid);
if (prevSubGroup == group)
return;
if(_setMembersGroup(guid, group))
{
SubGroupCounterDecrease(prevSubGroup);
SendUpdate();
}
}
else
// This methods handles itself groupcounter decrease
@ -1349,14 +1352,18 @@ void Group::ChangeMembersGroup(const uint64 &guid, const uint8 &group)
}
// 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;
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);
//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

View file

@ -28,9 +28,10 @@
#include <map>
#include <vector>
#define MAXGROUPSIZE 5
#define MAXRAIDSIZE 40
#define TARGETICONCOUNT 8
#define MAX_GROUP_SIZE 5
#define MAX_RAID_SIZE 40
#define MAX_RAID_SUBGROUPS (MAX_RAID_SIZE / MAX_GROUP_SIZE)
#define TARGET_ICON_COUNT 8
enum LootMethod
{
@ -196,7 +197,7 @@ class MANGOS_DLL_SPEC Group
// properties accessories
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 isBGGroup() const { return m_bgGroup != NULL; }
bool IsCreated() const { return GetMembersCount() > 0; }
@ -251,7 +252,7 @@ class MANGOS_DLL_SPEC Group
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;
@ -264,7 +265,7 @@ class MANGOS_DLL_SPEC Group
{
member_citerator mslot = _getMemberCSlot(guid);
if(mslot==m_memberSlots.end())
return (MAXRAIDSIZE/MAXGROUPSIZE+1);
return MAX_RAID_SUBGROUPS + 1;
return mslot->group;
}
@ -275,10 +276,10 @@ class MANGOS_DLL_SPEC Group
void SetBattlegroundGroup(BattleGround *bg) { m_bgGroup = bg; }
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(Player *player, const uint8 &group);
void ChangeMembersGroup(const uint64 &guid, uint8 group);
void ChangeMembersGroup(Player *player, uint8 group);
void SetAssistant(uint64 guid, const bool &state)
void SetAssistant(uint64 guid, bool state)
{
if(!isRaidGroup())
return;
@ -355,7 +356,7 @@ class MANGOS_DLL_SPEC Group
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 _setMainTank(const uint64 &guid);
bool _setMainAssistant(const uint64 &guid);
@ -366,9 +367,9 @@ class MANGOS_DLL_SPEC Group
{
// Sub group counters initialization
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)
++m_subGroupsCounts[itr->group];
@ -421,7 +422,7 @@ class MANGOS_DLL_SPEC Group
Difficulty m_dungeonDifficulty;
Difficulty m_raidDifficulty;
BattleGround* m_bgGroup;
uint64 m_targetIcons[TARGETICONCOUNT];
uint64 m_targetIcons[TARGET_ICON_COUNT];
LootMethod m_lootMethod;
ItemQualities m_lootThreshold;
uint64 m_looterGuid;

View file

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