diff options
author | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
commit | e585187b248f48b3c6e9247b49fa07c6565d65e5 (patch) | |
tree | 637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /src/game/ArenaTeamHandler.cpp | |
parent | 26b5e033ffde3d161382fc9addbfa99738379641 (diff) |
*Backed out changeset 3be01fb200a5
--HG--
branch : trunk
Diffstat (limited to 'src/game/ArenaTeamHandler.cpp')
-rw-r--r-- | src/game/ArenaTeamHandler.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/game/ArenaTeamHandler.cpp b/src/game/ArenaTeamHandler.cpp index b5ecab3d424..c7ecf5b1d80 100644 --- a/src/game/ArenaTeamHandler.cpp +++ b/src/game/ArenaTeamHandler.cpp @@ -17,21 +17,26 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include "Player.h" #include "World.h" #include "WorldPacket.h" #include "WorldSession.h" #include "Database/DatabaseEnv.h" + #include "ArenaTeam.h" #include "Log.h" #include "ObjectMgr.h" #include "SocialMgr.h" + void WorldSession::HandleInspectArenaTeamsOpcode(WorldPacket & recv_data) { sLog.outDebug("MSG_INSPECT_ARENA_TEAMS"); + uint64 guid; recv_data >> guid; sLog.outDebug("Inspect Arena stats (GUID: %u TypeId: %u)", GUID_LOPART(guid),GuidHigh2TypeId(GUID_HIPART(guid))); + if(Player *plr = objmgr.GetPlayer(guid)) { for (uint8 i = 0; i < MAX_ARENA_SLOT; ++i) @@ -44,123 +49,160 @@ void WorldSession::HandleInspectArenaTeamsOpcode(WorldPacket & recv_data) } } } + void WorldSession::HandleArenaTeamQueryOpcode(WorldPacket & recv_data) { sLog.outDebug( "WORLD: Received CMSG_ARENA_TEAM_QUERY" ); + uint32 ArenaTeamId; recv_data >> ArenaTeamId; + ArenaTeam *arenateam = objmgr.GetArenaTeamById(ArenaTeamId); if(!arenateam) // arena team not found return; + arenateam->Query(this); arenateam->Stats(this); } + void WorldSession::HandleArenaTeamRosterOpcode(WorldPacket & recv_data) { sLog.outDebug( "WORLD: Received CMSG_ARENA_TEAM_ROSTER" ); + uint32 ArenaTeamId; // arena team id recv_data >> ArenaTeamId; + ArenaTeam *arenateam = objmgr.GetArenaTeamById(ArenaTeamId); if(!arenateam) return; + arenateam->Roster(this); } + void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket & recv_data) { sLog.outDebug("CMSG_ARENA_TEAM_INVITE"); + uint32 ArenaTeamId; // arena team id std::string Invitedname; + Player * player = NULL; + recv_data >> ArenaTeamId >> Invitedname; + if(!Invitedname.empty()) { if(!normalizePlayerName(Invitedname)) return; + player = ObjectAccessor::Instance().FindPlayerByName(Invitedname.c_str()); } + if(!player) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", Invitedname, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S); return; } + if(player->getLevel() < sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL)) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", player->GetName(), ERR_ARENA_TEAM_PLAYER_TO_LOW); return; } + ArenaTeam *arenateam = objmgr.GetArenaTeamById(ArenaTeamId); if(!arenateam) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PLAYER_NOT_IN_TEAM); return; } + // OK result but not send invite if(player->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) return; + if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != GetPlayer()->GetTeam()) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", "", ERR_ARENA_TEAM_NOT_ALLIED); return; } + if(player->GetArenaTeamId(arenateam->GetSlot())) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", player->GetName(), ERR_ALREADY_IN_ARENA_TEAM_S); return; } + if(player->GetArenaTeamIdInvited()) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", player->GetName(), ERR_ALREADY_INVITED_TO_ARENA_TEAM_S); return; } + if(arenateam->GetMembersSize() >= arenateam->GetType() * 2) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S,arenateam->GetName(),"",ERR_ARENA_TEAM_FULL); return; } + sLog.outDebug("Player %s Invited %s to Join his ArenaTeam", GetPlayer()->GetName(), Invitedname.c_str()); + player->SetArenaTeamIdInvited(arenateam->GetId()); + WorldPacket data(SMSG_ARENA_TEAM_INVITE, (8+10)); data << GetPlayer()->GetName(); data << arenateam->GetName(); player->GetSession()->SendPacket(&data); + sLog.outDebug("WORLD: Sent SMSG_ARENA_TEAM_INVITE"); } + void WorldSession::HandleArenaTeamAcceptOpcode(WorldPacket & /*recv_data*/) { sLog.outDebug("CMSG_ARENA_TEAM_ACCEPT"); // empty opcode + ArenaTeam *at = objmgr.GetArenaTeamById(_player->GetArenaTeamIdInvited()); if(!at) return; + if(_player->GetArenaTeamId(at->GetSlot())) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S,"","",ERR_ALREADY_IN_ARENA_TEAM); // already in arena team that size return; } + if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && _player->GetTeam() != objmgr.GetPlayerTeamByGUID(at->GetCaptain())) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S,"","",ERR_ARENA_TEAM_NOT_ALLIED);// not let enemies sign petition return; } + if(!at->AddMember(_player->GetGUID())) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S,"","",ERR_ARENA_TEAM_INTERNAL);// arena team not found return; } + // event WorldPacket data; BuildArenaTeamEventPacket(&data, ERR_ARENA_TEAM_JOIN_SS, 2, _player->GetName(), at->GetName(), ""); at->BroadcastPacket(&data); } + void WorldSession::HandleArenaTeamDeclineOpcode(WorldPacket & /*recv_data*/) { sLog.outDebug("CMSG_ARENA_TEAM_DECLINE"); // empty opcode + _player->SetArenaTeamIdInvited(0); // no more invited } + void WorldSession::HandleArenaTeamLeaveOpcode(WorldPacket & recv_data) { sLog.outDebug("CMSG_ARENA_TEAM_LEAVE"); + uint32 ArenaTeamId; // arena team id recv_data >> ArenaTeamId; + ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId); if(!at) return; @@ -177,94 +219,124 @@ void WorldSession::HandleArenaTeamLeaveOpcode(WorldPacket & recv_data) delete at; return; } + at->DelMember(_player->GetGUID()); + // event WorldPacket data; BuildArenaTeamEventPacket(&data, ERR_ARENA_TEAM_LEAVE_SS, 2, _player->GetName(), at->GetName(), ""); at->BroadcastPacket(&data); + //send you are no longer member of team SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, at->GetName(), "", 0); } + void WorldSession::HandleArenaTeamDisbandOpcode(WorldPacket & recv_data) { sLog.outDebug("CMSG_ARENA_TEAM_DISBAND"); + uint32 ArenaTeamId; // arena team id recv_data >> ArenaTeamId; + ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId); if(!at) return; + if(at->GetCaptain() != _player->GetGUID()) return; + if (at->IsFighting()) return; + at->Disband(this); delete at; } + void WorldSession::HandleArenaTeamRemoveOpcode(WorldPacket & recv_data) { sLog.outDebug("CMSG_ARENA_TEAM_REMOVE"); + uint32 ArenaTeamId; std::string name; + recv_data >> ArenaTeamId; recv_data >> name; + ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId); if(!at) // arena team not found return; + if(at->GetCaptain() != _player->GetGUID()) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS); return; } + if(!normalizePlayerName(name)) return; + ArenaTeamMember* member = at->GetMember(name); if(!member) // member not found { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", name, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S); return; } + if(at->GetCaptain() == member->guid) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, "", "", ERR_ARENA_TEAM_LEADER_LEAVE_S); return; } + at->DelMember(member->guid); + // event WorldPacket data; BuildArenaTeamEventPacket(&data, ERR_ARENA_TEAM_REMOVE_SSS, 3, name, at->GetName(), _player->GetName()); at->BroadcastPacket(&data); } + void WorldSession::HandleArenaTeamLeaderOpcode(WorldPacket & recv_data) { sLog.outDebug("CMSG_ARENA_TEAM_LEADER"); + uint32 ArenaTeamId; std::string name; + recv_data >> ArenaTeamId; recv_data >> name; + ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId); if(!at) // arena team not found return; + if(at->GetCaptain() != _player->GetGUID()) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS); return; } + if(!normalizePlayerName(name)) return; + ArenaTeamMember* member = at->GetMember(name); if(!member) // member not found { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", name, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S); return; } + if(at->GetCaptain() == member->guid) // target player already captain return; + at->SetCaptain(member->guid); + // event WorldPacket data; BuildArenaTeamEventPacket(&data, ERR_ARENA_TEAM_LEADER_CHANGED_SSS, 3, _player->GetName(), name, at->GetName()); at->BroadcastPacket(&data); } + void WorldSession::SendArenaTeamCommandResult(uint32 team_action, const std::string& team, const std::string& player, uint32 error_id) { WorldPacket data(SMSG_ARENA_TEAM_COMMAND_RESULT, 4+team.length()+1+player.length()+1+4); @@ -274,6 +346,7 @@ void WorldSession::SendArenaTeamCommandResult(uint32 team_action, const std::str data << error_id; SendPacket(&data); } + void WorldSession::BuildArenaTeamEventPacket(WorldPacket *data, uint8 eventid, uint8 str_count, const std::string& str1, const std::string& str2, const std::string& str3) { data->Initialize(SMSG_ARENA_TEAM_EVENT, 1+1+1); @@ -298,6 +371,7 @@ void WorldSession::BuildArenaTeamEventPacket(WorldPacket *data, uint8 eventid, u return; } } + void WorldSession::SendNotInArenaTeamPacket(uint8 type) { WorldPacket data(SMSG_ARENA_ERROR, 4+1); // 886 - You are not in a %uv%u arena team @@ -307,12 +381,15 @@ void WorldSession::SendNotInArenaTeamPacket(uint8 type) data << uint8(type); // team type (2=2v2,3=3v3,5=5v5), can be used for custom types... SendPacket(&data); } + /* +ERR_ARENA_NO_TEAM_II "You are not in a %dv%d arena team" + +ERR_ARENA_TEAM_CREATE_S "%s created. To disband, use /teamdisband [2v2, 3v3, 5v5]." +ERR_ARENA_TEAM_INVITE_SS "You have invited %s to join %s" +ERR_ARENA_TEAM_QUIT_S "You are no longer a member of %s" ERR_ARENA_TEAM_FOUNDER_S "Congratulations, you are a founding member of %s! To leave, use /teamquit [2v2, 3v3, 5v5]." + +ERR_ARENA_TEAM_INTERNAL "Internal arena team error" +ERR_ALREADY_IN_ARENA_TEAM "You are already in an arena team of that size" +ERR_ALREADY_IN_ARENA_TEAM_S "%s is already in an arena team of that size" @@ -326,15 +403,23 @@ ERR_ARENA_TEAM_FOUNDER_S "Congratulations, you are a founding member of %s! To +ERR_ARENA_TEAM_PLAYER_NOT_IN_TEAM_SS "%s is not in %s" +ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S "\"%s\" not found" +ERR_ARENA_TEAM_NOT_ALLIED "You cannot invite players from the opposing alliance" + +ERR_ARENA_TEAM_JOIN_SS "%s has joined %s" +ERR_ARENA_TEAM_YOU_JOIN_S "You have joined %s. To leave, use /teamquit [2v2, 3v3, 5v5]." + +ERR_ARENA_TEAM_LEAVE_SS "%s has left %s" + +ERR_ARENA_TEAM_LEADER_IS_SS "%s is the captain of %s" +ERR_ARENA_TEAM_LEADER_CHANGED_SSS "%s has made %s the new captain of %s" + +ERR_ARENA_TEAM_REMOVE_SSS "%s has been kicked out of %s by %s" + +ERR_ARENA_TEAM_DISBANDED_S "%s has disbanded %s" + ERR_ARENA_TEAM_TARGET_TOO_LOW_S "%s is not high enough level to join your team" + ERR_ARENA_TEAM_TOO_MANY_MEMBERS_S "%s is full" + ERR_ARENA_TEAM_LEVEL_TOO_LOW_I "You must be level %d to form an arena team" */ |