bool ArenaTeam::LoadMembersFromDB(QueryResult *arenaTeamMembersResult) { if(!arenaTeamMembersResult) return false; bool captainPresentInTeam = false; do { Field *fields = arenaTeamMembersResult->Fetch(); //prevent crash if db records are broken, when all members in result are already processed and current team hasn't got any members if (!fields) break; uint32 arenaTeamId = fields[0].GetUInt32(); if (arenaTeamId < m_TeamId) { //there is in table arena_team_member record which doesn't have arenateamid in arena_team table, report error sLog.outErrorDb("ArenaTeam %u does not exist but it has record in arena_team_member table, deleting it!", arenaTeamId); CharacterDatabase.PExecute("DELETE FROM arena_team_member WHERE arenateamid = '%u'", arenaTeamId); continue; } if (arenaTeamId > m_TeamId) //we loaded all members for this arena_team already, break cycle break; ArenaTeamMember newmember; newmember.guid = ObjectGuid(HIGHGUID_PLAYER, fields[1].GetUInt32()); newmember.games_week = fields[2].GetUInt32(); newmember.wins_week = fields[3].GetUInt32(); newmember.games_season = fields[4].GetUInt32(); newmember.wins_season = fields[5].GetUInt32(); newmember.personal_rating = fields[6].GetUInt32(); newmember.name = fields[7].GetCppString(); newmember.Class = fields[8].GetUInt8(); //check if member exists in characters table if (newmember.name.empty()) { sLog.outErrorDb("ArenaTeam %u has member with empty name - probably player %s doesn't exist, deleting him from memberlist!", arenaTeamId, newmember.guid.GetString().c_str()); DelMember(newmember.guid); continue; } if (newmember.guid == GetCaptainGuid()) captainPresentInTeam = true; m_members.push_back(newmember); } while (arenaTeamMembersResult->NextRow()); if (Empty() || !captainPresentInTeam) { // arena team is empty or captain is not in team, delete from db sLog.outErrorDb("ArenaTeam %u does not have any members or its captain is not in team, disbanding it...", m_TeamId); return false; } return true; }
bool ArenaTeam::AddMemberNoSave(Player* pl) { if (GetMembersSize() >= GetMaxMembersSize()) return false; if (pl->GetArenaTeamId(GetSlot())) { sLog.outError("Arena::AddMember() : player already in this sized team"); return false; } Player::RemovePetitionsAndSigns(pl->GetObjectGuid(), GetType()); ArenaTeamMember newmember; newmember.name = pl->GetName(); newmember.guid = pl->GetObjectGuid(); newmember.Class = pl->getClass(); newmember.games_season = 0; newmember.games_week = 0; newmember.wins_season = 0; newmember.wins_week = 0; int32 conf_value = sWorld.getConfig(CONFIG_INT32_ARENA_STARTPERSONALRATING); if (conf_value < 0) // -1 = select by season id { if (sWorld.getConfig(CONFIG_UINT32_ARENA_SEASON_ID) >= 6) { if (m_stats.rating < 1000) newmember.personal_rating = 0; else newmember.personal_rating = 1000; } else { newmember.personal_rating = 1500; } } else newmember.personal_rating = uint32(conf_value); m_members.push_back(newmember); if(pl) { uint8 arenaSlot = GetSlot(); pl->SetInArenaTeam(m_TeamId, arenaSlot, GetType()); pl->SetArenaTeamIdInvited(0); pl->SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_ID, m_TeamId); pl->SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_TYPE, GetType()); pl->SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_MEMBER, (GetCaptainGuid() == pl->GetObjectGuid()) ? 0 : 1); pl->SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_GAMES_WEEK, newmember.games_week); pl->SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_GAMES_SEASON, newmember.games_season); pl->SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_WINS_SEASON, newmember.wins_season); pl->SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_PERSONAL_RATING, newmember.personal_rating); } return true; }
void ArenaTeam::SetCaptain(ObjectGuid guid) { // disable remove/promote buttons Player *oldcaptain = sObjectMgr.GetPlayer(GetCaptainGuid()); if (oldcaptain) oldcaptain->SetArenaTeamInfoField(GetSlot(), ARENA_TEAM_MEMBER, 1); // set new captain m_CaptainGuid = guid; // update database CharacterDatabase.PExecute("UPDATE arena_team SET captainguid = '%u' WHERE arenateamid = '%u'", guid.GetCounter(), m_TeamId); // enable remove/promote buttons if (Player *newcaptain = sObjectMgr.GetPlayer(guid)) newcaptain->SetArenaTeamInfoField(GetSlot(), ARENA_TEAM_MEMBER, 0); }
void ArenaTeam::Roster(WorldSession *session) { Player *pl = NULL; uint8 unk308 = 0; WorldPacket data(SMSG_ARENA_TEAM_ROSTER, 100); data << uint32(GetId()); // team id data << uint8(unk308); // 308 unknown value but affect packet structure data << uint32(GetMembersSize()); // members count data << uint32(GetType()); // arena team type? for (MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { pl = sObjectMgr.GetPlayer(itr->guid); data << itr->guid; // guid data << uint8((pl ? 1 : 0)); // online flag data << itr->name; // member name data << uint32((itr->guid == GetCaptainGuid() ? 0 : 1));// captain flag 0 captain 1 member data << uint8((pl ? pl->getLevel() : 0)); // unknown, level? data << uint8(itr->Class); // class data << uint32(itr->games_week); // played this week data << uint32(itr->wins_week); // wins this week data << uint32(itr->games_season); // played this season data << uint32(itr->wins_season); // wins this season data << uint32(itr->personal_rating); // personal rating if(unk308) { data << float(0.0); // 308 unk data << float(0.0); // 308 unk } } session->SendPacket(&data); DEBUG_LOG("WORLD: Sent SMSG_ARENA_TEAM_ROSTER"); }
bool ArenaTeam::LoadMembersFromDB(QueryResult *arenaTeamMembersResult) { if(!arenaTeamMembersResult) return false; bool captainPresentInTeam = false; do { Field *fields = arenaTeamMembersResult->Fetch(); //prevent crash if db records are broken, when all members in result are already processed and current team hasn't got any members if (!fields) break; uint32 arenaTeamId = fields[0].GetUInt32(); if (arenaTeamId < m_TeamId) { //there is in table arena_team_member record which doesn't have arenateamid in arena_team table, report error sLog.outErrorDb("ArenaTeam %u does not exist but it has record in arena_team_member table, deleting it!", arenaTeamId); CharacterDatabase.PExecute("DELETE FROM arena_team_member WHERE arenateamid = '%u'", arenaTeamId); continue; } if (arenaTeamId > m_TeamId) //we loaded all members for this arena_team already, break cycle break; ArenaTeamMember newmember; newmember.guid = ObjectGuid(HIGHGUID_PLAYER, fields[1].GetUInt32()); newmember.games_week = fields[2].GetUInt32(); newmember.wins_week = fields[3].GetUInt32(); newmember.games_season = fields[4].GetUInt32(); newmember.wins_season = fields[5].GetUInt32(); newmember.personal_rating = fields[6].GetUInt32(); newmember.name = fields[7].GetCppString(); newmember.Class = fields[8].GetUInt8(); if (GetType() == ARENA_TYPE_2v2) { QueryResult *result = CharacterDatabase.PQuery("SELECT rating2 FROM hidden_rating WHERE guid='%u'", fields[1].GetUInt32()); if (!result) { CharacterDatabase.PExecute("INSERT INTO hidden_rating (guid, rating2, rating3, rating5) VALUES""('%u', '%u', '%u', '%u')", fields[1].GetUInt32(), 1500, 1500, 1500); newmember.matchmaker_rating = 1500; } else { newmember.matchmaker_rating = (*result)[0].GetUInt32(); delete result; } } if (GetType() == ARENA_TYPE_3v3) { QueryResult *result = CharacterDatabase.PQuery("SELECT rating3 FROM hidden_rating WHERE guid='%u'", fields[1].GetUInt32()); if (!result) { CharacterDatabase.PExecute("INSERT INTO hidden_rating (guid, rating2, rating3, rating5) VALUES""('%u', '%u', '%u', '%u')", fields[1].GetUInt32(), 1500, 1500, 1500); newmember.matchmaker_rating = 1500; } else { newmember.matchmaker_rating = (*result)[0].GetUInt32(); delete result; } } if (GetType() == ARENA_TYPE_5v5) { QueryResult *result = CharacterDatabase.PQuery("SELECT rating5 FROM hidden_rating WHERE guid='%u'", fields[1].GetUInt32()); if (!result) { CharacterDatabase.PExecute("INSERT INTO hidden_rating (guid, rating2, rating3, rating5) VALUES""('%u', '%u', '%u', '%u')", fields[1].GetUInt32(), 1500, 1500, 1500); newmember.matchmaker_rating = 1500; } else { newmember.matchmaker_rating = (*result)[0].GetUInt32(); delete result; } } //check if member exists in characters table if (newmember.name.empty()) { CharacterDatabase.PExecute("DELETE FROM hidden_rating where guid = '%u'", fields[1].GetUInt32()); sLog.outErrorDb("ArenaTeam %u has member with empty name - probably player %s doesn't exist, deleting him from memberlist!", arenaTeamId, newmember.guid.GetString().c_str()); DelMember(newmember.guid); continue; } // arena team can't be > 2 * arenatype (2 for 2x2, 3 for 3x3, 5 for 5x5) if (GetMembersSize() >= GetMaxMembersSize()) return false; if (newmember.guid == GetCaptainGuid()) captainPresentInTeam = true; m_members.push_back(newmember); } while (arenaTeamMembersResult->NextRow()); if (Empty() || !captainPresentInTeam) { // arena team is empty or captain is not in team, delete from db sLog.outErrorDb("ArenaTeam %u does not have any members or its captain is not in team, disbanding it...", m_TeamId); return false; } return true; }