Advertisement
Rastrian

AzerothCore 1v1 Module Crystals patch

Sep 10th, 2020 (edited)
1,670
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 15.70 KB | None | 0 0
  1. From d6ccd22d973259b15c94dfb5d36cf6b04e21132c Mon Sep 17 00:00:00 2001
  2. From: Rastrian <[email protected]>
  3. Date: Thu, 10 Sep 2020 13:18:57 -0300
  4. Subject: [PATCH] Fix patch for 1v1 Arena
  5.  
  6. ---
  7. src/server/game/Battlegrounds/ArenaTeam.cpp    | 18 ++++++++++++++++++
  8.  src/server/game/Battlegrounds/ArenaTeam.h      |  7 +++++++
  9.  src/server/game/Battlegrounds/Battleground.cpp | 10 ++++++----
  10.  src/server/game/Battlegrounds/Battleground.h   |  5 +++++
  11.  .../game/Battlegrounds/BattlegroundMgr.cpp     | 16 ++++++++++++++++
  12.  .../Entities/Object/Updates/UpdateFields.h     | 15 +++++++++++++++
  13.  src/server/game/Entities/Player/Player.cpp     | 10 +++++++++-
  14.  .../game/Handlers/BattleGroundHandler.cpp      | 12 ++++++++++--
  15.  src/server/game/Miscellaneous/SharedDefines.h  |  3 +++
  16.  src/server/game/World/World.cpp                |  3 +++
  17.  src/server/game/World/World.h                  |  4 ++++
  18.  11 files changed, 96 insertions(+), 7 deletions(-)
  19.  
  20. diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp
  21. index 5fddb6ae..fd0ce4ef 100644
  22. --- a/src/server/game/Battlegrounds/ArenaTeam.cpp
  23. +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp
  24. @@ -81,7 +81,9 @@ bool ArenaTeam::AddMember(uint64 playerGuid)
  25.  
  26.      // Check if arena team is full (Can't have more than type * 2 players)
  27.      if (GetMembersSize() >= GetType() * 2)
  28. +    {
  29.          return false;
  30. +    }
  31.  
  32.      // xinef: Get player name and class from player storage or global data storage
  33.      Player* player = ObjectAccessor::FindPlayerInOrOutOfWorld(playerGuid);
  34. @@ -434,6 +436,15 @@ void ArenaTeam::Roster(WorldSession* session)
  35.  
  36.  void ArenaTeam::Query(WorldSession* session)
  37.  {
  38. +    #ifdef mod_1v1arena
  39. +        if (sConfigMgr->GetIntDefault("Arena.1v1.Mode", 5) == 1)
  40. +        {
  41. +            if (GetType() == 1)
  42. +            {
  43. +                return;
  44. +            }
  45. +        }
  46. +    #endif
  47.      WorldPacket data(SMSG_ARENA_TEAM_QUERY_RESPONSE, 4*7+GetName().size()+1);
  48.      data << uint32(GetId());                                // team id
  49.      data << GetName();                                      // team name
  50. @@ -585,6 +596,9 @@ uint8 ArenaTeam::GetSlotByType(uint32 type)
  51.          case ARENA_TEAM_2v2: return 0;
  52.          case ARENA_TEAM_3v3: return 1;
  53.          case ARENA_TEAM_5v5: return 2;
  54. +#ifdef mod_1v1arena
  55. +        case ARENA_TEAM_1v1: return 3;
  56. +#endif
  57.          default:
  58.              break;
  59.      }
  60. @@ -623,6 +637,10 @@ uint32 ArenaTeam::GetPoints(uint32 memberRating)
  61.          points *= 0.76f;
  62.      else if (Type == ARENA_TEAM_3v3)
  63.          points *= 0.88f;
  64. +#ifdef mod_1v1arena
  65. +    else if(Type == ARENA_TEAM_1v1)
  66. +        points *= sConfigMgr->GetFloatDefault("Arena.1v1.ArenaPointsMulti", 0.64f);
  67. +#endif
  68.  
  69.      points *= sWorld->getRate(RATE_ARENA_POINTS);
  70.  
  71. diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h
  72. index bf3dab21..5fa6a2ae 100644
  73. --- a/src/server/game/Battlegrounds/ArenaTeam.h
  74. +++ b/src/server/game/Battlegrounds/ArenaTeam.h
  75. @@ -68,6 +68,9 @@ ERR_ARENA_TEAM_LEVEL_TOO_LOW_I
  76.  
  77.  enum ArenaTeamTypes
  78.  {
  79. +#ifdef mod_1v1arena
  80. +    ARENA_TEAM_1v1      = 1,
  81. +#endif
  82.      ARENA_TEAM_2v2      = 2,
  83.      ARENA_TEAM_3v3      = 3,
  84.      ARENA_TEAM_5v5      = 5
  85. @@ -101,6 +104,10 @@ struct ArenaTeamStats
  86.  };
  87.  
  88.  #define MAX_ARENA_SLOT 3                                    // 0..2 slots
  89. +#ifdef mod_1v1arena
  90. +#undef MAX_ARENA_SLOT
  91. +#define MAX_ARENA_SLOT 4                                    // 0..3 slots
  92. +#endif
  93.  
  94.  class ArenaTeam
  95.  {
  96. diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
  97. index b9a95b94..b173869e 100644
  98. --- a/src/server/game/Battlegrounds/Battleground.cpp
  99. +++ b/src/server/game/Battlegrounds/Battleground.cpp
  100. @@ -33,6 +33,7 @@
  101.  #include "Transport.h"
  102.  #include "ScriptMgr.h"
  103.  #include "GameGraveyard.h"
  104. +#include <Config.h>
  105.  #ifdef ELUNA
  106.  #include "LuaEngine.h"
  107.  #endif
  108. @@ -1378,17 +1378,19 @@ void Battleground::SpectatorsSendPacket(WorldPacket& data)
  109.  
  110.  void Battleground::ReadyMarkerClicked(Player* p)
  111.  {
  112. -    if (!isArena() || GetStatus() >= STATUS_IN_PROGRESS || GetStartDelayTime() <= BG_START_DELAY_15S || (m_Events & BG_STARTING_EVENT_3) || p->IsSpectator())
  113. +    if (!isArena() || GetStatus() >= STATUS_IN_PROGRESS || GetStartDelayTime() <= BG_START_DELAY_5S || (m_Events & BG_STARTING_EVENT_3) || p->IsSpectator())
  114.          return;
  115.      readyMarkerClickedSet.insert(p->GetGUIDLow());
  116.      uint32 count = readyMarkerClickedSet.size();
  117.      uint32 req = GetArenaType()*2;
  118. -    p->GetSession()->SendNotification("You are marked as ready %u/%u", count, req);
  119. +    if ((sConfigMgr->GetIntDefault("Arena.1v1.Mode", 5) == 5) && (sConfigMgr->GetIntDefault("Arena1v1.Enable", 1) == 1) && (req == 10))
  120. +    {
  121. +        count = 2;
  122. +    }
  123.      if (count == req)
  124.      {
  125.          m_Events |= BG_STARTING_EVENT_2;
  126. -        m_StartTime += GetStartDelayTime()-BG_START_DELAY_15S;
  127. -        SetStartDelayTime(BG_START_DELAY_15S);
  128. +        m_StartTime += GetStartDelayTime()-BG_START_DELAY_5S;
  129. +        SetStartDelayTime(BG_START_DELAY_5S);
  130. +        p->GetSession()->SendNotification("The arena will start in 5 seconds.");
  131. +    } else {
  132. +        p->GetSession()->SendNotification("You are marked as ready %u/%u", count, req);
  133.      }
  134.  }
  135.  
  136. diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
  137. index 7a2fd35c..88c2d6a1 100644
  138. --- a/src/server/game/Battlegrounds/Battleground.h
  139. +++ b/src/server/game/Battlegrounds/Battleground.h
  140. @@ -143,6 +143,7 @@ enum BattlegroundStartTimeIntervals
  141.      BG_START_DELAY_1M               = 60000,                // ms (1 minute)
  142.      BG_START_DELAY_30S              = 30000,                // ms (30 seconds)
  143.      BG_START_DELAY_15S              = 15000,                // ms (15 seconds) Used only in arena
  144. +    BG_START_DELAY_5S               = 5000,                 // ms (5 seconds) Used only in arena
  145.      BG_START_DELAY_NONE             = 0,                    // ms
  146.  };
  147.  
  148. @@ -210,6 +211,10 @@ enum ScoreType
  149.  
  150.  enum ArenaType
  151.  {
  152. +#ifdef mod_1v1arena
  153. +    //Add special arena type for 1v1 so we dont need to disable 5v5
  154. +    ARENA_TYPE_1v1          = 1,
  155. +#endif
  156.      ARENA_TYPE_2v2          = 2,
  157.      ARENA_TYPE_3v3          = 3,
  158.      ARENA_TYPE_5v5          = 5
  159. diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
  160. index 6dbf016f..f7aa26dc 100644
  161. --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
  162. +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
  163. @@ -470,6 +470,11 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId original
  164.          uint32 maxPlayersPerTeam = 0;
  165.          switch (arenaType)
  166.          {
  167. +#ifdef mod_1v1arena
  168. +            case ARENA_TYPE_1v1:
  169. +                maxPlayersPerTeam = 1;
  170. +                break;
  171. +#endif
  172.              case ARENA_TYPE_2v2:
  173.                  maxPlayersPerTeam = 2;
  174.                  break;
  175. @@ -755,6 +760,10 @@ BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(BattlegroundTypeId bgType
  176.                  return BATTLEGROUND_QUEUE_3v3;
  177.              case ARENA_TYPE_5v5:
  178.                  return BATTLEGROUND_QUEUE_5v5;
  179. +#ifdef mod_1v1arena
  180. +            case ARENA_TYPE_1v1:
  181. +                return BATTLEGROUND_QUEUE_1v1;
  182. +#endif
  183.              default:
  184.                  return BATTLEGROUND_QUEUE_NONE;
  185.          }
  186. @@ -786,6 +795,10 @@ uint8 BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId bgQueueTypeId)
  187.              return ARENA_TYPE_3v3;
  188.          case BATTLEGROUND_QUEUE_5v5:
  189.              return ARENA_TYPE_5v5;
  190. +#ifdef mod_1v1arena
  191. +        case BATTLEGROUND_QUEUE_1v1:
  192. +            return ARENA_TYPE_1v1;
  193. +#endif
  194.          default:
  195.              return 0;
  196.      }
  197. @@ -1080,6 +1093,9 @@ std::unordered_map<int, BattlegroundTypeId> BattlegroundMgr::queueToBg = {
  198.      { BATTLEGROUND_QUEUE_2v2,   BATTLEGROUND_AA },
  199.      { BATTLEGROUND_QUEUE_3v3,   BATTLEGROUND_AA },
  200.      { BATTLEGROUND_QUEUE_5v5,   BATTLEGROUND_AA },
  201. +#ifdef mod_1v1arena
  202. +    { BATTLEGROUND_QUEUE_1v1,   BATTLEGROUND_AA },
  203. +#endif
  204.  };
  205.  
  206.  std::unordered_map<int, Battleground*> BattlegroundMgr::bgtypeToBattleground = {
  207. diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
  208. index 667423bd..93a552a0 100644
  209. --- a/src/server/game/Entities/Object/Updates/UpdateFields.h
  210. +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
  211. @@ -367,6 +367,20 @@ enum EUnitFields
  212.      PLAYER_FIELD_BYTES2                       = UNIT_END + 0x0439, // Size: 1, Type: 6, Flags: PRIVATE
  213.      PLAYER_FIELD_WATCHED_FACTION_INDEX        = UNIT_END + 0x043A, // Size: 1, Type: INT, Flags: PRIVATE
  214.      PLAYER_FIELD_COMBAT_RATING_1              = UNIT_END + 0x043B, // Size: 25, Type: INT, Flags: PRIVATE
  215. +#ifdef mod_1v1arena
  216. +    PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0454, // Size: 28, Type: INT, Flags: PRIVATE
  217. +    PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x0470, // Size: 1, Type: INT, Flags: PRIVATE
  218. +    PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x0471, // Size: 1, Type: INT, Flags: PRIVATE
  219. +    PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x0472, // Size: 1, Type: INT, Flags: PRIVATE
  220. +    PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x0473, // Size: 25, Type: INT, Flags: PRIVATE
  221. +    PLAYER_RUNE_REGEN_1 = UNIT_END + 0x048C, // Size: 4, Type: FLOAT, Flags: PRIVATE
  222. +    PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x0490, // Size: 3, Type: INT, Flags: PRIVATE
  223. +    PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x0493, // Size: 6, Type: INT, Flags: PRIVATE
  224. +    PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0499, // Size: 6, Type: INT, Flags: PRIVATE
  225. +    PLAYER_GLYPHS_ENABLED = UNIT_END + 0x049F, // Size: 1, Type: INT, Flags: PRIVATE
  226. +    PLAYER_PET_SPELL_POWER = UNIT_END + 0x04A0, // Size: 1, Type: INT, Flags: PRIVATE
  227. +    PLAYER_END = UNIT_END + 0x04A1,
  228. +#else
  229.      PLAYER_FIELD_ARENA_TEAM_INFO_1_1          = UNIT_END + 0x0454, // Size: 21, Type: INT, Flags: PRIVATE
  230.      PLAYER_FIELD_HONOR_CURRENCY               = UNIT_END + 0x0469, // Size: 1, Type: INT, Flags: PRIVATE
  231.      PLAYER_FIELD_ARENA_CURRENCY               = UNIT_END + 0x046A, // Size: 1, Type: INT, Flags: PRIVATE
  232. @@ -379,6 +393,7 @@ enum EUnitFields
  233.      PLAYER_GLYPHS_ENABLED                     = UNIT_END + 0x0498, // Size: 1, Type: INT, Flags: PRIVATE
  234.      PLAYER_PET_SPELL_POWER                    = UNIT_END + 0x0499, // Size: 1, Type: INT, Flags: PRIVATE
  235.      PLAYER_END                                = UNIT_END + 0x049A,
  236. +#endif
  237.  };
  238.  
  239.  enum EGameObjectFields
  240. diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
  241. index 7395e9e2..f69bd25c 100644
  242. --- a/src/server/game/Entities/Player/Player.cpp
  243. +++ b/src/server/game/Entities/Player/Player.cpp
  244. @@ -17602,7 +17602,7 @@ void Player::_LoadArenaTeamInfo()
  245.  {
  246.      memset((void*)&m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1], 0, sizeof(uint32) * MAX_ARENA_SLOT * ARENA_TEAM_END);
  247.  
  248. -    for (uint8 slot = 0; slot <= 2; ++slot)
  249. +    for (uint8 slot = 0; slot < MAX_ARENA_SLOT; ++slot)
  250.          if (uint32 arenaTeamId = Player::GetArenaTeamIdFromStorage(GetGUIDLow(), slot))
  251.          {
  252.              ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
  253. @@ -22224,6 +22224,10 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32
  254.      return crItem->maxcount != 0;
  255.  }
  256.  
  257. +#ifdef mod_1v1arena
  258. +#include <Config.h>
  259. +#endif
  260. +
  261.  uint32 Player::GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
  262.  {
  263.      // returns the maximal personal arena rating that can be used to purchase items requiring this condition
  264. @@ -22232,6 +22236,10 @@ uint32 Player::GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
  265.      uint32 max_personal_rating = 0;
  266.      for (uint8 i = minarenaslot; i < MAX_ARENA_SLOT; ++i)
  267.      {
  268. +#ifdef mod_1v1arena
  269. +        if (i == ArenaTeam::GetSlotByType(ARENA_TYPE_1v1) && sConfigMgr->GetBoolDefault("Arena.1v1.VendorRating", false) == false) continue;
  270. +#endif
  271. +
  272.          if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamId(i)))
  273.          {
  274.              uint32 p_rating = GetArenaPersonalRating(i);
  275. diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
  276. index 949f88c9..22756e99 100644
  277. --- a/src/server/game/Handlers/BattleGroundHandler.cpp
  278. +++ b/src/server/game/Handlers/BattleGroundHandler.cpp
  279. @@ -156,7 +156,11 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recvData)
  280.              err = ERR_IN_NON_RANDOM_BG;
  281.          else if (_player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_2v2) ||
  282.                   _player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_3v3) ||
  283. -                 _player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_5v5)) // can't be already queued for arenas
  284. +                 _player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_5v5)
  285. +#ifdef mod_1v1arena
  286. +            || _player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_1v1)
  287. +#endif
  288. +            ) // can't be already queued for arenas
  289.              err = ERR_BATTLEGROUND_QUEUED_FOR_RATED;
  290.          // don't let Death Knights join BG queues when they are not allowed to be teleported yet
  291.          else if (_player->getClass() == CLASS_DEATH_KNIGHT && _player->GetMapId() == 609 && !_player->IsGameMaster() && !_player->HasSpell(50977))
  292. @@ -222,7 +226,11 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recvData)
  293.              err = ERR_IN_NON_RANDOM_BG;
  294.          else if (_player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_2v2) ||
  295.                   _player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_3v3) ||
  296. -                 _player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_5v5)) // can't be already queued for arenas
  297. +                 _player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_5v5)
  298. +#ifdef mod_1v1arena
  299. +                || _player->InBattlegroundQueueForBattlegroundQueueType(BATTLEGROUND_QUEUE_1v1)
  300. +#endif
  301. +                ) // can't be already queued for arenas
  302.              err = ERR_BATTLEGROUND_QUEUED_FOR_RATED;
  303.  
  304.          if (err > 0)
  305. diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
  306. index 123e4844..96c9ee94 100644
  307. --- a/src/server/game/Miscellaneous/SharedDefines.h
  308. +++ b/src/server/game/Miscellaneous/SharedDefines.h
  309. @@ -3431,6 +3431,9 @@ enum BattlegroundQueueTypeId
  310.      BATTLEGROUND_QUEUE_2v2       = 8,
  311.      BATTLEGROUND_QUEUE_3v3       = 9,
  312.      BATTLEGROUND_QUEUE_5v5       = 10,
  313. +#ifdef mod_1v1arena
  314. +    BATTLEGROUND_QUEUE_1v1       = 11,
  315. +#endif
  316.      MAX_BATTLEGROUND_QUEUE_TYPES = 20,
  317.  };
  318.  
  319. diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
  320. index 1ed8956f..f159321a 100644
  321. --- a/src/server/game/World/World.cpp
  322. +++ b/src/server/game/World/World.cpp
  323. @@ -3232,6 +3232,9 @@ void World::AddGlobalPlayerData(uint32 guid, uint32 accountId, std::string const
  324.      data.arenaTeamId[0] = 0;
  325.      data.arenaTeamId[1] = 0;
  326.      data.arenaTeamId[2] = 0;
  327. +#ifdef mod_1v1arena
  328. +    data.arenaTeamId[3] = 0;
  329. +#endif
  330.  
  331.      _globalPlayerDataStore[guid] = data;
  332.      _globalPlayerNameStore[name] = guid;
  333. diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
  334. index e8a09cd5..ae7b9d1a 100644
  335. --- a/src/server/game/World/World.h
  336. +++ b/src/server/game/World/World.h
  337. @@ -581,7 +581,11 @@ struct GlobalPlayerData
  338.      uint16 mailCount;
  339.      uint32 guildId;
  340.      uint32 groupId;
  341. +#ifdef mod_1v1arena
  342. +    uint32 arenaTeamId[4];
  343. +#else
  344.      uint32 arenaTeamId[3];
  345. +#endif
  346.  };
  347.  
  348.  enum GlobalPlayerUpdateMask
  349. --
  350. 2.27.0.windows.1
  351.  
  352.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement