kusanagy

1v1Arena

Jan 21st, 2017
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 32.29 KB | None | 0 0
  1. From e97ab95fc8bf8cc8464714a9ed5937d306c2fab0 Mon Sep 17 00:00:00 2001
  2. From: LordPsyan <[email protected]>
  3. Date: Mon, 29 Feb 2016 09:22:36 -0600
  4. Subject: [PATCH] 2016_02_29-1v1ArenaFITTED
  5.  
  6. ---
  7. .../arena1v1/character_v2.0.sql                    |   2 +
  8.  sql/TrinityCore-Patches/arena1v1/world_v1.0.sql    |   3 +
  9.  src/server/game/Battlegrounds/ArenaTeam.cpp        |   4 +-
  10.  src/server/game/Battlegrounds/ArenaTeam.h          |   2 +-
  11.  src/server/game/Battlegrounds/Battleground.cpp     |   5 +
  12.  src/server/game/Battlegrounds/Battleground.h       |   2 +-
  13.  src/server/game/Battlegrounds/BattlegroundMgr.cpp  |   2 +-
  14.  .../game/Battlegrounds/BattlegroundQueue.cpp       |   2 +
  15.  src/server/game/Entities/Player/Player.cpp         |   1 +
  16.  src/server/game/Handlers/BattleGroundHandler.cpp   |   6 +-
  17.  src/server/game/Handlers/PetitionsHandler.cpp      |   4 +-
  18.  src/server/game/World/World.cpp                    |   8 +
  19.  src/server/game/World/World.h                      |   8 +-
  20.  src/server/scripts/Custom/custom_script_loader.cpp |   6 +-
  21.  src/server/scripts/Custom/npc_arena1v1.cpp         | 309 +++++++++++++++++++++
  22.  src/server/scripts/Custom/npc_arena1v1.h           |  69 +++++
  23.  src/server/worldserver/worldserver.conf.dist       |  65 +++++
  24.  17 files changed, 489 insertions(+), 9 deletions(-)
  25.  create mode 100644 sql/TrinityCore-Patches/arena1v1/character_v2.0.sql
  26.  create mode 100644 sql/TrinityCore-Patches/arena1v1/world_v1.0.sql
  27.  create mode 100644 src/server/scripts/Custom/npc_arena1v1.cpp
  28.  create mode 100644 src/server/scripts/Custom/npc_arena1v1.h
  29.  
  30. diff --git a/sql/TrinityCore-Patches/arena1v1/character_v2.0.sql b/sql/TrinityCore-Patches/arena1v1/character_v2.0.sql
  31. new file mode 100644
  32. index 0000000..9f6e4a4
  33. --- /dev/null
  34. +++ b/sql/TrinityCore-Patches/arena1v1/character_v2.0.sql
  35. @@ -0,0 +1,2 @@
  36. +-- Delete all 5v5 teams and members (core will crash if any 5v5 team exist)
  37. +DELETE arena_team_member, arena_team FROM arena_team_member, arena_team WHERE arena_team_member.arenaTeamId = arena_team.arenaTeamId AND arena_team.type = 5;
  38. diff --git a/sql/TrinityCore-Patches/arena1v1/world_v1.0.sql b/sql/TrinityCore-Patches/arena1v1/world_v1.0.sql
  39. new file mode 100644
  40. index 0000000..0222faf
  41. --- /dev/null
  42. +++ b/sql/TrinityCore-Patches/arena1v1/world_v1.0.sql
  43. @@ -0,0 +1,3 @@
  44. +DELETE FROM `creature_template` WHERE `entry` = 535200;
  45. +INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `faction`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `dmgschool`, `BaseAttackTime`, `RangeAttackTime`, `BaseVariance`, `RangeVariance`, `unit_class`, `unit_flags`, `unit_flags2`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `HoverHeight`, `HealthModifier`, `ManaModifier`, `ArmorModifier`, `DamageModifier`, `ExperienceModifier`, `RacialLeader`, `movementId`, `RegenHealth`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `VerifiedBuild`) VALUES
  46. +('535200','0','0','0','0','0','18','0','18','0','LordPsyan','1v1 Arena master','','0','59','61','0','35','1','1.48','1.14286','0','0','0','1500','1900','1','1','1','0','0','0','0','0','0','0','0','7','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','','1','3','1','1','1','1','1','1','0','0','1','0','0','npc_1v1arena','1');
  47. \ No newline at end of file
  48. diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp
  49. index ec007df..5b490d7 100644
  50. --- a/src/server/game/Battlegrounds/ArenaTeam.cpp
  51. +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp
  52. @@ -439,7 +439,7 @@ void ArenaTeam::Query(WorldSession* session)
  53.      WorldPacket data(SMSG_ARENA_TEAM_QUERY_RESPONSE, 4*7+GetName().size()+1);
  54.      data << uint32(GetId());                                // team id
  55.      data << GetName();                                      // team name
  56. -    data << uint32(GetType());                              // arena team type (2=2x2, 3=3x3 or 5=5x5)
  57. +    data << uint32(GetType() == 1 ? 5 : GetType());         // arena team type (2=2x2, 3=3x3 or 1=1x1(modify 1 to 5, so player can see arenateam in 5v5 slot))
  58.      data << uint32(BackgroundColor);                        // background color
  59.      data << uint32(EmblemStyle);                            // emblem style
  60.      data << uint32(EmblemColor);                            // emblem color
  61. @@ -611,6 +611,8 @@ uint32 ArenaTeam::GetPoints(uint32 memberRating)
  62.          points *= 0.76f;
  63.      else if (Type == ARENA_TEAM_3v3)
  64.          points *= 0.88f;
  65. +    else if (Type == ARENA_TEAM_5v5) // 1v1 Arena
  66. +        points *= sWorld->getFloatConfig(CONFIG_ARENA_1V1_ARENAPOINTS_MULTI);
  67.  
  68.      points *= sWorld->getRate(RATE_ARENA_POINTS);
  69.  
  70. diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h
  71. index f27c376..58bc0a3 100644
  72. --- a/src/server/game/Battlegrounds/ArenaTeam.h
  73. +++ b/src/server/game/Battlegrounds/ArenaTeam.h
  74. @@ -82,7 +82,7 @@ enum ArenaTeamTypes
  75.  {
  76.      ARENA_TEAM_2v2      = 2,
  77.      ARENA_TEAM_3v3      = 3,
  78. -    ARENA_TEAM_5v5      = 5
  79. +    ARENA_TEAM_5v5      = 1 // 1v1 Arena - 5v5 doesn't exist anymore
  80.  };
  81.  
  82.  struct ArenaTeamMember
  83. diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
  84. index 100e2e6..ee76ad1 100644
  85. --- a/src/server/game/Battlegrounds/Battleground.cpp
  86. +++ b/src/server/game/Battlegrounds/Battleground.cpp
  87. @@ -467,6 +467,11 @@ inline void Battleground::_ProcessJoin(uint32 diff)
  88.          // First start warning - 2 or 1 minute
  89.          SendMessageToAll(StartMessageIds[BG_STARTING_EVENT_FIRST], CHAT_MSG_BG_SYSTEM_NEUTRAL);
  90.      }
  91. +
  92. +    // 1v1 Arena - Start arena after 15s, when all players are in arena
  93. +    if(GetArenaType() == ARENA_TYPE_5v5 && GetStartDelayTime() > StartDelayTimes[BG_STARTING_EVENT_THIRD] && (m_PlayersCount[0] + m_PlayersCount[1]) == 2)
  94. +        SetStartDelayTime(StartDelayTimes[BG_STARTING_EVENT_THIRD]);
  95. +
  96.      // After 1 minute or 30 seconds, warning is signaled
  97.      else if (GetStartDelayTime() <= StartDelayTimes[BG_STARTING_EVENT_SECOND] && !(m_Events & BG_STARTING_EVENT_2))
  98.      {
  99. diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
  100. index 03f138a..82fc1bb 100644
  101. --- a/src/server/game/Battlegrounds/Battleground.h
  102. +++ b/src/server/game/Battlegrounds/Battleground.h
  103. @@ -183,7 +183,7 @@ enum ArenaType
  104.  {
  105.      ARENA_TYPE_2v2          = 2,
  106.      ARENA_TYPE_3v3          = 3,
  107. -    ARENA_TYPE_5v5          = 5
  108. +    ARENA_TYPE_5v5          = 1 // 1v1 Arena - 5v5 doesn't exist anymore
  109.  };
  110.  
  111.  enum BattlegroundStartingEvents
  112. diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
  113. index 8942ca7..db6a785 100644
  114. --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
  115. +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
  116. @@ -421,7 +421,7 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId original
  117.                  maxPlayersPerTeam = 3;
  118.                  break;
  119.              case ARENA_TYPE_5v5:
  120. -                maxPlayersPerTeam = 5;
  121. +                maxPlayersPerTeam = 1; // 1v1 Arena
  122.                  break;
  123.          }
  124.  
  125. diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
  126. index 34588c7..3ab8d0c 100644
  127. --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp
  128. +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
  129. @@ -163,6 +163,7 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, Battlegr
  130.      {
  131.          ArenaTeam* Team = sArenaTeamMgr->GetArenaTeamById(arenateamid);
  132.          if (Team)
  133. +            if ((team->GetType() == ARENA_TYPE_5v5 && sWorld->getBoolConfig(CONFIG_ARENA_1V1_ANNOUNCER)) || team->GetType() != ARENA_TYPE_5v5)
  134.              sWorld->SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, Team->GetName().c_str(), ginfo->ArenaType, ginfo->ArenaType, ginfo->ArenaTeamRating);
  135.      }
  136.  
  137. @@ -355,6 +356,7 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)
  138.      // announce to world if arena team left queue for rated match, show only once
  139.      if (group->ArenaType && group->IsRated && group->Players.empty() && sWorld->getBoolConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE))
  140.          if (ArenaTeam* Team = sArenaTeamMgr->GetArenaTeamById(group->ArenaTeamId))
  141. +            if (team && ((team->GetType() == ARENA_TYPE_5v5 && sWorld->getBoolConfig(CONFIG_ARENA_1V1_ANNOUNCER)) || team->GetType() != ARENA_TYPE_5v5))
  142.              sWorld->SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, Team->GetName().c_str(), group->ArenaType, group->ArenaType, group->ArenaTeamRating);
  143.  
  144.      // if player leaves queue and he is invited to rated arena match, then he have to lose
  145. diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
  146. index 7190a80..58f918d 100644
  147. --- a/src/server/game/Entities/Player/Player.cpp
  148. +++ b/src/server/game/Entities/Player/Player.cpp
  149. @@ -21549,6 +21549,7 @@ uint32 Player::GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
  150.      uint32 max_personal_rating = 0;
  151.      for (uint8 i = minarenaslot; i < MAX_ARENA_SLOT; ++i)
  152.      {
  153. +        if(i == 2 && sWorld->getBoolConfig(CONFIG_ARENA_1V1_VENDOR_RATING) == false) continue;
  154.          if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamId(i)))
  155.          {
  156.              uint32 p_rating = GetArenaPersonalRating(i);
  157. diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
  158. index bcc698d..3fe5fac 100644
  159. --- a/src/server/game/Handlers/BattleGroundHandler.cpp
  160. +++ b/src/server/game/Handlers/BattleGroundHandler.cpp
  161. @@ -37,7 +37,7 @@
  162.  // Prepatch by LordPsyan
  163.  // 01
  164.  // 02
  165. -// 03
  166. +#include "../../scripts/Custom/npc_arena1v1.h"
  167.  // 04
  168.  // 05
  169.  // 06
  170. @@ -468,6 +468,10 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData)
  171.          if (!_player->IsInvitedForBattlegroundQueueType(bgQueueTypeId))
  172.              return;                                 // cheating?
  173.  
  174. +        // 1v1 Arena. Player can't join arena when forbidden talents are used.
  175. +        if(bgQueueTypeId == BATTLEGROUND_QUEUE_5v5 && Arena1v1CheckTalents(_player) == false)
  176. +            return;
  177. +
  178.          if (!_player->InBattleground())
  179.              _player->SetBattlegroundEntryPoint();
  180.  
  181. diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp
  182. index 781a478..c7a6905 100644
  183. --- a/src/server/game/Handlers/PetitionsHandler.cpp
  184. +++ b/src/server/game/Handlers/PetitionsHandler.cpp
  185. @@ -941,7 +941,7 @@ void WorldSession::SendPetitionShowList(ObjectGuid guid)
  186.      }
  187.      else
  188.      {
  189. -        data << uint8(3);                                   // count
  190. +        data << uint8(2);                                   // count
  191.          // 2v2
  192.          data << uint32(1);                                  // index
  193.          data << uint32(ARENA_TEAM_CHARTER_2v2);             // charter entry
  194. @@ -957,12 +957,14 @@ void WorldSession::SendPetitionShowList(ObjectGuid guid)
  195.          data << uint32(3);                                  // unknown
  196.          data << uint32(3);                                  // required signs?
  197.          // 5v5
  198. +        /* Disable purchase 5v5 petition - edit to 1v1 doesn't work (client prevent it)
  199.          data << uint32(3);                                  // index
  200.          data << uint32(ARENA_TEAM_CHARTER_5v5);             // charter entry
  201.          data << uint32(CHARTER_DISPLAY_ID);                 // charter display id
  202.          data << uint32(sWorld->getIntConfig(CONFIG_CHARTER_COST_ARENA_5v5)); // charter cost
  203.          data << uint32(5);                                  // unknown
  204.          data << uint32(5);                                  // required signs?
  205. +        */
  206.      }
  207.  
  208.      SendPacket(&data);
  209. diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
  210. index f904f30..6648f01 100644
  211. --- a/src/server/game/World/World.cpp
  212. +++ b/src/server/game/World/World.cpp
  213. @@ -1082,6 +1082,14 @@ void World::LoadConfigSettings(bool reload)
  214.      m_float_configs[CONFIG_ARENA_LOSE_RATING_MODIFIER]               = sConfigMgr->GetFloatDefault("Arena.ArenaLoseRatingModifier", 24.0f);
  215.      m_float_configs[CONFIG_ARENA_MATCHMAKER_RATING_MODIFIER]         = sConfigMgr->GetFloatDefault("Arena.ArenaMatchmakerRatingModifier", 24.0f);
  216.  
  217. +    m_bool_configs[CONFIG_ARENA_1V1_ENABLE]                             = sConfigMgr->GetBoolDefault("Arena.1v1.Enable", true);
  218. +    m_bool_configs[CONFIG_ARENA_1V1_ANNOUNCER]                         = sConfigMgr->GetBoolDefault("Arena.1v1.Announcer", false);
  219. +    m_int_configs[CONFIG_ARENA_1V1_MIN_LEVEL]                         = sConfigMgr->GetIntDefault("Arena.1v1.MinLevel", 80);
  220. +    m_int_configs[CONFIG_ARENA_1V1_COSTS]                             = sConfigMgr->GetIntDefault("Arena.1v1.Costs", 400000);
  221. +    m_bool_configs[CONFIG_ARENA_1V1_VENDOR_RATING]                     = sConfigMgr->GetBoolDefault("Arena.1v1.VendorRating", false);
  222. +    m_float_configs[CONFIG_ARENA_1V1_ARENAPOINTS_MULTI]                 = sConfigMgr->GetFloatDefault("Arena.1v1.ArenaPointsMulti", 0.64f);
  223. +    m_bool_configs[CONFIG_ARENA_1V1_BLOCK_FORBIDDEN_TALENTS]         = sConfigMgr->GetBoolDefault("Arena.1v1.BlockForbiddenTalents", true);
  224. +
  225.      m_bool_configs[CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN]            = sConfigMgr->GetBoolDefault("OffhandCheckAtSpellUnlearn", true);
  226.  
  227.      m_int_configs[CONFIG_CREATURE_PICKPOCKET_REFILL] = sConfigMgr->GetIntDefault("Creature.PickPocketRefillDelay", 10 * MINUTE);
  228. diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
  229. index 492a3bd..aae9ffa 100644
  230. --- a/src/server/game/World/World.h
  231. +++ b/src/server/game/World/World.h
  232. @@ -131,6 +131,10 @@ enum WorldBoolConfigs
  233.      CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY,
  234.      CONFIG_ARENA_SEASON_IN_PROGRESS,
  235.      CONFIG_ARENA_LOG_EXTENDED_INFO,
  236. +    CONFIG_ARENA_1V1_ENABLE,
  237. +    CONFIG_ARENA_1V1_ANNOUNCER,
  238. +    CONFIG_ARENA_1V1_VENDOR_RATING,
  239. +    CONFIG_ARENA_1V1_BLOCK_FORBIDDEN_TALENTS,
  240.      CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN,
  241.      CONFIG_VMAP_INDOOR_CHECK,
  242.      CONFIG_START_ALL_SPELLS,
  243. @@ -253,7 +257,7 @@ enum WorldFloatConfigs
  244.      // 57
  245.      // 58
  246.      // 59
  247. -    // 60
  248. +    CONFIG_ARENA_1V1_ARENAPOINTS_MULTI,
  249.      // 61
  250.      // 62
  251.      // 63
  252. @@ -382,6 +386,8 @@ enum WorldIntConfigs
  253.      CONFIG_ARENA_START_RATING,
  254.      CONFIG_ARENA_START_PERSONAL_RATING,
  255.      CONFIG_ARENA_START_MATCHMAKER_RATING,
  256. +    CONFIG_ARENA_1V1_MIN_LEVEL,
  257. +    CONFIG_ARENA_1V1_COSTS,
  258.      CONFIG_MAX_WHO,
  259.      CONFIG_HONOR_AFTER_DUEL,
  260.      CONFIG_PVP_TOKEN_MAP_TYPE,
  261. diff --git a/src/server/scripts/Custom/custom_script_loader.cpp b/src/server/scripts/Custom/custom_script_loader.cpp
  262. index 0592bb5..0165727 100644
  263. --- a/src/server/scripts/Custom/custom_script_loader.cpp
  264. +++ b/src/server/scripts/Custom/custom_script_loader.cpp
  265. @@ -76,7 +76,8 @@
  266.  // start58
  267.  // start59
  268.  // start60
  269. -// start61
  270. +// 1v1 Arena
  271. +void AddSC_npc_1v1arena();
  272.  // start62
  273.  // start63
  274.  // start64
  275. @@ -281,7 +282,8 @@ void AddCustomScripts()
  276.  // end58
  277.  // end59
  278.  // end60
  279. -// end61
  280. +// 1v1 Arena
  281. +    AddSC_npc_1v1arena();
  282.  // end62
  283.  // end63
  284.  // end64
  285. diff --git a/src/server/scripts/Custom/npc_arena1v1.cpp b/src/server/scripts/Custom/npc_arena1v1.cpp
  286. new file mode 100644
  287. index 0000000..c2f6792
  288. --- /dev/null
  289. +++ b/src/server/scripts/Custom/npc_arena1v1.cpp
  290. @@ -0,0 +1,309 @@
  291. +/*
  292. + *
  293. + * Copyright (C) 2013 Emu-Devstore <http://emu-devstore.com/>
  294. + * Written by Teiby <http://www.teiby.de/>
  295. + *
  296. + */
  297. +
  298. +#include "ScriptMgr.h"
  299. +#include "ArenaTeamMgr.h"
  300. +#include "Common.h"
  301. +#include "DisableMgr.h"
  302. +#include "BattlegroundMgr.h"
  303. +#include "Battleground.h"
  304. +#include "ArenaTeam.h"
  305. +#include "Language.h"
  306. +#include "npc_arena1v1.h"
  307. +
  308. +
  309. +class npc_1v1arena : public CreatureScript
  310. +{
  311. +public:
  312. +    npc_1v1arena() : CreatureScript("npc_1v1arena")
  313. +    {
  314. +    }
  315. +
  316. +
  317. +    bool JoinQueueArena(Player* player, Creature* me, bool isRated)
  318. +    {
  319. +        if(!player || !me)
  320. +            return false;
  321. +
  322. +        if(sWorld->getIntConfig(CONFIG_ARENA_1V1_MIN_LEVEL) > player->getLevel())
  323. +            return false;
  324. +
  325. +        ObjectGuid guid = player->GetGUID();
  326. +        uint8 arenaslot = ArenaTeam::GetSlotByType(ARENA_TEAM_5v5);
  327. +        uint8 arenatype = ARENA_TYPE_5v5;
  328. +        uint32 arenaRating = 0;
  329. +        uint32 matchmakerRating = 0;
  330. +
  331. +        // ignore if we already in BG or BG queue
  332. +        if (player->InBattleground())
  333. +            return false;
  334. +
  335. +        //check existance
  336. +        Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA);
  337. +        if (!bg)
  338. +        {
  339. +            TC_LOG_ERROR("Arena", "Battleground: template bg (all arenas) not found");
  340. +            return false;
  341. +        }
  342. +
  343. +        if (DisableMgr::IsDisabledFor(DISABLE_TYPE_BATTLEGROUND, BATTLEGROUND_AA, NULL))
  344. +        {
  345. +            ChatHandler(player->GetSession()).PSendSysMessage(LANG_ARENA_DISABLED);
  346. +            return false;
  347. +        }
  348. +
  349. +        BattlegroundTypeId bgTypeId = bg->GetTypeID();
  350. +        BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, arenatype);
  351. +        PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), player->getLevel());
  352. +        if (!bracketEntry)
  353. +            return false;
  354. +
  355. +        GroupJoinBattlegroundResult err = ERR_GROUP_JOIN_BATTLEGROUND_FAIL;
  356. +
  357. +        // check if already in queue
  358. +        if (player->GetBattlegroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES)
  359. +            //player is already in this queue
  360. +            return false;
  361. +        // check if has free queue slots
  362. +        if (!player->HasFreeBattlegroundQueueId())
  363. +            return false;
  364. +
  365. +        uint32 ateamId = 0;
  366. +
  367. +        if(isRated)
  368. +        {
  369. +            ateamId = player->GetArenaTeamId(arenaslot);
  370. +            ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId);
  371. +            if (!at)
  372. +            {
  373. +                player->GetSession()->SendNotInArenaTeamPacket(arenatype);
  374. +                return false;
  375. +            }
  376. +
  377. +            // get the team rating for queueing
  378. +            arenaRating = at->GetRating();
  379. +            matchmakerRating = arenaRating;
  380. +            // the arenateam id must match for everyone in the group
  381. +
  382. +            if (arenaRating <= 0)
  383. +                arenaRating = 1;
  384. +        }
  385. +
  386. +        BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
  387. +        bg->SetRated(isRated);
  388. +
  389. +        GroupQueueInfo* ginfo = bgQueue.AddGroup(player, NULL, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, matchmakerRating, ateamId);
  390. +        uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
  391. +        uint32 queueSlot = player->AddBattlegroundQueueId(bgQueueTypeId);
  392. +
  393. +        WorldPacket data;
  394. +        // send status packet (in queue)
  395. +        sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype, 0);
  396. +        player->GetSession()->SendPacket(&data);
  397. +
  398. +        sBattlegroundMgr->ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId());
  399. +
  400. +        return true;
  401. +    }
  402. +
  403. +
  404. +    bool CreateArenateam(Player* player, Creature* me)
  405. +    {
  406. +        if(!player || !me)
  407. +            return false;
  408. +
  409. +        uint8 slot = ArenaTeam::GetSlotByType(ARENA_TEAM_5v5);
  410. +        if (slot >= MAX_ARENA_SLOT)
  411. +            return false;
  412. +
  413. +        // Check if player is already in an arena team
  414. +        if (player->GetArenaTeamId(slot))
  415. +        {
  416. +            player->GetSession()->SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, player->GetName(), "", ERR_ALREADY_IN_ARENA_TEAM);
  417. +            return false;
  418. +        }
  419. +
  420. +
  421. +        // Teamname = playername
  422. +        // if teamname exist, we have to choose another name (playername + number)
  423. +        int i = 1;
  424. +        std::stringstream teamName;
  425. +        teamName << player->GetName();
  426. +        do
  427. +        {
  428. +            if(sArenaTeamMgr->GetArenaTeamByName(teamName.str()) != NULL) // teamname exist, so choose another name
  429. +            {
  430. +                teamName.str(std::string());
  431. +                teamName << player->GetName() << (i++);
  432. +            }
  433. +            else
  434. +                break;
  435. +        } while (i < 100); // should never happen
  436. +
  437. +        // Create arena team
  438. +        ArenaTeam* arenaTeam = new ArenaTeam();
  439. +
  440. +        if (!arenaTeam->Create(player->GetGUID(), ARENA_TEAM_5v5, teamName.str(), 4283124816, 45, 4294242303, 5, 4294705149))
  441. +        {
  442. +            delete arenaTeam;
  443. +            return false;
  444. +        }
  445. +
  446. +        // Register arena team
  447. +        sArenaTeamMgr->AddArenaTeam(arenaTeam);
  448. +        arenaTeam->AddMember(player->GetGUID());
  449. +
  450. +        ChatHandler(player->GetSession()).SendSysMessage("1v1 Arenateam successful created!");
  451. +
  452. +        return true;
  453. +    }
  454. +
  455. +
  456. +    bool OnGossipHello(Player* player, Creature* me)
  457. +    {
  458. +        if(!player || !me)
  459. +            return true;
  460. +
  461. +        if(sWorld->getBoolConfig(CONFIG_ARENA_1V1_ENABLE) == false)
  462. +        {
  463. +            ChatHandler(player->GetSession()).SendSysMessage("1v1 disabled!");
  464. +            return true;
  465. +        }
  466. +
  467. +        if(player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_5v5))
  468. +                player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_CHAT, "Leave queue 1v1 Arena", GOSSIP_SENDER_MAIN, 3, "Are you sure?", 0, false);
  469. +        else
  470. +            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Sign up 1v1 Arena (unrated)", GOSSIP_SENDER_MAIN, 20);
  471. +
  472. +        if(player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_5v5)) == 0)
  473. +            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_CHAT, "Create new 1v1 Arenateam", GOSSIP_SENDER_MAIN, 1, "Create 1v1 arenateam?", sWorld->getIntConfig(CONFIG_ARENA_1V1_COSTS), false);
  474. +        else
  475. +        {
  476. +            if(player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_5v5) == false)
  477. +            {
  478. +                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Sign up 1v1 Arena (rated)", GOSSIP_SENDER_MAIN, 2);
  479. +                player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_CHAT, "Disband arenateam", GOSSIP_SENDER_MAIN, 5, "Are you sure?", 0, false);
  480. +            }
  481. +
  482. +            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Show statistics", GOSSIP_SENDER_MAIN, 4);
  483. +        }
  484. +
  485. +        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Script Info", GOSSIP_SENDER_MAIN, 8);
  486. +        player->SEND_GOSSIP_MENU(68, me->GetGUID());
  487. +        return true;
  488. +    }
  489. +
  490. +
  491. +
  492. +    bool OnGossipSelect(Player* player, Creature* me, uint32 /*uiSender*/, uint32 uiAction)
  493. +    {
  494. +        if(!player || !me)
  495. +            return true;
  496. +
  497. +        player->PlayerTalkClass->ClearMenus();
  498. +
  499. +        switch (uiAction)
  500. +        {
  501. +        case 1: // Create new Arenateam
  502. +            {
  503. +                if(sWorld->getIntConfig(CONFIG_ARENA_1V1_MIN_LEVEL) <= player->getLevel())
  504. +                {
  505. +                    if(player->GetMoney() >= sWorld->getIntConfig(CONFIG_ARENA_1V1_COSTS) && CreateArenateam(player, me))
  506. +                        player->ModifyMoney(sWorld->getIntConfig(CONFIG_ARENA_1V1_COSTS) * -1);
  507. +                }
  508. +                else
  509. +                {
  510. +                    ChatHandler(player->GetSession()).PSendSysMessage("You need level %u+ to create an 1v1 arenateam.", sWorld->getIntConfig(CONFIG_ARENA_1V1_MIN_LEVEL));
  511. +                    player->CLOSE_GOSSIP_MENU();
  512. +                    return true;
  513. +                }
  514. +            }
  515. +            break;
  516. +
  517. +        case 2: // Join Queue Arena (rated)
  518. +            {
  519. +                if(Arena1v1CheckTalents(player) && JoinQueueArena(player, me, true) == false)
  520. +                    ChatHandler(player->GetSession()).SendSysMessage("Something went wrong while join queue.");
  521. +
  522. +                player->CLOSE_GOSSIP_MENU();
  523. +                return true;
  524. +            }
  525. +            break;
  526. +
  527. +        case 20: // Join Queue Arena (unrated)
  528. +            {
  529. +                if(Arena1v1CheckTalents(player) && JoinQueueArena(player, me, false) == false)
  530. +                    ChatHandler(player->GetSession()).SendSysMessage("Something went wrong while join queue.");
  531. +
  532. +                player->CLOSE_GOSSIP_MENU();
  533. +                return true;
  534. +            }
  535. +            break;
  536. +
  537. +        case 3: // Leave Queue
  538. +            {
  539. +                WorldPacket Data;
  540. +                Data << (uint8)0x1 << (uint8)0x0 << (uint32)BATTLEGROUND_AA << (uint16)0x0 << (uint8)0x0;
  541. +                player->GetSession()->HandleBattleFieldPortOpcode(Data);
  542. +                player->CLOSE_GOSSIP_MENU();
  543. +                return true;
  544. +            }
  545. +            break;
  546. +
  547. +        case 4: // get statistics
  548. +            {
  549. +                ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_5v5)));
  550. +                if(at)
  551. +                {
  552. +                    std::stringstream s;
  553. +                    s << "Rating: " << at->GetStats().Rating;
  554. +                    s << "\nRank: " << at->GetStats().Rank;
  555. +                    s << "\nSeason Games: " << at->GetStats().SeasonGames;
  556. +                    s << "\nSeason Wins: " << at->GetStats().SeasonWins;
  557. +                    s << "\nWeek Games: " << at->GetStats().WeekGames;
  558. +                    s << "\nWeek Wins: " << at->GetStats().WeekWins;
  559. +
  560. +                    ChatHandler(player->GetSession()).PSendSysMessage(s.str().c_str());
  561. +                }
  562. +            }
  563. +            break;
  564. +
  565. +
  566. +        case 5: // Disband arenateam
  567. +            {
  568. +                WorldPacket Data;
  569. +                Data << (uint32)player->GetArenaTeamId(ArenaTeam::GetSlotByType(ARENA_TEAM_5v5));
  570. +                player->GetSession()->HandleArenaTeamLeaveOpcode(Data);
  571. +                ChatHandler(player->GetSession()).SendSysMessage("Arenateam deleted!");
  572. +                player->CLOSE_GOSSIP_MENU();
  573. +                return true;
  574. +            }
  575. +            break;
  576. +
  577. +        case 8: // Script Info
  578. +            {
  579. +                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Developer: Teiby", GOSSIP_SENDER_MAIN, uiAction);
  580. +                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Website: www.teiby.de", GOSSIP_SENDER_MAIN, uiAction);
  581. +                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Version: 2.1", GOSSIP_SENDER_MAIN, uiAction);
  582. +                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "<-- Back", GOSSIP_SENDER_MAIN, 7);
  583. +                player->SEND_GOSSIP_MENU(68, me->GetGUID());
  584. +                return true;
  585. +            }
  586. +            break;
  587. +
  588. +        }
  589. +
  590. +        OnGossipHello(player, me);
  591. +        return true;
  592. +    }
  593. +};
  594. +
  595. +
  596. +void AddSC_npc_1v1arena()
  597. +{
  598. +    new npc_1v1arena();
  599. +}
  600. \ No newline at end of file
  601. diff --git a/src/server/scripts/Custom/npc_arena1v1.h b/src/server/scripts/Custom/npc_arena1v1.h
  602. new file mode 100644
  603. index 0000000..caa75a2
  604. --- /dev/null
  605. +++ b/src/server/scripts/Custom/npc_arena1v1.h
  606. @@ -0,0 +1,69 @@
  607. +/*
  608. + *
  609. + * Copyright (C) 2013 Emu-Devstore <http://emu-devstore.com/>
  610. + * Written by Teiby <http://www.teiby.de/>
  611. + *
  612. + */
  613. +
  614. +#ifndef ARENA_1V1_H
  615. +#define ARENA_1V1_H
  616. +
  617. +// TalentTab.dbc -> TalentTabID
  618. +const uint32 FORBIDDEN_TALENTS_IN_1V1_ARENA[] =
  619. +{
  620. +    // Healer
  621. +    201, // PriestDiscipline
  622. +    202, // PriestHoly
  623. +    382, // PaladinHoly
  624. +    262, // ShamanRestoration
  625. +    282, // DruidRestoration
  626. +
  627. +    // Tanks
  628. +    //383, // PaladinProtection
  629. +    //163, // WarriorProtection
  630. +
  631. +    0 // End
  632. +};
  633. +
  634. +
  635. +// Return false, if player have invested more than 35 talentpoints in a forbidden talenttree.
  636. +static bool Arena1v1CheckTalents(Player* player)
  637. +{
  638. +    if(!player)
  639. +        return false;
  640. +
  641. +    if(sWorld->getBoolConfig(CONFIG_ARENA_1V1_BLOCK_FORBIDDEN_TALENTS) == false)
  642. +        return true;
  643. +
  644. +    uint32 count = 0;
  645. +    for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
  646. +    {
  647. +        TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
  648. +
  649. +        if (!talentInfo)
  650. +            continue;
  651. +
  652. +        for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank)
  653. +        {
  654. +            if (talentInfo->RankID[rank] == 0)
  655. +                continue;
  656. +
  657. +            if (player->HasTalent(talentInfo->RankID[rank], player->GetActiveSpec()))
  658. +            {
  659. +                for(int8 i = 0; FORBIDDEN_TALENTS_IN_1V1_ARENA[i] != 0; i++)
  660. +                    if(FORBIDDEN_TALENTS_IN_1V1_ARENA[i] == talentInfo->TalentTab)
  661. +                        count += rank + 1;
  662. +            }
  663. +        }
  664. +    }
  665. +
  666. +    if(count >= 36)
  667. +    {
  668. +        ChatHandler(player->GetSession()).SendSysMessage("You can't join, because you have invested too many points in a forbidden talent. Please edit your talents.");
  669. +        return false;
  670. +    }
  671. +    else
  672. +        return true;
  673. +}
  674. +
  675. +#endif
  676. \ No newline at end of file
  677. diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
  678. index 4837a24..04cb5a8 100644
  679. --- a/src/server/worldserver/worldserver.conf.dist
  680. +++ b/src/server/worldserver/worldserver.conf.dist
  681. @@ -2541,6 +2541,71 @@ ArenaLog.ExtendedInfo = 0
  682.  
  683.  #
  684.  ###################################################################################################
  685. +# 1V1 ARENA CONFIG
  686. +#
  687. +#     Arena.1v1.Enable
  688. +#         Description: Enable the 1v1 arena.
  689. +#         Default:     0 - (Disabled)
  690. +#                      1 - (Enabled)
  691. +
  692. +Arena.1v1.Enable = 1
  693. +
  694. +#
  695. +#    Arena.1v1.Announcer
  696. +#        Description: Announce 1v1 arena queue status to chat.
  697. +#                      Arena.QueueAnnouncer.Enable must be enabled.
  698. +#        Default:     0 - (Disabled)
  699. +#                     1 - (Enabled)
  700. +
  701. +Arena.1v1.Announcer = 0
  702. +
  703. +#
  704. +#    Arena.1v1.MinLevel
  705. +#        Description: Min level to create an arena team
  706. +#        Default:     80
  707. +
  708. +Arena.1v1.MinLevel = 80
  709. +
  710. +#
  711. +#    Arena.1v1.Costs
  712. +#        Description: Costs for create an arena team
  713. +#        Default:     400000 - (40 gold)
  714. +
  715. +Arena.1v1.Costs = 400000
  716. +
  717. +#
  718. +#    Arena.1v1.VendorRating
  719. +#        Description: If true, 1v1 rating will use to calculate highest personal-rating (extended costs).
  720. +#                      Note: The vendor-item will show as not buyable (red), but players can buy it, if enabled and rating is high enough.
  721. +#        Default:     0 - (false)
  722. +#                      1 - (true)
  723. +
  724. +Arena.1v1.VendorRating = 0
  725. +
  726. +#
  727. +#    Arena.1v1.ArenaPointsMulti
  728. +#        Description: An 5v5 arena team with 1500 rating will gain 344 points per week (blizzlike).
  729. +#                      3v3 with same rating will gain 302 points (5v5points * 0.88)
  730. +#                      2v2 will gain 261 points (5v5points * 0.76)
  731. +#                      and 1v1 will gain 167 points (5v5points * 0.64)
  732. +#                      With this multiplier you can modify the arenapoints for 1v1.
  733. +#        Default:     0.64
  734. +
  735. +Arena.1v1.ArenaPointsMulti = 0.64
  736. +
  737. +#
  738. +#    Arena.1v1.BlockForbiddenTalents
  739. +#        Description: If true, healers can't join 1v1 arena, if they invested more than 35 talentpoints in a healing-talenttree.
  740. +#                      You can also block tanks and other talents, if you modify FORBIDDEN_TALENTS_IN_1V1_ARENA in the npc_arena1v1.h file (hardcoding). See TalentTab.dbc for available talents (you will need an DBC-Editor).
  741. +#        Default:     1 - (true)
  742. +#                      0 - (false)
  743. +
  744. +Arena.1v1.BlockForbiddenTalents = 1
  745. +
  746. +#
  747. +###################################################################################################
  748. +
  749. +###################################################################################################
  750.  
  751.  ###################################################################################################
  752.  # NETWORK CONFIG
  753. --
  754. 2.1.4
Advertisement
Add Comment
Please, Sign In to add comment