aboutsummaryrefslogtreecommitdiff
path: root/src/game/Group.cpp
diff options
context:
space:
mode:
authorSpp <none@none>2010-05-08 01:58:47 +0200
committerSpp <none@none>2010-05-08 01:58:47 +0200
commitd6df19cd9948ff6d108f88e0d8c77bdbda5922ab (patch)
treec5ebf7fc17c69aebad723a0190902f524a41fd2d /src/game/Group.cpp
parent0d06050eb409c2b14dff199379ad89551bcdd93f (diff)
Add GUID to groups
--HG-- branch : trunk
Diffstat (limited to 'src/game/Group.cpp')
-rw-r--r--src/game/Group.cpp170
1 files changed, 88 insertions, 82 deletions
diff --git a/src/game/Group.cpp b/src/game/Group.cpp
index 9b7ec6ec20d..91d6a263c85 100644
--- a/src/game/Group.cpp
+++ b/src/game/Group.cpp
@@ -37,14 +37,14 @@
Group::Group()
{
m_leaderGuid = 0;
- m_groupType = (GroupType)0;
+ m_groupType = GroupType(0);
m_bgGroup = NULL;
- m_lootMethod = (LootMethod)0;
+ m_lootMethod = LootMethod(0);
m_looterGuid = 0;
m_lootThreshold = ITEM_QUALITY_UNCOMMON;
m_subGroupsCounts = NULL;
- for (int i=0; i<TARGETICONCOUNT; ++i)
+ for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
m_targetIcons[i] = 0;
}
@@ -80,6 +80,8 @@ Group::~Group()
bool Group::Create(const uint64 &guid, const char * name)
{
+ uint32 lowguid = objmgr.GenerateLowGuid(HIGHGUID_GROUP);
+ m_guid = MAKE_NEW_GUID(lowguid, 0, HIGHGUID_GROUP);
m_leaderGuid = guid;
m_leaderName = name;
@@ -107,80 +109,81 @@ bool Group::Create(const uint64 &guid, const char * name)
// store group in database
CharacterDatabase.BeginTransaction();
- CharacterDatabase.PExecute("DELETE FROM groups WHERE leaderGuid ='%u'", GUID_LOPART(m_leaderGuid));
- CharacterDatabase.PExecute("DELETE FROM group_member WHERE leaderGuid ='%u'", GUID_LOPART(m_leaderGuid));
- CharacterDatabase.PExecute("INSERT INTO groups (leaderGuid,lootMethod,looterGuid,lootThreshold,icon1,icon2,icon3,icon4,icon5,icon6,icon7,icon8,groupType,difficulty,raiddifficulty) "
- "VALUES ('%u','%u','%u','%u','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','%u','%u','%u')",
- GUID_LOPART(m_leaderGuid), uint32(m_lootMethod),
+ CharacterDatabase.PExecute("DELETE FROM groups WHERE guid ='%u'", lowguid);
+ CharacterDatabase.PExecute("DELETE FROM group_member WHERE guid ='%u'", lowguid);
+ CharacterDatabase.PExecute("INSERT INTO groups (guid,leaderGuid,lootMethod,looterGuid,lootThreshold,icon1,icon2,icon3,icon4,icon5,icon6,icon7,icon8,groupType,difficulty,raiddifficulty) "
+ "VALUES ('%u','%u','%u','%u','%u','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','%u','%u','%u')",
+ lowguid, GUID_LOPART(m_leaderGuid), uint32(m_lootMethod),
GUID_LOPART(m_looterGuid), uint32(m_lootThreshold), m_targetIcons[0], m_targetIcons[1], m_targetIcons[2], m_targetIcons[3], m_targetIcons[4], m_targetIcons[5], m_targetIcons[6], m_targetIcons[7], uint8(m_groupType), uint32(m_dungeonDifficulty), m_raidDifficulty);
+ if (!AddMember(guid, name))
+ {
+ CharacterDatabase.RollbackTransaction();
+ return false;
+ }
+ CharacterDatabase.CommitTransaction();
}
-
- if (!AddMember(guid, name))
- {
- CharacterDatabase.RollbackTransaction();
+ else if (!AddMember(guid, name))
return false;
- }
-
- if (!isBGGroup()) CharacterDatabase.CommitTransaction();
return true;
}
-bool Group::LoadGroupFromDB(const uint64 &leaderGuid, QueryResult_AutoPtr result, bool loadMembers)
+bool Group::LoadGroupFromDB(const uint64 &groupGuid, QueryResult_AutoPtr result, bool loadMembers)
{
if (isBGGroup())
return false;
- bool external = true;
+ uint32 groupLowGuid = GUID_LOPART(groupGuid);
if (!result)
{
- external = false;
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13
- result = CharacterDatabase.PQuery("SELECT lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raiddifficulty FROM groups WHERE leaderGuid ='%u'", GUID_LOPART(leaderGuid));
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+ result = CharacterDatabase.PQuery("SELECT leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raiddifficulty FROM groups WHERE guid=%u", groupLowGuid);
+
if (!result)
return false;
}
-
- m_leaderGuid = leaderGuid;
+ Field *fields = result->Fetch();
+ m_guid = groupGuid;
+ m_leaderGuid = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER);
// group leader not exist
- if (!objmgr.GetPlayerNameByGUID(m_leaderGuid, m_leaderName))
+ if (!objmgr.GetPlayerNameByGUID(fields[0].GetUInt32(), m_leaderName))
return false;
- m_groupType = GroupType((*result)[11].GetUInt8());
+ m_lootMethod = (LootMethod)fields[1].GetUInt8();
+ m_looterGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER);
+ m_lootThreshold = (ItemQualities)fields[3].GetUInt16();
+
+ for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
+ m_targetIcons[i] = fields[4+i].GetUInt64();
+ m_groupType = GroupType(fields[12].GetUInt8());
if (m_groupType & GROUPTYPE_RAID)
_initRaidSubGroupsCounter();
- uint32 diff = (*result)[12].GetUInt8();
+ uint32 diff = fields[13].GetUInt8();
if (diff >= MAX_DUNGEON_DIFFICULTY)
diff = DUNGEON_DIFFICULTY_NORMAL;
m_dungeonDifficulty = Difficulty(diff);
- uint32 r_diff = (*result)[13].GetUInt8();
+ uint32 r_diff = fields[14].GetUInt8();
if (r_diff >= MAX_RAID_DIFFICULTY)
r_diff = RAID_DIFFICULTY_10MAN_NORMAL;
m_raidDifficulty = Difficulty(r_diff);
- m_lootMethod = (LootMethod)(*result)[0].GetUInt8();
- m_looterGuid = MAKE_NEW_GUID((*result)[1].GetUInt32(), 0, HIGHGUID_PLAYER);
- m_lootThreshold = (ItemQualities)(*result)[2].GetUInt16();
-
- for (int i=0; i<TARGETICONCOUNT; ++i)
- m_targetIcons[i] = (*result)[3+i].GetUInt64();
-
if (loadMembers)
{
- result = CharacterDatabase.PQuery("SELECT memberGuid, memberFlags, subgroup FROM group_member WHERE leaderGuid ='%u'", GUID_LOPART(leaderGuid));
+ result = CharacterDatabase.PQuery("SELECT memberGuid, memberFlags, subgroup FROM group_member WHERE guid=%u", groupLowGuid);
if (!result)
return false;
do
{
- LoadMemberFromDB((*result)[0].GetUInt32(), (*result)[1].GetUInt8(), (*result)[2].GetUInt8());
+ fields = result->Fetch();
+ LoadMemberFromDB(fields[0].GetUInt32(), fields[1].GetUInt8(), fields[2].GetUInt8());
} while (result->NextRow());
- // group too small
- if (GetMembersCount() < 2)
+
+ if (GetMembersCount() < 2) // group too small
return false;
}
@@ -190,11 +193,14 @@ bool Group::LoadGroupFromDB(const uint64 &leaderGuid, QueryResult_AutoPtr result
bool Group::LoadMemberFromDB(uint32 guidLow, uint8 memberFlags, uint8 subgroup)
{
MemberSlot member;
- member.guid = MAKE_NEW_GUID(guidLow, 0, HIGHGUID_PLAYER);
+ member.guid = MAKE_NEW_GUID(guidLow, 0, HIGHGUID_PLAYER);
// skip non-existed member
if (!objmgr.GetPlayerNameByGUID(member.guid, member.name))
+ {
+ CharacterDatabase.PQuery("DELETE FROM group_member WHERE memberGuid=%u", guidLow);
return false;
+ }
member.group = subgroup;
member.flags = memberFlags;
@@ -213,7 +219,7 @@ void Group::ConvertToRaid()
_initRaidSubGroupsCounter();
if (!isBGGroup())
- CharacterDatabase.PExecute("UPDATE groups SET groupType='%u' WHERE leaderGuid='%u'", uint8(m_groupType), GUID_LOPART(m_leaderGuid));
+ CharacterDatabase.PExecute("UPDATE groups SET groupType='%u' WHERE guid='%u'", uint8(m_groupType), GUID_LOPART(m_guid));
SendUpdate();
// update quest related GO states (quest activity dependent from raid membership)
@@ -457,14 +463,23 @@ void Group::Disband(bool hideDestroy)
if (!isBGGroup())
{
+ uint32 lowguid = GUID_LOPART(m_guid);
CharacterDatabase.BeginTransaction();
- CharacterDatabase.PExecute("DELETE FROM groups WHERE leaderGuid='%u'", GUID_LOPART(m_leaderGuid));
- CharacterDatabase.PExecute("DELETE FROM group_member WHERE leaderGuid='%u'", GUID_LOPART(m_leaderGuid));
+ CharacterDatabase.PExecute("DELETE FROM groups WHERE guid=%u", lowguid);
+ CharacterDatabase.PExecute("DELETE FROM group_member WHERE guid=%u", lowguid);
CharacterDatabase.CommitTransaction();
ResetInstances(INSTANCE_RESET_GROUP_DISBAND, false, NULL);
ResetInstances(INSTANCE_RESET_GROUP_DISBAND, true, NULL);
+ // FIXME - Safe check! Debug purposes - Will remove after a time if got no reports
+ QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT COUNT(1) FROM group_instance WHERE guid=%u", lowguid);
+ if (result)
+ {
+ sLog.outError("Group::Disband: %u instances are not being properly deleted from group %u", (*result)[0].GetUInt8(), lowguid);
+ CharacterDatabase.PExecute("DELETE FROM group_instance WHERE guid=%u", lowguid);
+ }
}
+ m_guid = 0;
m_leaderGuid = 0;
m_leaderName = "";
}
@@ -659,12 +674,12 @@ void Group::GroupLoot(Loot *loot, WorldObject* pLootedObject)
if (Creature* creature = dynamic_cast<Creature *>(pLootedObject))
{
creature->m_groupLootTimer = 60000;
- creature->lootingGroupLeaderGUID = GetLeaderGUID();
+ creature->lootingGroupGUID = GetGUID();
}
else if (GameObject* go = dynamic_cast<GameObject *>(pLootedObject))
{
go->m_groupLootTimer = 60000;
- go->lootingGroupLeaderGUID = GetLeaderGUID();
+ go->lootingGroupGUID = GetGUID();
}
}
else
@@ -748,7 +763,7 @@ void Group::NeedBeforeGreed(Loot *loot, WorldObject* pLootedObject)
if (Creature* creature = dynamic_cast<Creature *>(pLootedObject))
{
creature->m_groupLootTimer = 60000;
- creature->lootingGroupLeaderGUID = GetLeaderGUID();
+ creature->lootingGroupGUID = GetGUID();
}
}
else
@@ -1066,8 +1081,8 @@ void Group::SendUpdate()
data << uint8(0);
data << uint32(0);
}
- data << uint64(0x50000000FFFFFFFELL); // related to voice chat?
- data << uint32(0); // 3.3, value increases every time this packet gets sent
+ data << uint64(m_guid);
+ data << uint32(m_counter++); // 3.3, value increases every time this packet gets sent
data << uint32(GetMembersCount()-1);
for (member_citerator citr2 = m_memberSlots.begin(); citr2 != m_memberSlots.end(); ++citr2)
{
@@ -1217,14 +1232,14 @@ bool Group::_addMember(const uint64 &guid, const char* name, uint8 group)
if (!isRaidGroup()) // reset targetIcons for non-raid-groups
{
- for (int i=0; i<TARGETICONCOUNT; ++i)
+ for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
m_targetIcons[i] = 0;
}
if (!isBGGroup())
{
// insert into group table
- CharacterDatabase.PExecute("INSERT INTO group_member(leaderGuid,memberGuid,memberFlags,subgroup) VALUES('%u','%u','%u','%u')", GUID_LOPART(m_leaderGuid), GUID_LOPART(member.guid), member.flags, member.group);
+ CharacterDatabase.PExecute("INSERT INTO group_member(guid,memberGuid,memberFlags,subgroup) VALUES(%u,%u,%u,%u)", GUID_LOPART(m_guid), GUID_LOPART(member.guid), member.flags, member.group);
}
return true;
@@ -1259,7 +1274,7 @@ bool Group::_removeMember(const uint64 &guid)
}
if (!isBGGroup())
- CharacterDatabase.PExecute("DELETE FROM group_member WHERE memberGuid='%u'", GUID_LOPART(guid));
+ CharacterDatabase.PExecute("DELETE FROM group_member WHERE memberGuid=%u", GUID_LOPART(guid));
if (m_leaderGuid == guid) // leader was removed
{
@@ -1288,9 +1303,9 @@ void Group::_setLeader(const uint64 &guid)
// in the DB also remove solo binds that will be replaced with permbinds
// from the new leader
CharacterDatabase.PExecute(
- "DELETE FROM group_instance WHERE leaderguid='%u' AND (permanent = 1 OR "
+ "DELETE FROM group_instance WHERE guid=%u AND (permanent = 1 OR "
"instance IN (SELECT instance FROM character_instance WHERE guid = '%u')"
- ")", GUID_LOPART(m_leaderGuid), GUID_LOPART(slot->guid)
+ ")", GUID_LOPART(m_guid), GUID_LOPART(slot->guid)
);
Player *player = objmgr.GetPlayer(slot->guid);
@@ -1311,17 +1326,13 @@ void Group::_setLeader(const uint64 &guid)
}
}
- // update the group's solo binds to the new leader
- CharacterDatabase.PExecute("UPDATE group_instance SET leaderGuid='%u' WHERE leaderGuid = '%u'", GUID_LOPART(slot->guid), GUID_LOPART(m_leaderGuid));
-
// copy the permanent binds from the new leader to the group
// overwriting the solo binds with permanent ones if necessary
// in the DB those have been deleted already
Player::ConvertInstancesToGroup(player, this, slot->guid);
// update the group leader
- CharacterDatabase.PExecute("UPDATE groups SET leaderGuid='%u' WHERE leaderGuid='%u'", GUID_LOPART(slot->guid), GUID_LOPART(m_leaderGuid));
- CharacterDatabase.PExecute("UPDATE group_member SET leaderGuid='%u' WHERE leaderGuid='%u'", GUID_LOPART(slot->guid), GUID_LOPART(m_leaderGuid));
+ CharacterDatabase.PExecute("UPDATE groups SET leaderGuid='%u' WHERE guid='%u'", GUID_LOPART(slot->guid), GUID_LOPART(m_guid));
CharacterDatabase.CommitTransaction();
}
@@ -1550,7 +1561,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattleGroundQueue(BattleGround const*
return ERR_ARENA_TEAM_PARTY_SIZE;
if (memberscount > bgEntry->maxGroupSize) // no MinPlayerCount for battlegrounds
- return ERR_BATTLEGROUND_NONE; // ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY handled on client side
+ return ERR_BATTLEGROUND_NONE; // ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY handled on client side
// get a player as reference, to compare other players' stats to (arena team id, queue id based on level, etc.)
Player * reference = GetFirstMember()->getSource();
@@ -1609,7 +1620,7 @@ void Group::SetDungeonDifficulty(Difficulty difficulty)
{
m_dungeonDifficulty = difficulty;
if (!isBGGroup())
- CharacterDatabase.PExecute("UPDATE groups SET difficulty = %u WHERE leaderGuid ='%u'", m_dungeonDifficulty, GUID_LOPART(m_leaderGuid));
+ CharacterDatabase.PExecute("UPDATE groups SET difficulty = %u WHERE guid ='%u'", m_dungeonDifficulty, GUID_LOPART(m_guid));
for (GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next())
{
@@ -1625,7 +1636,7 @@ void Group::SetRaidDifficulty(Difficulty difficulty)
{
m_raidDifficulty = difficulty;
if (!isBGGroup())
- CharacterDatabase.PExecute("UPDATE groups SET raiddifficulty = %u WHERE leaderGuid ='%u'", m_raidDifficulty, GUID_LOPART(m_leaderGuid));
+ CharacterDatabase.PExecute("UPDATE groups SET raiddifficulty = %u WHERE guid ='%u'", m_raidDifficulty, GUID_LOPART(m_guid));
for (GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next())
{
@@ -1755,31 +1766,25 @@ InstanceGroupBind* Group::GetBoundInstance(Map* aMap)
InstanceGroupBind* Group::BindToInstance(InstanceSave *save, bool permanent, bool load)
{
- if (save && !isBGGroup())
- {
- InstanceGroupBind& bind = m_boundInstances[save->GetDifficulty()][save->GetMapId()];
- if (bind.save)
- {
- // when a boss is killed or when copying the players's binds to the group
- if (permanent != bind.perm || save != bind.save)
- if (!load) CharacterDatabase.PExecute("UPDATE group_instance SET instance = '%u', permanent = '%u' WHERE leaderGuid = '%u' AND instance = '%u'", save->GetInstanceId(), permanent, GUID_LOPART(GetLeaderGUID()), bind.save->GetInstanceId());
- }
- else
- if (!load) CharacterDatabase.PExecute("INSERT INTO group_instance (leaderGuid, instance, permanent) VALUES ('%u', '%u', '%u')", GUID_LOPART(GetLeaderGUID()), save->GetInstanceId(), permanent);
+ if (!save || isBGGroup())
+ return NULL;
- if (bind.save != save)
- {
- if (bind.save) bind.save->RemoveGroup(this);
- save->AddGroup(this);
- }
+ InstanceGroupBind& bind = m_boundInstances[save->GetDifficulty()][save->GetMapId()];
+ if (!load && (!bind.save || permanent != bind.perm || save != bind.save))
+ CharacterDatabase.PExecute("REPLACE INTO group_instance (guid, instance, permanent) VALUES (%u, %u, %u)", GUID_LOPART(GetGUID()), save->GetInstanceId(), permanent);
- bind.save = save;
- bind.perm = permanent;
- if (!load) sLog.outDebug("Group::BindToInstance: %d is now bound to map %d, instance %d, difficulty %d", GUID_LOPART(GetLeaderGUID()), save->GetMapId(), save->GetInstanceId(), save->GetDifficulty());
- return &bind;
+ if (bind.save != save)
+ {
+ if (bind.save)
+ bind.save->RemoveGroup(this);
+ save->AddGroup(this);
}
- else
- return NULL;
+
+ bind.save = save;
+ bind.perm = permanent;
+ if (!load)
+ sLog.outDebug("Group::BindToInstance: %d is now bound to map %d, instance %d, difficulty %d", GUID_LOPART(GetGUID()), save->GetMapId(), save->GetInstanceId(), save->GetDifficulty());
+ return &bind;
}
void Group::UnbindInstance(uint32 mapid, uint8 difficulty, bool unload)
@@ -1787,7 +1792,8 @@ void Group::UnbindInstance(uint32 mapid, uint8 difficulty, bool unload)
BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapid);
if (itr != m_boundInstances[difficulty].end())
{
- if (!unload) CharacterDatabase.PExecute("DELETE FROM group_instance WHERE leaderGuid = '%u' AND instance = '%u'", GUID_LOPART(GetLeaderGUID()), itr->second.save->GetInstanceId());
+ if (!unload)
+ CharacterDatabase.PExecute("DELETE FROM group_instance WHERE guid=%u AND instance=%u", GUID_LOPART(GetGUID()), itr->second.save->GetInstanceId());
itr->second.save->RemoveGroup(this); // save can become invalid
m_boundInstances[difficulty].erase(itr);
}