/* * Copyright (C) 2008-2012 TrinityCore * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ /* ScriptData Name: Arena Spectator Complete: 80% Comment: This script allow to spectate games Category: Custom Script Future Developing: 5v5, Specific Player Credits: Flameshot http://flameshot.tk LilleCarl EndScriptData */ #include "Chat.h" #include "ArenaTeamMgr.h" #include "BattlegroundMgr.h" #include "WorldSession.h" #include "Player.h" #include "ArenaTeam.h" #include "Battleground.h" #include "BattlegroundMgr.h" #include "CreatureTextMgr.h" #include "Config.h" #include "ScriptedGossip.h" #include "ScriptMgr.h" int8 UsingGossip; class arena_spectator_commands : public CommandScript { public: arena_spectator_commands() : CommandScript("arena_spectator_commands") { } static bool HandleSpectateCommand(ChatHandler* handler, char const* args) { Player* target; ObjectGuid target_guid; std::string target_name; if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) return false; Player* player = handler->GetSession()->GetPlayer(); if (target == player || target_guid == player->GetGUID()) { handler->PSendSysMessage("You can't spectate yourself."); handler->SetSentErrorMessage(true); return false; } if (player->IsInCombat()) { handler->PSendSysMessage("You are in combat."); handler->SetSentErrorMessage(true); return false; } if (!target) { handler->PSendSysMessage("Target is not online or does not exist."); handler->SetSentErrorMessage(true); return false; } if (player->GetPet()) { handler->PSendSysMessage("You must hide your pet."); handler->SetSentErrorMessage(true); return false; } if (player->GetMap()->IsBattlegroundOrArena() && !player->IsSpectator()) { handler->PSendSysMessage("You are already in a battleground or arena."); handler->SetSentErrorMessage(true); return false; } Map* cMap = target->GetMap(); if (!cMap->IsBattleArena()) { handler->PSendSysMessage("Player is not in an Arena match."); handler->SetSentErrorMessage(true); return false; } if (player->GetMap()->IsBattleground()) { handler->PSendSysMessage("You can't do that while in a battleground."); handler->SetSentErrorMessage(true); return false; } if (target->HasAura(32728) || target->HasAura(32727)) { handler->PSendSysMessage("You can't do that. The Arena match didn't start yet."); handler->SetSentErrorMessage(true); return false; } if (target->IsSpectator()) { handler->PSendSysMessage("You can't do that. Your target is a spectator."); handler->SetSentErrorMessage(true); return false; } if (player->IsMounted()) { handler->PSendSysMessage("Cannot Spectate while mounted."); handler->SetSentErrorMessage(true); return false; } // all's well, set bg id // when porting out from the bg, it will be reset to 0 player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId()); // remember current position as entry point for return at bg end teleportation if (!player->GetMap()->IsBattlegroundOrArena()) player->SetBattlegroundEntryPoint(); // stop flight if need if (player->IsInFlight()) { player->GetMotionMaster()->MovementExpired(); player->CleanupAfterTaxiFlight(); } // save only in non-flight case else player->SaveRecallPosition(); // search for two teams Battleground *bGround = target->GetBattleground(); if (bGround->isRated()) { uint32 slot = bGround->GetArenaType() - 2; if (bGround->GetArenaType() > 3) slot = 2; uint32 firstTeamID = target->GetArenaTeamId(slot); uint32 secondTeamID = 0; Player *firstTeamMember = target; Player *secondTeamMember = NULL; for (Battleground::BattlegroundPlayerMap::const_iterator itr = bGround->GetPlayers().begin(); itr != bGround->GetPlayers().end(); ++itr) if (Player* tmpPlayer = ObjectAccessor::FindPlayer(itr->first)) { if (tmpPlayer->IsSpectator()) continue; uint32 tmpID = tmpPlayer->GetArenaTeamId(slot); if (tmpID != firstTeamID && tmpID > 0) { secondTeamID = tmpID; secondTeamMember = tmpPlayer; break; } } if (firstTeamID > 0 && secondTeamID > 0 && secondTeamMember) { ArenaTeam *firstTeam = sArenaTeamMgr->GetArenaTeamById(firstTeamID); ArenaTeam *secondTeam = sArenaTeamMgr->GetArenaTeamById(secondTeamID); if (firstTeam && secondTeam) { handler->PSendSysMessage("You entered a Rated Arena."); handler->PSendSysMessage("Teams:"); handler->PSendSysMessage("|cFFffffff%s|r vs |cFFffffff%s|r", firstTeam->GetName().c_str(), secondTeam->GetName().c_str()); handler->PSendSysMessage("|cFFffffff%u(%u)|r -- |cFFffffff%u(%u)|r", firstTeam->GetRating(), firstTeam->GetAverageMMR(firstTeamMember->GetGroup()), secondTeam->GetRating(), secondTeam->GetAverageMMR(secondTeamMember->GetGroup())); } } } // to point to see at target with same orientation float x, y, z; target->GetContactPoint(player, x, y, z); player->TeleportTo(target->GetMapId(), x, y, z, player->GetAngle(target), TELE_TO_GM_MODE); player->SetPhaseMask(target->GetPhaseMask(), true); player->SetSpectate(true); target->GetBattleground()->AddSpectator(player->GetGUID()); return true; } static bool HandleSpectateCancelCommand(ChatHandler* handler, const char* /*args*/) { Player* player = handler->GetSession()->GetPlayer(); if (!player->IsSpectator()) { handler->PSendSysMessage("You are not a spectator."); handler->SetSentErrorMessage(true); return false; } player->GetBattleground()->RemoveSpectator(player->GetGUID()); player->CancelSpectate(); player->TeleportToBGEntryPoint(); return true; } static bool HandleSpectateFromCommand(ChatHandler* handler, const char *args) { Player* target; ObjectGuid target_guid; std::string target_name; if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) return false; Player* player = handler->GetSession()->GetPlayer(); if (target->HasAuraType(SPELL_AURA_MOD_STEALTH)) { handler->PSendSysMessage("You can't target stealthed players."); handler->SetSentErrorMessage(true); return false; } if (!target) { handler->PSendSysMessage("Player is not online or does not exist."); handler->SetSentErrorMessage(true); return false; } if (!player->IsSpectator()) { handler->PSendSysMessage("You are not a spectator, spectate someone first."); handler->SetSentErrorMessage(true); return false; } if (target->IsSpectator() && target != player) { handler->PSendSysMessage("You can't do that. Your target is a spectator."); handler->SetSentErrorMessage(true); return false; } if (player->GetMap() != target->GetMap()) { handler->PSendSysMessage("You can't do that. Your target might be in a different arena match."); handler->SetSentErrorMessage(true); return false; } // check for arena preperation // if exists than battle didn`t begin if (target->HasAura(32728) || target->HasAura(32727)) { handler->PSendSysMessage("You can't do that. The Arena match didn't start yet."); handler->SetSentErrorMessage(true); return false; } (target == player && player->GetSpectateFrom()) ? player->SetViewpoint(player->GetSpectateFrom(), false) : player->SetViewpoint(target, true); return true; } static bool HandleSpectateResetCommand(ChatHandler* handler, const char *args) { Player* player = handler->GetSession()->GetPlayer(); if (!player) { handler->PSendSysMessage("Cant find player."); handler->SetSentErrorMessage(true); return false; } if (!player->IsSpectator()) { handler->PSendSysMessage("You are not a spectator!"); handler->SetSentErrorMessage(true); return false; } Battleground *bGround = player->GetBattleground(); if (!bGround) return false; if (bGround->GetStatus() != STATUS_IN_PROGRESS) return true; for (Battleground::BattlegroundPlayerMap::const_iterator itr = bGround->GetPlayers().begin(); itr != bGround->GetPlayers().end(); ++itr) if (Player* tmpPlayer = ObjectAccessor::FindPlayer(itr->first)) { if (tmpPlayer->IsSpectator()) continue; uint32 tmpID = bGround->GetPlayerTeam(tmpPlayer->GetGUID()); // generate addon massage std::string pName = tmpPlayer->GetName(); std::string tName = ""; if (Player *target = tmpPlayer->GetSelectedPlayer()) tName = target->GetName(); SpectatorAddonMsg msg; // Travis msg.SetPlayer(pName); if (tName != "") msg.SetTarget(tName); msg.SetStatus(tmpPlayer->IsAlive()); msg.SetClass(tmpPlayer->getClass()); msg.SetCurrentHP(tmpPlayer->GetHealth()); msg.SetMaxHP(tmpPlayer->GetMaxHealth()); Powers powerType = tmpPlayer->getPowerType(); msg.SetMaxPower(tmpPlayer->GetMaxPower(powerType)); msg.SetCurrentPower(tmpPlayer->GetPower(powerType)); msg.SetPowerType(powerType); msg.SetTeam(tmpID); msg.SendPacket(player->GetGUID()); } return true; } std::vector GetCommands() const override { static std::vector spectateCommandTable = { { "player", rbac::RBAC_PERM_COMMAND_SPECTATE_PLAYER, true, &HandleSpectateCommand, "" }, { "view", rbac::RBAC_PERM_COMMAND_SPECTATE_VIEW, true, &HandleSpectateFromCommand, "" }, { "reset", rbac::RBAC_PERM_COMMAND_SPECTATE_RESET, true, &HandleSpectateResetCommand, "" }, { "leave", rbac::RBAC_PERM_COMMAND_SPECTATE_LEAVE, true, &HandleSpectateCancelCommand, "" } }; static std::vector commandTable = { { "spectate", rbac::RBAC_PERM_COMMAND_SPECTATE, false, NULL, "", spectateCommandTable } }; return commandTable; } }; enum NpcSpectatorAtions { // will be used for scrolling NPC_SPECTATOR_ACTION_2V2_GAMES = 1000, //NPC_SPECTATOR_ACTION_LIST_GAMES = 1000, NPC_SPECTATOR_ACTION_3V3_GAMES = 2000, // NPC_SPECTATOR_ACTION_LIST_TOP_GAMES = 2000, // Disabled till I fix 2v2 , 3v3 //NPC_SPECTATOR_ACTION_5V5_GAMES = 3000, //NPC_SPECTATOR_ACTION_SPECIFIC = 500, // NPC_SPECTATOR_ACTION_SELECTED_PLAYER + player.Guid() NPC_SPECTATOR_ACTION_SELECTED_PLAYER = 3000 }; const uint8 GamesOnPage = 15; class npc_arena_spectator : public CreatureScript { public: npc_arena_spectator() : CreatureScript("npc_arena_spectator") { } bool OnGossipHello(Player* pPlayer, Creature* pCreature) { pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface\\icons\\Achievement_Arena_2v2_7:35:35:-30:0|tGames: 2v2", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_2V2_GAMES); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface\\icons\\Achievement_Arena_3v3_7:35:35:-30:0|tGames: 3v3", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_3V3_GAMES); //pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface\\icons\\Achievement_Arena_5v5_7:35:35:-30:0|tGames: 5v5", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_5V5_GAMES); //pPlayer->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_CHAT, "|TInterface\\icons\\Spell_Holy_DevineAegis:35:35:-30:0|tSpectate Specific Player.", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_SPECIFIC, "", 0, true); pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID()); return true; } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) { player->PlayerTalkClass->ClearMenus(); /*if (action == NPC_SPECTATOR_ACTION_SPECIFIC) { }*/ if (action >= NPC_SPECTATOR_ACTION_2V2_GAMES && action < NPC_SPECTATOR_ACTION_3V3_GAMES) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, " Refresh", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_2V2_GAMES); ShowPage(player, action - NPC_SPECTATOR_ACTION_2V2_GAMES, false /*ARENA_TYPE_2v2*/); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } //else if (action >= NPC_SPECTATOR_ACTION_3V3_GAMES && action < NPC_SPECTATOR_ACTION_5V5_GAMES) else if (action >= NPC_SPECTATOR_ACTION_3V3_GAMES && action < NPC_SPECTATOR_ACTION_2V2_GAMES) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Refresh", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_3V3_GAMES); ShowPage(player, action - NPC_SPECTATOR_ACTION_3V3_GAMES, true/*ARENA_TYPE_3v3*/); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); } /*else if (action >= NPC_SPECTATOR_ACTION_5V5_GAMES && action < NPC_SPECTATOR_ACTION_SELECTED_PLAYER) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Refresh", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_5V5_GAMES); ShowPage(player, action - NPC_SPECTATOR_ACTION_5V5_GAMES, ARENA_TYPE_5v5); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); }*/ else { ObjectGuid guid = ObjectGuid(HighGuid::Player, action - NPC_SPECTATOR_ACTION_SELECTED_PLAYER); if (Player* target = ObjectAccessor::FindPlayer(guid)) { ChatHandler handler(player->GetSession()); char const* pTarget = target->GetName().c_str(); arena_spectator_commands::HandleSpectateCommand(&handler, pTarget); } } return true; } std::string GetClassNameById(uint8 id) { std::string sClass = ""; switch (id) { case CLASS_WARRIOR: sClass = "Warrior "; break; case CLASS_PALADIN: sClass = "Paladin "; break; case CLASS_HUNTER: sClass = "Hunter "; break; case CLASS_ROGUE: sClass = "Rogue "; break; case CLASS_PRIEST: sClass = "Priest "; break; case CLASS_DEATH_KNIGHT: sClass = "DKnight "; break; case CLASS_SHAMAN: sClass = "Shaman "; break; case CLASS_MAGE: sClass = "Mage "; break; case CLASS_WARLOCK: sClass = "Warlock "; break; case CLASS_DRUID: sClass = "Druid "; break; } return sClass; } std::string GetGamesStringData(Battleground* team, uint16 mmr , uint16 mmrTwo) { std::string teamsMember[BG_TEAMS_COUNT]; uint32 firstTeamId = 0; for (Battleground::BattlegroundPlayerMap::const_iterator itr = team->GetPlayers().begin(); itr != team->GetPlayers().end(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(itr->first)) { if (player->IsSpectator()) continue; if (player->IsGameMaster()) continue; uint32 team = itr->second.Team; if (!firstTeamId) firstTeamId = team; // Try to get ArenaTeamName std::string name; ArenaTeam* arena = sArenaTeamMgr->GetArenaTeamByName(name); // teamsMember[firstTeamId == team] += GetClassNameById(player->getClass()); } std::string data = teamsMember[0] + "("; std::stringstream ss; std::stringstream sstwo; ss << mmr; sstwo << mmrTwo; data += ss.str(); data += ") - "; data += teamsMember[1] + "(" + sstwo.str(); data += ")"; return data; } ObjectGuid GetFirstPlayerGuid(Battleground* team) { for (Battleground::BattlegroundPlayerMap::const_iterator itr = team->GetPlayers().begin(); itr != team->GetPlayers().end(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(itr->first)) return itr->first; return ObjectGuid::Empty; } //void ShowPage(Player* player, uint16 page, uint32 IsTop) void ShowPage(Player* player, uint16 page, bool IsTop) { uint32 firstTeamId = 0; uint16 TypeOne = 0; uint16 TypeTwo = 0; uint16 TypeThree = 0; uint16 mmr = 0; uint16 mmrTwo = 0; bool haveNextPage = false; for (uint8 i = 0; i <= MAX_BATTLEGROUND_TYPE_ID; ++i) { if (!sBattlegroundMgr->IsArenaType(BattlegroundTypeId(i))) continue; //BattlegroundContainer arenas = sBattlegroundMgr->GetBattlegroundsByType((BattlegroundTypeId)i); BattlegroundData* arenas = sBattlegroundMgr->GetAllBattlegroundsWithTypeId(BattlegroundTypeId(i)); if (!arenas || arenas->m_Battlegrounds.empty()) continue; for (BattlegroundContainer::const_iterator itr = arenas->m_Battlegrounds.begin(); itr != arenas->m_Battlegrounds.end(); ++itr) { Battleground* arena = itr->second; Player* target = ObjectAccessor::FindPlayer(GetFirstPlayerGuid(arena)); if (target && (target->HasAura(32728) || target->HasAura(32727))) continue; if (!arena->GetPlayersSize()) continue; //uint16 mmrTwo = arena->GetArenaMatchmakerRating(0); //uint16 mmrThree = arena->GetArenaMatchmakerRating(1); // This shows the mmr of both teams on ARENA_TYPE_2v2 if (arena->GetArenaType() == ARENA_TYPE_2v2) { mmr = arena->GetArenaMatchmakerRating(0); firstTeamId = target->GetArenaTeamId(0); Battleground::BattlegroundPlayerMap::const_iterator citr = arena->GetPlayers().begin(); for (; citr != arena->GetPlayers().end(); ++citr) if (Player* plrs = ObjectAccessor::FindPlayer(citr->first)) if (plrs->GetArenaTeamId(0) != firstTeamId) mmrTwo = arena->GetArenaMatchmakerRating(citr->second.Team); } // This shows the mmr of both teams on ARENA_TYPE_3v3 else if (arena->GetArenaType() == ARENA_TYPE_3v3) { mmr = arena->GetArenaMatchmakerRating(1); firstTeamId = target->GetArenaTeamId(1); Battleground::BattlegroundPlayerMap::const_iterator citr = arena->GetPlayers().begin(); for (; citr != arena->GetPlayers().end(); ++citr) if (Player* plrs = ObjectAccessor::FindPlayer(citr->first)) if (plrs->GetArenaTeamId(1) != firstTeamId) mmrTwo = arena->GetArenaMatchmakerRating(citr->second.Team); }/* else if (arena->GetArenaType() == ARENA_TYPE_5v5) { mmr = arena->GetArenaMatchmakerRating(2); firstTeamId = target->GetArenaTeamId(2); Battleground::BattlegroundPlayerMap::const_iterator citr = arena->GetPlayers().begin(); for (; citr != arena->GetPlayers().end(); ++citr) if (Player* plrs = ObjectAccessor::FindPlayer(citr->first)) if (plrs->GetArenaTeamId(2) != firstTeamId) mmrTwo = arena->GetArenaMatchmakerRating(citr->second.Team); } if (IsTop == 1 && arena->GetArenaType() == ARENA_TYPE_2v2) { TypeOne++; if (TypeOne > (page + 1) * GamesOnPage) { haveNextPage = true; break; } if (TypeOne >= page * GamesOnPage) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_BATTLE, GetGamesStringData(arena, mmr, mmrTwo), GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_SELECTED_PLAYER + GetFirstPlayerGuid(arena)); } else if (IsTop == 2 && arena->GetArenaType() == ARENA_TYPE_3v3) { TypeTwo++; if (TypeTwo > (page + 1) * GamesOnPage) { haveNextPage = true; break; } if (TypeTwo >= page * GamesOnPage) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_BATTLE, GetGamesStringData(arena, mmr, mmrTwo), GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_SELECTED_PLAYER + GetFirstPlayerGuid(arena)); } else if (IsTop == 3 && arena->GetArenaType() == ARENA_TYPE_5v5) { TypeThree++; if (TypeThree > (page + 1) * GamesOnPage) { haveNextPage = true; break; } if (TypeThree >= page * GamesOnPage) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_BATTLE, GetGamesStringData(arena, mmr, mmrTwo), GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_SELECTED_PLAYER + GetFirstPlayerGuid(arena)); } } } if (page > 0) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Prev..", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_2V2_GAMES + page - 1); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Prev..", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_3V3_GAMES + page - 1); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Prev..", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_5V5_GAMES + page - 1); } if (haveNextPage) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Next..", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_2V2_GAMES + page + 1); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Next..", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_3V3_GAMES + page + 1); player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Next..", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_5V5_GAMES + page + 1); } } bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code) { if (!player) return true; player->PlayerTalkClass->ClearMenus(); player->CLOSE_GOSSIP_MENU(); if (sender == GOSSIP_SENDER_MAIN) { switch (action) { case NPC_SPECTATOR_ACTION_SPECIFIC: // choosing a player const char* plrName = code; char playerName[50]; strcpy(playerName, plrName); for (int i = 0; i < 13; i++) { if (playerName[i] == NULL) break; if (i == 0 && playerName[i] > 96) playerName[0] -= 32; else if (playerName[i] < 97) playerName[i] += 32; } if (Player* target = ObjectAccessor::FindPlayerByName(playerName)) { ChatHandler handler(player->GetSession()); char const* pTarget = target->GetName().c_str(); arena_spectator_commands::HandleSpectateCommand(&handler, pTarget); } ChatHandler(player->GetSession()).PSendSysMessage("Player is not online or does not exist."); return true; } } return false; }*/ if (IsTop && arena->GetArenaType() == ARENA_TYPE_3v3) { TypeThree++; if (TypeThree > (page + 1) * GamesOnPage) { haveNextPage = true; break; } if (TypeThree >= page * GamesOnPage) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_BATTLE, GetGamesStringData(arena, mmr, mmrTwo/*mmrThree*/), GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_SELECTED_PLAYER + GetFirstPlayerGuid(arena)); } else if (!IsTop && arena->GetArenaType() == ARENA_TYPE_2v2) { TypeTwo++; if (TypeTwo > (page + 1) * GamesOnPage) { haveNextPage = true; break; } if (TypeTwo >= page * GamesOnPage) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_BATTLE, GetGamesStringData(arena, mmr, mmrTwo), GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_SELECTED_PLAYER + GetFirstPlayerGuid(arena)); } } } if (page > 0) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Prev..", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_2V2_GAMES + page - 1); if (haveNextPage) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_DOT, "Next..", GOSSIP_SENDER_MAIN, NPC_SPECTATOR_ACTION_2V2_GAMES + page + 1); } }; void AddSC_arena_spectator_script() { new arena_spectator_commands(); new npc_arena_spectator(); }