diff options
| author | leak <leakzx@googlemail.com> | 2011-04-05 21:54:28 +0200 |
|---|---|---|
| committer | leak <leakzx@googlemail.com> | 2011-04-05 21:54:28 +0200 |
| commit | ae3ab32ea5bf697a7b3f6d1fbc0740d7404d7c92 (patch) | |
| tree | 3ec0d1b2be05392a4b6370b4f64200ec8c191d3b /src/server/game/Server | |
| parent | 3a93dff59efc079ee31998146de601de7637a0aa (diff) | |
Core/Arenas: Refactor arena code and db layout
Diffstat (limited to 'src/server/game/Server')
| -rwxr-xr-x | src/server/game/Server/Protocol/Handlers/ArenaTeamHandler.cpp | 211 | ||||
| -rwxr-xr-x | src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp | 190 |
2 files changed, 202 insertions, 199 deletions
diff --git a/src/server/game/Server/Protocol/Handlers/ArenaTeamHandler.cpp b/src/server/game/Server/Protocol/Handlers/ArenaTeamHandler.cpp index c0e83dd2228..7886b9e45cc 100755 --- a/src/server/game/Server/Protocol/Handlers/ArenaTeamHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/ArenaTeamHandler.cpp @@ -27,74 +27,74 @@ #include "ObjectMgr.h" #include "SocialMgr.h" -void WorldSession::HandleInspectArenaTeamsOpcode(WorldPacket & recv_data) +void WorldSession::HandleInspectArenaTeamsOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_INSPECT_ARENA_TEAMS"); uint64 guid; - recv_data >> guid; + recvData >> guid; sLog->outDebug(LOG_FILTER_NETWORKIO, "Inspect Arena stats (GUID: %u TypeId: %u)", GUID_LOPART(guid),GuidHigh2TypeId(GUID_HIPART(guid))); - if (Player *plr = sObjectMgr->GetPlayer(guid)) + if (Player* player = sObjectMgr->GetPlayer(guid)) { for (uint8 i = 0; i < MAX_ARENA_SLOT; ++i) { - if (uint32 a_id = plr->GetArenaTeamId(i)) + if (uint32 a_id = player->GetArenaTeamId(i)) { - if (ArenaTeam *at = sObjectMgr->GetArenaTeamById(a_id)) - at->InspectStats(this, plr->GetGUID()); + if (ArenaTeam* arenaTeam = sObjectMgr->GetArenaTeamById(a_id)) + arenaTeam->Inspect(this, player->GetGUID()); } } } } -void WorldSession::HandleArenaTeamQueryOpcode(WorldPacket & recv_data) +void WorldSession::HandleArenaTeamQueryOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_ARENA_TEAM_QUERY"); - uint32 ArenaTeamId; - recv_data >> ArenaTeamId; + uint32 arenaTeamId; + recvData >> arenaTeamId; - if (ArenaTeam *arenateam = sObjectMgr->GetArenaTeamById(ArenaTeamId)) + if (ArenaTeam* arenaTeam = sObjectMgr->GetArenaTeamById(arenaTeamId)) { - arenateam->Query(this); - arenateam->Stats(this); + arenaTeam->Query(this); + arenaTeam->SendStats(this); } } -void WorldSession::HandleArenaTeamRosterOpcode(WorldPacket & recv_data) +void WorldSession::HandleArenaTeamRosterOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_ARENA_TEAM_ROSTER"); - uint32 ArenaTeamId; // arena team id - recv_data >> ArenaTeamId; + uint32 arenaTeamId; // arena team id + recvData >> arenaTeamId; - if (ArenaTeam *arenateam = sObjectMgr->GetArenaTeamById(ArenaTeamId)) - arenateam->Roster(this); + if (ArenaTeam* arenaTeam = sObjectMgr->GetArenaTeamById(arenaTeamId)) + arenaTeam->Roster(this); } -void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket & recv_data) +void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_INVITE"); - uint32 ArenaTeamId; // arena team id - std::string Invitedname; + uint32 arenaTeamId; // arena team id + std::string invitedName; - Player * player = NULL; + Player* player = NULL; - recv_data >> ArenaTeamId >> Invitedname; + recvData >> arenaTeamId >> invitedName; - if (!Invitedname.empty()) + if (!invitedName.empty()) { - if (!normalizePlayerName(Invitedname)) + if (!normalizePlayerName(invitedName)) return; - player = sObjectAccessor->FindPlayerByName(Invitedname.c_str()); + player = sObjectAccessor->FindPlayerByName(invitedName.c_str()); } if (!player) { - SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", Invitedname, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S); + SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", invitedName, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S); return; } @@ -104,14 +104,14 @@ void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket & recv_data) return; } - ArenaTeam *arenateam = sObjectMgr->GetArenaTeamById(ArenaTeamId); - if (!arenateam) + ArenaTeam* arenaTeam = sObjectMgr->GetArenaTeamById(arenaTeamId); + if (!arenaTeam) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PLAYER_NOT_IN_TEAM); return; } - // OK result but not send invite + // OK result but don't send invite if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) return; @@ -121,7 +121,7 @@ void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket & recv_data) return; } - if (player->GetArenaTeamId(arenateam->GetSlot())) + if (player->GetArenaTeamId(arenaTeam->GetSlot())) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", player->GetName(), ERR_ALREADY_IN_ARENA_TEAM_S); return; @@ -133,19 +133,19 @@ void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket & recv_data) return; } - if (arenateam->GetMembersSize() >= arenateam->GetType() * 2) + if (arenaTeam->GetMembersSize() >= arenaTeam->GetType() * 2) { - SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, arenateam->GetName(), "", ERR_ARENA_TEAM_TOO_MANY_MEMBERS_S); + SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, arenaTeam->GetName(), "", ERR_ARENA_TEAM_TOO_MANY_MEMBERS_S); return; } - sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Player %s Invited %s to Join his ArenaTeam", GetPlayer()->GetName(), Invitedname.c_str()); + sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Player %s Invited %s to Join his ArenaTeam", GetPlayer()->GetName(), invitedName.c_str()); - player->SetArenaTeamIdInvited(arenateam->GetId()); + player->SetArenaTeamIdInvited(arenaTeam->GetId()); WorldPacket data(SMSG_ARENA_TEAM_INVITE, (8+10)); data << GetPlayer()->GetName(); - data << arenateam->GetName(); + data << arenaTeam->GetName(); player->GetSession()->SendPacket(&data); sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_ARENA_TEAM_INVITE"); @@ -155,112 +155,117 @@ void WorldSession::HandleArenaTeamAcceptOpcode(WorldPacket & /*recv_data*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_ACCEPT"); // empty opcode - ArenaTeam *at = sObjectMgr->GetArenaTeamById(_player->GetArenaTeamIdInvited()); - if (!at) + ArenaTeam* arenaTeam = sObjectMgr->GetArenaTeamById(_player->GetArenaTeamIdInvited()); + if (!arenaTeam) return; - if (_player->GetArenaTeamId(at->GetSlot())) + // Check if player is already in another team of the same size + if (_player->GetArenaTeamId(arenaTeam->GetSlot())) { - // already in arena team that size SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ALREADY_IN_ARENA_TEAM); return; } - if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && _player->GetTeam() != sObjectMgr->GetPlayerTeamByGUID(at->GetCaptain())) + // Only allow members of the other faction to join the team if cross faction interaction is enabled + if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && _player->GetTeam() != sObjectMgr->GetPlayerTeamByGUID(arenaTeam->GetCaptain())) { - // not let enemies sign petition SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_NOT_ALLIED); return; } - if (!at->AddMember(_player->GetGUID())) + // Add player to team + if (!arenaTeam->AddMember(_player->GetGUID())) { - // arena team not found SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S,"","",ERR_ARENA_TEAM_INTERNAL); return; } - // event - at->BroadcastEvent(ERR_ARENA_TEAM_JOIN_SS, _player->GetGUID(), 2, _player->GetName(), at->GetName(), ""); + // Broadcast event + arenaTeam->BroadcastEvent(ERR_ARENA_TEAM_JOIN_SS, _player->GetGUID(), 2, _player->GetName(), arenaTeam->GetName(), ""); } void WorldSession::HandleArenaTeamDeclineOpcode(WorldPacket & /*recv_data*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_DECLINE"); // empty opcode - _player->SetArenaTeamIdInvited(0); // no more invited + // Remove invite from player + _player->SetArenaTeamIdInvited(0); } -void WorldSession::HandleArenaTeamLeaveOpcode(WorldPacket & recv_data) +void WorldSession::HandleArenaTeamLeaveOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_LEAVE"); - uint32 ArenaTeamId; // arena team id - recv_data >> ArenaTeamId; + uint32 arenaTeamId; + recvData >> arenaTeamId; - ArenaTeam *at = sObjectMgr->GetArenaTeamById(ArenaTeamId); - if (!at) + ArenaTeam* arenaTeam = sObjectMgr->GetArenaTeamById(arenaTeamId); + if (!arenaTeam) return; - if (_player->GetGUID() == at->GetCaptain() && at->GetMembersSize() > 1) + // Team captain can't leave the team if other members are still present + if (_player->GetGUID() == arenaTeam->GetCaptain() && arenaTeam->GetMembersSize() > 1) { - // check for correctness SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, "", "", ERR_ARENA_TEAM_LEADER_LEAVE_S); return; } - // arena team has only one member (=captain) - if (_player->GetGUID() == at->GetCaptain()) + // If team consists only of the captain, disband the team + if (_player->GetGUID() == arenaTeam->GetCaptain()) { - at->Disband(this); - delete at; + arenaTeam->Disband(this); + delete arenaTeam; return; } + else + arenaTeam->DelMember(_player->GetGUID(), true); - at->DelMember(_player->GetGUID()); + // Broadcast event + arenaTeam->BroadcastEvent(ERR_ARENA_TEAM_LEAVE_SS, _player->GetGUID(), 2, _player->GetName(), arenaTeam->GetName(), ""); - // event - at->BroadcastEvent(ERR_ARENA_TEAM_LEAVE_SS, _player->GetGUID(), 2, _player->GetName(), at->GetName(), ""); - - // send you are no longer member of team - SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, at->GetName(), "", 0); + // Inform player who left + SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, arenaTeam->GetName(), "", 0); } -void WorldSession::HandleArenaTeamDisbandOpcode(WorldPacket & recv_data) +void WorldSession::HandleArenaTeamDisbandOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_DISBAND"); - uint32 ArenaTeamId; // arena team id - recv_data >> ArenaTeamId; + uint32 arenaTeamId; + recvData >> arenaTeamId; - if (ArenaTeam *at = sObjectMgr->GetArenaTeamById(ArenaTeamId)) + if (ArenaTeam* arenaTeam = sObjectMgr->GetArenaTeamById(arenaTeamId)) { - if (at->GetCaptain() != _player->GetGUID()) + // Only captain can disband the team + if (arenaTeam->GetCaptain() != _player->GetGUID()) return; - if (at->IsFighting()) + // Teams cannot be disbanded during fights + if (arenaTeam->IsFighting()) return; - at->Disband(this); - delete at; + arenaTeam->Disband(this); + delete arenaTeam; } } -void WorldSession::HandleArenaTeamRemoveOpcode(WorldPacket & recv_data) +void WorldSession::HandleArenaTeamRemoveOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_REMOVE"); - uint32 ArenaTeamId; + uint32 arenaTeamId; std::string name; - recv_data >> ArenaTeamId; - recv_data >> name; + recvData >> arenaTeamId; + recvData >> name; - ArenaTeam *at = sObjectMgr->GetArenaTeamById(ArenaTeamId); - if (!at) // arena team not found + // Check for valid arena team + ArenaTeam* arenaTeam = sObjectMgr->GetArenaTeamById(arenaTeamId); + if (!arenaTeam) return; - if (at->GetCaptain() != _player->GetGUID()) + // Only captain can remove members + if (arenaTeam->GetCaptain() != _player->GetGUID()) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS); return; @@ -269,40 +274,44 @@ void WorldSession::HandleArenaTeamRemoveOpcode(WorldPacket & recv_data) if (!normalizePlayerName(name)) return; - ArenaTeamMember* member = at->GetMember(name); - if (!member) // member not found + // Check if team member exists + ArenaTeamMember* member = arenaTeam->GetMember(name); + if (!member) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", name, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S); return; } - if (at->GetCaptain() == member->guid) + // Captain cannot be removed + if (arenaTeam->GetCaptain() == member->Guid) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, "", "", ERR_ARENA_TEAM_LEADER_LEAVE_S); return; } - at->DelMember(member->guid); + arenaTeam->DelMember(member->Guid, true); - // event - at->BroadcastEvent(ERR_ARENA_TEAM_REMOVE_SSS, 0, 3, name, at->GetName(), _player->GetName()); + // Broadcast event + arenaTeam->BroadcastEvent(ERR_ARENA_TEAM_REMOVE_SSS, 0, 3, name, arenaTeam->GetName(), _player->GetName()); } -void WorldSession::HandleArenaTeamLeaderOpcode(WorldPacket & recv_data) +void WorldSession::HandleArenaTeamLeaderOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_LEADER"); - uint32 ArenaTeamId; + uint32 arenaTeamId; std::string name; - recv_data >> ArenaTeamId; - recv_data >> name; + recvData >> arenaTeamId; + recvData >> name; - ArenaTeam *at = sObjectMgr->GetArenaTeamById(ArenaTeamId); - if (!at) // arena team not found + // Check for valid arena team + ArenaTeam* arenaTeam = sObjectMgr->GetArenaTeamById(arenaTeamId); + if (!arenaTeam) return; - if (at->GetCaptain() != _player->GetGUID()) + // Only captain can pass leadership + if (arenaTeam->GetCaptain() != _player->GetGUID()) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS); return; @@ -311,29 +320,31 @@ void WorldSession::HandleArenaTeamLeaderOpcode(WorldPacket & recv_data) if (!normalizePlayerName(name)) return; - ArenaTeamMember* member = at->GetMember(name); - if (!member) // member not found + // Check if team member exists + ArenaTeamMember* member = arenaTeam->GetMember(name); + if (!member) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", name, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S); return; } - if (at->GetCaptain() == member->guid) // target player already captain + // Check if the target is already team captain + if (arenaTeam->GetCaptain() == member->Guid) return; - at->SetCaptain(member->guid); + arenaTeam->SetCaptain(member->Guid); - // event - at->BroadcastEvent(ERR_ARENA_TEAM_LEADER_CHANGED_SSS, 0, 3, _player->GetName(), name, at->GetName()); + // Broadcast event + arenaTeam->BroadcastEvent(ERR_ARENA_TEAM_LEADER_CHANGED_SSS, 0, 3, _player->GetName(), name, arenaTeam->GetName()); } -void WorldSession::SendArenaTeamCommandResult(uint32 team_action, const std::string& team, const std::string& player, uint32 error_id) +void WorldSession::SendArenaTeamCommandResult(uint32 teamAction, const std::string& team, const std::string& player, uint32 errorId) { WorldPacket data(SMSG_ARENA_TEAM_COMMAND_RESULT, 4+team.length()+1+player.length()+1+4); - data << uint32(team_action); + data << uint32(teamAction); data << team; data << player; - data << uint32(error_id); + data << uint32(errorId); SendPacket(&data); } diff --git a/src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp b/src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp index 1417661fba8..3e716bea6e9 100755 --- a/src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp @@ -695,22 +695,30 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket & recv_data) void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "Received opcode CMSG_TURN_IN_PETITION"); // ok - //recv_data.hexlike(); + sLog->outDebug(LOG_FILTER_NETWORKIO, "Received opcode CMSG_TURN_IN_PETITION"); + // Get petition guid from packet WorldPacket data; - uint64 petitionguid; + uint64 petitionGuid; + + recv_data >> petitionGuid; + // Check if player really has the required petition charter + Item* item = _player->GetItemByGuid(petitionGuid); + if (!item) + return; + + sLog->outDebug(LOG_FILTER_NETWORKIO, "Petition %u turned in by %u", GUID_LOPART(petitionGuid), _player->GetGUIDLow()); + + // Get petition data from db uint32 ownerguidlo; uint32 type; std::string name; - recv_data >> petitionguid; + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_PETITION); + stmt->setUInt32(0, GUID_LOPART(petitionGuid)); + PreparedQueryResult result = CharacterDatabase.Query(stmt); - sLog->outDebug(LOG_FILTER_NETWORKIO, "Petition %u turned in by %u", GUID_LOPART(petitionguid), _player->GetGUIDLow()); - - // data - QueryResult result = CharacterDatabase.PQuery("SELECT ownerguid, name, type FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); if (result) { Field *fields = result->Fetch(); @@ -720,145 +728,146 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data) } else { - sLog->outError("petition table has broken data!"); + sLog->outError("Player %s (guid: %u) tried to turn in petition (guid: %u) that is not present in the database", _player->GetName(), _player->GetGUIDLow(), GUID_LOPART(petitionGuid)); return; } + // Only the petition owner can turn in the petition + if (_player->GetGUIDLow() != ownerguidlo) + return; + + // Petition type (guild/arena) specific checks if (type == GUILD_CHARTER_TYPE) { + // Check if player is already in a guild if (_player->GetGuildId()) { data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); - data << (uint32)PETITION_TURN_ALREADY_IN_GUILD; // already in guild + data << (uint32)PETITION_TURN_ALREADY_IN_GUILD; _player->GetSession()->SendPacket(&data); return; } + + // Check if guild name is already taken + if (sObjectMgr->GetGuildByName(name)) + { + Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NAME_EXISTS_S, name); + return; + } } else { + // Check for valid arena bracket (2v2, 3v3, 5v5) uint8 slot = ArenaTeam::GetSlotByType(type); if (slot >= MAX_ARENA_SLOT) return; + // Check if player is already in an arena team if (_player->GetArenaTeamId(slot)) { - //data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); - //data << (uint32)PETITION_TURN_ALREADY_IN_GUILD; // already in guild - //_player->GetSession()->SendPacket(&data); SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ALREADY_IN_ARENA_TEAM); return; } + + // Check if arena team name is already taken + if (sObjectMgr->GetArenaTeamByName(name)) + { + SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_EXISTS_S); + return; + } } - if (_player->GetGUIDLow() != ownerguidlo) - return; + // Get petition signatures from db + uint8 signatures; + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_PETITION_SIGNATURE); + stmt->setUInt32(0, GUID_LOPART(petitionGuid)); + result = CharacterDatabase.Query(stmt); - // signs - uint8 signs; - result = CharacterDatabase.PQuery("SELECT playerguid FROM petition_sign WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); if (result) - signs = uint8(result->GetRowCount()); + signatures = uint8(result->GetRowCount()); else - signs = 0; + signatures = 0; - uint32 count; - //if (signs < sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS)) + uint32 requiredSignatures; if (type == GUILD_CHARTER_TYPE) - count = sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS); + requiredSignatures = sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS); else - count = type-1; - if (signs < count) + requiredSignatures = type-1; + + // Notify player if signatures are missing + if (signatures < requiredSignatures) { data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); - data << (uint32)PETITION_TURN_NEED_MORE_SIGNATURES; // need more signatures... + data << (uint32)PETITION_TURN_NEED_MORE_SIGNATURES; SendPacket(&data); return; } - if (type == GUILD_CHARTER_TYPE) - { - if (sObjectMgr->GetGuildByName(name)) - { - Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NAME_EXISTS_S, name); - return; - } - } - else - { - if (sObjectMgr->GetArenaTeamByName(name)) - { - SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_EXISTS_S); - return; - } - } - - // and at last charter item check - Item *item = _player->GetItemByGuid(petitionguid); - if (!item) - return; - - // OK! + // Proceed with guild/arena team creation - // delete charter item + // Delete charter item _player->DestroyItem(item->GetBagSlot(),item->GetSlot(), true); - if (type == GUILD_CHARTER_TYPE) // create guild + if (type == GUILD_CHARTER_TYPE) { + // Create guild Guild* guild = new Guild; + if (!guild->Create(_player, name)) { delete guild; return; } - // register guild and add guildmaster + // Register guild and add guild master sObjectMgr->AddGuild(guild); - // add members - for (uint8 i = 0; i < signs; ++i) + // Add members from signatures + for (uint8 i = 0; i < signatures; ++i) { Field* fields = result->Fetch(); - guild->AddMember(fields[0].GetUInt64()); + guild->AddMember(MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER)); result->NextRow(); } } - else // or arena team + else { - ArenaTeam* at = new ArenaTeam; - if (!at->Create(_player->GetGUID(), type, name)) + // Receive the rest of the packet in arena team creation case + uint32 background, icon, iconcolor, border, bordercolor; + recv_data >> background >> icon >> iconcolor >> border >> bordercolor; + + // Create arena team + ArenaTeam* arenaTeam = new ArenaTeam(); + + if (!arenaTeam->Create(_player->GetGUID(), type, name, background, icon, iconcolor, border, bordercolor)) { - sLog->outError("PetitionsHandler: arena team create failed."); - delete at; + delete arenaTeam; return; } - uint32 icon, iconcolor, border, bordercolor, backgroud; - recv_data >> backgroud >> icon >> iconcolor >> border >> bordercolor; - - at->SetEmblem(backgroud, icon, iconcolor, border, bordercolor); + // Register arena team + sObjectMgr->AddArenaTeam(arenaTeam); + sLog->outDebug(LOG_FILTER_NETWORKIO, "PetitonsHandler: Arena team (guid: %u) added to ObjectMgr", arenaTeam->GetId()); - // register team and add captain - sObjectMgr->AddArenaTeam(at); - sLog->outDebug(LOG_FILTER_NETWORKIO, "PetitonsHandler: arena team added to objmrg"); - - // add members - for (uint8 i = 0; i < signs; ++i) + // Add members + for (uint8 i = 0; i < signatures; ++i) { Field* fields = result->Fetch(); - uint64 memberGUID = fields[0].GetUInt64(); - sLog->outDebug(LOG_FILTER_NETWORKIO, "PetitionsHandler: adding arena member %u", GUID_LOPART(memberGUID)); - at->AddMember(memberGUID); + uint32 memberGUID = fields[0].GetUInt32(); + sLog->outDebug(LOG_FILTER_NETWORKIO, "PetitionsHandler: Adding arena team (guid: %u) member %u", arenaTeam->GetId(), memberGUID); + arenaTeam->AddMember(MAKE_NEW_GUID(memberGUID, 0, HIGHGUID_PLAYER)); result->NextRow(); } } SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->PAppend("DELETE FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); - trans->PAppend("DELETE FROM petition_sign WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); + trans->PAppend("DELETE FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionGuid)); + trans->PAppend("DELETE FROM petition_sign WHERE petitionguid = '%u'", GUID_LOPART(petitionGuid)); CharacterDatabase.CommitTransaction(trans); // created - sLog->outDebug(LOG_FILTER_NETWORKIO, "TURN IN PETITION GUID %u", GUID_LOPART(petitionguid)); + sLog->outDebug(LOG_FILTER_NETWORKIO, "TURN IN PETITION GUID %u", GUID_LOPART(petitionGuid)); data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_OK; @@ -867,8 +876,7 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data) void WorldSession::HandlePetitionShowListOpcode(WorldPacket & recv_data) { - sLog->outDebug(LOG_FILTER_NETWORKIO, "Received CMSG_PETITION_SHOWLIST"); // ok - //recv_data.hexlike(); + sLog->outDebug(LOG_FILTER_NETWORKIO, "Received CMSG_PETITION_SHOWLIST"); uint64 guid; recv_data >> guid; @@ -885,21 +893,12 @@ void WorldSession::SendPetitionShowList(uint64 guid) return; } - // remove fake death - if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) - GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); - - uint8 count = 0; - if (pCreature->isTabardDesigner()) - count = 1; - else - count = 3; - WorldPacket data(SMSG_PETITION_SHOWLIST, 8+1+4*6); data << guid; // npc guid - data << count; // count - if (count == 1) + + if (pCreature->isTabardDesigner()) { + data << uint8(1); // count data << uint32(1); // index data << uint32(GUILD_CHARTER); // charter entry data << uint32(CHARTER_DISPLAY_ID); // charter display id @@ -909,6 +908,7 @@ void WorldSession::SendPetitionShowList(uint64 guid) } else { + data << uint8(3); // count // 2v2 data << uint32(1); // index data << uint32(ARENA_TEAM_CHARTER_2v2); // charter entry @@ -931,15 +931,7 @@ void WorldSession::SendPetitionShowList(uint64 guid) data << uint32(5); // unknown data << uint32(5); // required signs? } - //for (uint8 i = 0; i < count; ++i) - //{ - // data << uint32(i); // index - // data << uint32(GUILD_CHARTER); // charter entry - // data << uint32(CHARTER_DISPLAY_ID); // charter display id - // data << uint32(GUILD_CHARTER_COST+i); // charter cost - // data << uint32(0); // unknown - // data << uint32(9); // required signs? - //} + SendPacket(&data); sLog->outDebug(LOG_FILTER_NETWORKIO, "Sent SMSG_PETITION_SHOWLIST"); } |
