Advertisement
Guest User

ArenaTeamHandler.cpp

a guest
Sep 12th, 2015
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.68 KB | None | 0 0
  1. /*
  2.  * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
  3.  * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License as published by the
  7.  * Free Software Foundation; either version 2 of the License, or (at your
  8.  * option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT
  11.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12.  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13.  * more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program. If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18.  
  19. #include "Player.h"
  20. #include "World.h"
  21. #include "WorldPacket.h"
  22. #include "WorldSession.h"
  23. #include "DatabaseEnv.h"
  24.  
  25. #include "ArenaTeam.h"
  26. #include "Log.h"
  27. #include "ObjectMgr.h"
  28. #include "SocialMgr.h"
  29. #include "ArenaTeamMgr.h"
  30. #include "Opcodes.h"
  31.  
  32. void WorldSession::HandleInspectArenaTeamsOpcode(WorldPacket& recvData)
  33. {
  34.     sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_INSPECT_ARENA_TEAMS");
  35.  
  36.     uint64 guid;
  37.     recvData >> guid;
  38.     sLog->outDebug(LOG_FILTER_NETWORKIO, "Inspect Arena stats (GUID: %u TypeId: %u)", GUID_LOPART(guid), GuidHigh2TypeId(GUID_HIPART(guid)));
  39.  
  40.     if (Player* player = ObjectAccessor::FindPlayer(guid))
  41.     {
  42.         for (uint8 i = 0; i < MAX_ARENA_SLOT; ++i)
  43.         {
  44.             if (uint32 a_id = player->GetArenaTeamId(i))
  45.             {
  46.                 if (ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(a_id))
  47.                     arenaTeam->Inspect(this, player->GetGUID());
  48.             }
  49.         }
  50.     }
  51. }
  52.  
  53. void WorldSession::HandleArenaTeamQueryOpcode(WorldPacket& recvData)
  54. {
  55.     sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_ARENA_TEAM_QUERY");
  56.  
  57.     uint32 arenaTeamId;
  58.     recvData >> arenaTeamId;
  59.  
  60.     if (ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId))
  61.     {
  62.         arenaTeam->Query(this);
  63.         arenaTeam->SendStats(this);
  64.     }
  65. }
  66.  
  67. void WorldSession::HandleArenaTeamRosterOpcode(WorldPacket& recvData)
  68. {
  69.     sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_ARENA_TEAM_ROSTER");
  70.  
  71.     uint32 arenaTeamId;                                     // arena team id
  72.     recvData >> arenaTeamId;
  73.  
  74.     if (ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId))
  75.         arenaTeam->Roster(this);
  76. }
  77.  
  78. void WorldSession::HandleArenaTeamCreateOpcode(WorldPacket & recvData)
  79. {
  80.     sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_ARENA_TEAM_CREATE");
  81.  
  82.     uint32 slot, icon, iconcolor, border, bordercolor, background;
  83.     std::string name;
  84.  
  85.     recvData >> slot;
  86.     recvData >> iconcolor;
  87.     recvData >> bordercolor;
  88.     recvData >> border;
  89.     recvData >> background;
  90.     recvData >> icon;
  91.     name = recvData.ReadString(recvData.ReadBits(8));
  92.  
  93.     uint8 type = ArenaTeam::GetTypeBySlot(slot);
  94.  
  95.     if (_player->GetArenaTeamId(slot))
  96.     {
  97.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", _player->GetName(), ERR_ALREADY_IN_ARENA_TEAM_S);
  98.         return;
  99.     }
  100.  
  101.     if (sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
  102.     {
  103.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_INVALID);
  104.         return;
  105.     }
  106.  
  107.     if (sArenaTeamMgr->GetArenaTeamByName(name))
  108.     {
  109.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_EXISTS_S);
  110.         return;
  111.     }
  112.  
  113.     ArenaTeam* arenaTeam = new ArenaTeam;
  114.     if (!arenaTeam->Create(GUID_LOPART(_player->GetGUID()), type, name, background, icon, iconcolor, border, bordercolor))
  115.     {
  116.         sLog->outError(LOG_FILTER_ARENAS, "Arena team create failed.");
  117.         delete arenaTeam;
  118.         return;
  119.     }
  120.  
  121.     sArenaTeamMgr->AddArenaTeam(arenaTeam);
  122.  
  123.     SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_CREATED);
  124. }
  125.  
  126. void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket& recvData)
  127. {
  128.     sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_INVITE");
  129.  
  130.     uint32 arenaTeamId;                                     // arena team id
  131.     std::string invitedName;
  132.  
  133.     Player* player = NULL;
  134.  
  135.     recvData >> arenaTeamId >> invitedName;
  136.  
  137.     if (!invitedName.empty())
  138.     {
  139.         if (!normalizePlayerName(invitedName))
  140.             return;
  141.  
  142.         player = sObjectAccessor->FindPlayerByName(invitedName);
  143.     }
  144.  
  145.     if (!player)
  146.     {
  147.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", invitedName, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S);
  148.         return;
  149.     }
  150.  
  151.     if (player->getLevel() < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
  152.     {
  153.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", player->GetName(), ERR_ARENA_TEAM_TARGET_TOO_LOW_S);
  154.         return;
  155.     }
  156.  
  157.     ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
  158.     if (!arenaTeam)
  159.     {
  160.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PLAYER_NOT_IN_TEAM);
  161.         return;
  162.     }
  163.  
  164.     if (arenaTeam->GetCaptain() != _player->GetGUID())
  165.     {
  166.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS);
  167.         return;
  168.     }
  169.  
  170.     // OK result but don't send invite
  171.     if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow()))
  172.         return;
  173.  
  174.     if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != GetPlayer()->GetTeam())
  175.     {
  176.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", "", ERR_ARENA_TEAM_NOT_ALLIED);
  177.         return;
  178.     }
  179.  
  180.     if (player->GetArenaTeamId(arenaTeam->GetSlot()))
  181.     {
  182.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", player->GetName(), ERR_ALREADY_IN_ARENA_TEAM_S);
  183.         return;
  184.     }
  185.  
  186.     if (player->GetArenaTeamIdInvited())
  187.     {
  188.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", player->GetName(), ERR_ALREADY_INVITED_TO_ARENA_TEAM_S);
  189.         return;
  190.     }
  191.  
  192.     if (arenaTeam->GetMembersSize() >= arenaTeam->GetType() * 2)
  193.     {
  194.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, arenaTeam->GetName(), "", ERR_ARENA_TEAM_TOO_MANY_MEMBERS_S);
  195.         return;
  196.     }
  197.  
  198.     sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Player %s Invited %s to Join his ArenaTeam", GetPlayer()->GetName().c_str(), invitedName.c_str());
  199.  
  200.     player->SetArenaTeamIdInvited(arenaTeam->GetId());
  201.  
  202.     WorldPacket data(SMSG_ARENA_TEAM_INVITE, (8+10));
  203.     data << GetPlayer()->GetName();
  204.     data << arenaTeam->GetName();
  205.     player->GetSession()->SendPacket(&data);
  206.  
  207.     sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_ARENA_TEAM_INVITE");
  208. }
  209.  
  210. void WorldSession::HandleArenaTeamAcceptOpcode(WorldPacket & /*recvData*/)
  211. {
  212.     sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_ACCEPT");                // empty opcode
  213.  
  214.     ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(_player->GetArenaTeamIdInvited());
  215.     if (!arenaTeam)
  216.         return;
  217.  
  218.     // Check if player is already in another team of the same size
  219.     if (_player->GetArenaTeamId(arenaTeam->GetSlot()))
  220.     {
  221.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ALREADY_IN_ARENA_TEAM);
  222.         return;
  223.     }
  224.  
  225.     // Only allow members of the other faction to join the team if cross faction interaction is enabled
  226.     if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && _player->GetTeam() != sObjectMgr->GetPlayerTeamByGUID(arenaTeam->GetCaptain()))
  227.     {
  228.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_NOT_ALLIED);
  229.         return;
  230.     }
  231.  
  232.     // Add player to team
  233.     if (!arenaTeam->AddMember(_player->GetGUID()))
  234.     {
  235.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_INTERNAL);
  236.         return;
  237.     }
  238.  
  239.     // Broadcast event
  240.     arenaTeam->BroadcastEvent(ERR_ARENA_TEAM_JOIN_SS, _player->GetGUID(), 2, _player->GetName(), arenaTeam->GetName(), "");
  241. }
  242.  
  243. void WorldSession::HandleArenaTeamDeclineOpcode(WorldPacket & /*recvData*/)
  244. {
  245.     sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_DECLINE");               // empty opcode
  246.  
  247.     // Remove invite from player
  248.     _player->SetArenaTeamIdInvited(0);
  249. }
  250.  
  251. void WorldSession::HandleArenaTeamLeaveOpcode(WorldPacket& recvData)
  252. {
  253.     sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_LEAVE");
  254.  
  255.     uint32 arenaTeamId;
  256.     recvData >> arenaTeamId;
  257.  
  258.     ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
  259.     if (!arenaTeam)
  260.         return;
  261.  
  262.     // Disallow leave team while in arena
  263.     if (_player->InArena())
  264.     {
  265.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, "", "", ERR_ARENA_TEAM_INTERNAL);
  266.         return;
  267.     }
  268.  
  269.     // Team captain can't leave the team if other members are still present
  270.     if (_player->GetGUID() == arenaTeam->GetCaptain() && arenaTeam->GetMembersSize() > 1)
  271.     {
  272.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, "", "", ERR_ARENA_TEAM_LEADER_LEAVE_S);
  273.         return;
  274.     }
  275.  
  276.     // If team consists only of the captain, disband the team
  277.     if (_player->GetGUID() == arenaTeam->GetCaptain())
  278.     {
  279.         arenaTeam->Disband(this);
  280.         delete arenaTeam;
  281.         return;
  282.     }
  283.     else
  284.         arenaTeam->DelMember(_player->GetGUID(), true);
  285.  
  286.     // Broadcast event
  287.     arenaTeam->BroadcastEvent(ERR_ARENA_TEAM_LEAVE_SS, _player->GetGUID(), 2, _player->GetName(), arenaTeam->GetName(), "");
  288.  
  289.     // Inform player who left
  290.     SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, arenaTeam->GetName(), "", 0);
  291. }
  292.  
  293. void WorldSession::HandleArenaTeamDisbandOpcode(WorldPacket& recvData)
  294. {
  295.     sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_DISBAND");
  296.  
  297.     uint32 arenaTeamId;
  298.     recvData >> arenaTeamId;
  299.  
  300.     if (ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId))
  301.     {
  302.         // Only captain can disband the team
  303.         if (arenaTeam->GetCaptain() != _player->GetGUID())
  304.             return;
  305.  
  306.         // Teams cannot be disbanded during fights
  307.         if (arenaTeam->IsFighting())
  308.             return;
  309.  
  310.         arenaTeam->Disband(this);
  311.         delete arenaTeam;
  312.     }
  313. }
  314.  
  315. void WorldSession::HandleArenaTeamRemoveOpcode(WorldPacket& recvData)
  316. {
  317.     sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_REMOVE");
  318.  
  319.     uint32 arenaTeamId;
  320.     std::string name;
  321.  
  322.     recvData >> arenaTeamId;
  323.     recvData >> name;
  324.  
  325.     // Check for valid arena team
  326.     ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
  327.     if (!arenaTeam)
  328.         return;
  329.  
  330.     // Only captain can remove members
  331.     if (arenaTeam->GetCaptain() != _player->GetGUID())
  332.     {
  333.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS);
  334.         return;
  335.     }
  336.  
  337.     if (!normalizePlayerName(name))
  338.         return;
  339.  
  340.     // Check if team member exists
  341.     ArenaTeamMember* member = arenaTeam->GetMember(name);
  342.     if (!member)
  343.     {
  344.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", name, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S);
  345.         return;
  346.     }
  347.  
  348.     // Captain cannot be removed
  349.     if (arenaTeam->GetCaptain() == member->Guid)
  350.     {
  351.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, "", "", ERR_ARENA_TEAM_LEADER_LEAVE_S);
  352.         return;
  353.     }
  354.  
  355.     arenaTeam->DelMember(member->Guid, true);
  356.  
  357.     // Broadcast event
  358.     arenaTeam->BroadcastEvent(ERR_ARENA_TEAM_REMOVE_SSS, 0, 3, name, arenaTeam->GetName(), _player->GetName());
  359. }
  360.  
  361. void WorldSession::HandleArenaTeamLeaderOpcode(WorldPacket& recvData)
  362. {
  363.     sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_LEADER");
  364.  
  365.     uint32 arenaTeamId;
  366.     std::string name;
  367.  
  368.     recvData >> arenaTeamId;
  369.     recvData >> name;
  370.  
  371.     // Check for valid arena team
  372.     ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
  373.     if (!arenaTeam)
  374.         return;
  375.  
  376.     // Only captain can pass leadership
  377.     if (arenaTeam->GetCaptain() != _player->GetGUID())
  378.     {
  379.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS);
  380.         return;
  381.     }
  382.  
  383.     if (!normalizePlayerName(name))
  384.         return;
  385.  
  386.     // Check if team member exists
  387.     ArenaTeamMember* member = arenaTeam->GetMember(name);
  388.     if (!member)
  389.     {
  390.         SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", name, ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S);
  391.         return;
  392.     }
  393.  
  394.     // Check if the target is already team captain
  395.     if (arenaTeam->GetCaptain() == member->Guid)
  396.         return;
  397.  
  398.     arenaTeam->SetCaptain(member->Guid);
  399.  
  400.     // Broadcast event
  401.     arenaTeam->BroadcastEvent(ERR_ARENA_TEAM_LEADER_CHANGED_SSS, 0, 3, _player->GetName(), name, arenaTeam->GetName());
  402. }
  403.  
  404. void WorldSession::SendArenaTeamCommandResult(uint32 teamAction, const std::string& team, const std::string& player, uint32 errorId)
  405. {
  406.     WorldPacket data(SMSG_ARENA_TEAM_COMMAND_RESULT, 2 + team.length() + player.length() + 4 + 4);
  407.  
  408.     data.WriteBits(player.length(), 7);
  409.     data.WriteBits(team.length(), 8);
  410.     data.FlushBits();
  411.  
  412.     data.WriteString(player);
  413.     data << uint32(teamAction);
  414.     data << uint32(errorId);
  415.     data.WriteString(team);
  416.     SendPacket(&data);
  417. }
  418.  
  419. void WorldSession::SendNotInArenaTeamPacket(uint8 type)
  420. {
  421.     WorldPacket data(SMSG_ARENA_ERROR, 4+1);
  422.     uint32 error = 0;
  423.     data << uint32(error);                                  // 0 = ERR_ARENA_NO_TEAM_II, 1 = ERR_ARENA_EXPIRED_CAIS, 2 = ERR_LFG_CANT_USE_BATTLEGROUND
  424.     if (!error)
  425.         data << uint8(type);                                // team type (2=2v2, 3=3v3, 5=5v5), can be used for custom types...
  426.     SendPacket(&data);
  427. }
  428.  
  429. /*
  430. +ERR_ARENA_NO_TEAM_II "You are not in a %dv%d arena team"
  431.  
  432. +ERR_ARENA_TEAM_CREATE_S "%s created.  To disband, use /teamdisband [2v2, 3v3, 5v5]."
  433. +ERR_ARENA_TEAM_INVITE_SS "You have invited %s to join %s"
  434. +ERR_ARENA_TEAM_QUIT_S "You are no longer a member of %s"
  435. ERR_ARENA_TEAM_FOUNDER_S "Congratulations, you are a founding member of %s!  To leave, use /teamquit [2v2, 3v3, 5v5]."
  436.  
  437. +ERR_ARENA_TEAM_INTERNAL "Internal arena team error"
  438. +ERR_ALREADY_IN_ARENA_TEAM "You are already in an arena team of that size"
  439. +ERR_ALREADY_IN_ARENA_TEAM_S "%s is already in an arena team of that size"
  440. +ERR_INVITED_TO_ARENA_TEAM "You have already been invited into an arena team"
  441. +ERR_ALREADY_INVITED_TO_ARENA_TEAM_S "%s has already been invited to an arena team"
  442. +ERR_ARENA_TEAM_NAME_INVALID "That name contains invalid characters, please enter a new name"
  443. +ERR_ARENA_TEAM_NAME_EXISTS_S "There is already an arena team named \"%s\""
  444. +ERR_ARENA_TEAM_LEADER_LEAVE_S "You must promote a new team captain using /teamcaptain before leaving the team"
  445. +ERR_ARENA_TEAM_PERMISSIONS "You don't have permission to do that"
  446. +ERR_ARENA_TEAM_PLAYER_NOT_IN_TEAM "You are not in an arena team of that size"
  447. +ERR_ARENA_TEAM_PLAYER_NOT_IN_TEAM_SS "%s is not in %s"
  448. +ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S "\"%s\" not found"
  449. +ERR_ARENA_TEAM_NOT_ALLIED "You cannot invite players from the opposing alliance"
  450.  
  451. +ERR_ARENA_TEAM_JOIN_SS "%s has joined %s"
  452. +ERR_ARENA_TEAM_YOU_JOIN_S "You have joined %s.  To leave, use /teamquit [2v2, 3v3, 5v5]."
  453.  
  454. +ERR_ARENA_TEAM_LEAVE_SS "%s has left %s"
  455.  
  456. +ERR_ARENA_TEAM_LEADER_IS_SS "%s is the captain of %s"
  457. +ERR_ARENA_TEAM_LEADER_CHANGED_SSS "%s has made %s the new captain of %s"
  458.  
  459. +ERR_ARENA_TEAM_REMOVE_SSS "%s has been kicked out of %s by %s"
  460.  
  461. +ERR_ARENA_TEAM_DISBANDED_S "%s has disbanded %s"
  462.  
  463. ERR_ARENA_TEAM_TARGET_TOO_LOW_S "%s is not high enough level to join your team"
  464.  
  465. ERR_ARENA_TEAM_TOO_MANY_MEMBERS_S "%s is full"
  466.  
  467. ERR_ARENA_TEAM_LEVEL_TOO_LOW_I "You must be level %d to form an arena team"
  468. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement