bool Guild::ChangeMemberRank(ObjectGuid guid, uint8 newRank) { if (newRank <= GetLowestRank()) // Validate rank (allow only existing ranks) if (MemberSlot* member = GetMemberSlot(guid)) { member->ChangeRank(newRank); return true; } return false; }
void Guild::DelRank() { // client won't allow to have less than GUILD_RANKS_MIN_COUNT ranks in guild if (m_Ranks.size() <= GUILD_RANKS_MIN_COUNT) { return; } // delete lowest guild_rank uint32 rank = GetLowestRank(); CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE rid>='%u' AND guildid='%u'", rank, m_Id); m_Ranks.pop_back(); }
bool Guild::LoadMembersFromDB(QueryResult* guildMembersResult) { if (!guildMembersResult) { return false; } do { Field* fields = guildMembersResult->Fetch(); // this condition will be true when all rows in QueryResult are processed and new guild without members is going to be loaded - prevent crash if (!fields) { break; } uint32 guildId = fields[0].GetUInt32(); if (guildId < m_Id) { // there is in table guild_member record which doesn't have guildid in guild table, report error sLog.outErrorDb("Guild %u does not exist but it has a record in guild_member table, deleting it!", guildId); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guildid = '%u'", guildId); continue; } if (guildId > m_Id) // we loaded all members for this guild already, break cycle { break; } MemberSlot newmember; uint32 lowguid = fields[1].GetUInt32(); newmember.guid = ObjectGuid(HIGHGUID_PLAYER, lowguid); newmember.RankId = fields[2].GetUInt32(); // don't allow member to have not existing rank! if (newmember.RankId >= m_Ranks.size()) { newmember.RankId = GetLowestRank(); } newmember.Pnote = fields[3].GetCppString(); newmember.OFFnote = fields[4].GetCppString(); newmember.Name = fields[5].GetCppString(); newmember.Level = fields[6].GetUInt8(); newmember.Class = fields[7].GetUInt8(); newmember.ZoneId = fields[8].GetUInt32(); newmember.LogoutTime = fields[9].GetUInt64(); newmember.accountId = fields[10].GetInt32(); // this code will remove not existing character guids from guild if (newmember.Level < 1 || newmember.Level > STRONG_MAX_LEVEL) // can be at broken `data` field { sLog.outError("%s has a broken data in field `characters`.`data`, deleting him from guild!", newmember.guid.GetString().c_str()); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", lowguid); continue; } if (!newmember.ZoneId) { sLog.outError("%s has broken zone-data", newmember.guid.GetString().c_str()); // here it will also try the same, to get the zone from characters-table, but additional it tries to find // the zone through xy coords .. this is a bit redundant, but shouldn't be called often newmember.ZoneId = Player::GetZoneIdFromDB(newmember.guid); } if (!((1 << (newmember.Class - 1)) & CLASSMASK_ALL_PLAYABLE)) // can be at broken `class` field { sLog.outError("%s has a broken data in field `characters`.`class`, deleting him from guild!", newmember.guid.GetString().c_str()); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", lowguid); continue; } members[lowguid] = newmember; } while (guildMembersResult->NextRow()); if (members.empty()) { return false; } UpdateAccountsNumber(); return true; }
bool Guild::LoadMembersFromDB(uint32 GuildId) { // 0 1 2 3 QueryResult *result = CharacterDatabase.PQuery("SELECT guild_member.guid,rank, pnote, offnote," // 4 5 6 7 8 "characters.name, characters.level, characters.class, characters.zone, characters.logout_time " "FROM guild_member LEFT JOIN characters ON characters.guid = guild_member.guid WHERE guildid = '%u'", GuildId); if (!result) return false; do { Field *fields = result->Fetch(); MemberSlot newmember; uint64 guid = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER); newmember.RankId = fields[1].GetUInt32(); // don't allow member to have not existing rank! if (newmember.RankId >= m_Ranks.size()) newmember.RankId = GetLowestRank(); newmember.Pnote = fields[2].GetCppString(); newmember.OFFnote = fields[3].GetCppString(); newmember.Name = fields[4].GetCppString(); newmember.Level = fields[5].GetUInt8(); newmember.Class = fields[6].GetUInt8(); newmember.ZoneId = fields[7].GetUInt32(); newmember.LogoutTime = fields[8].GetUInt64(); // this code will remove not existing character guids from guild if (newmember.Level < 1 || newmember.Level > STRONG_MAX_LEVEL) // can be at broken `data` field { sLog.outError("Player (GUID: %u) has a broken data in field `characters`.`data`, deleting him from guild!",GUID_LOPART(guid)); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid)); continue; } if (!newmember.ZoneId) { sLog.outError("Player (GUID: %u) has broken zone-data", GUID_LOPART(guid)); // here it will also try the same, to get the zone from characters-table, but additional it tries to find // the zone through xy coords .. this is a bit redundant, but shouldn't be called often newmember.ZoneId = Player::GetZoneIdFromDB(guid); } if (newmember.Class < CLASS_WARRIOR || newmember.Class >= MAX_CLASSES) // can be at broken `class` field { sLog.outError("Player (GUID: %u) has a broken data in field `characters`.`class`, deleting him from guild!",GUID_LOPART(guid)); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid)); continue; } members[GUID_LOPART(guid)] = newmember; }while( result->NextRow() ); delete result; if (members.empty()) return false; return true; }