Core/Battleground: Rework BattlegroundScore

Port From (https://github.com/TrinityCore/TrinityCore/commit/da0ec4f830c4428a17fd4e52124dca6c63e25961)
This commit is contained in:
hondacrx
2024-02-04 00:27:52 -05:00
parent 3c2bb6829c
commit 90ad7ed6ea
13 changed files with 184 additions and 369 deletions
@@ -332,25 +332,6 @@ namespace Framework.Constants
BonusHonor = 4, BonusHonor = 4,
DamageDone = 5, DamageDone = 5,
HealingDone = 6, HealingDone = 6,
// Ws And Ey
FlagCaptures = 7,
FlagReturns = 8,
// Ab And Ic
BasesAssaulted = 9,
BasesDefended = 10,
// Av
GraveyardsAssaulted = 11,
GraveyardsDefended = 12,
TowersAssaulted = 13,
TowersDefended = 14,
MinesCaptured = 15,
// Sota
DestroyedDemolisher = 16,
DestroyedWall = 17
} }
//Arenas //Arenas
@@ -1028,6 +1028,10 @@ namespace Framework.Database
// PvpItem.db2 // PvpItem.db2
PrepareStatement(HotfixStatements.SEL_PVP_ITEM, "SELECT ID, ItemID, ItemLevelDelta FROM pvp_item WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_PVP_ITEM, "SELECT ID, ItemID, ItemLevelDelta FROM pvp_item WHERE (`VerifiedBuild` > 0) = ?");
// PvpStat.db2
PrepareStatement(HotfixStatements.SEL_PVP_STAT, "SELECT Description, ID, MapID FROM pvp_stat WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_PVP_STAT_LOCALE, "SELECT ID, Description_lang FROM pvp_stat_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// PvpSeason.db2 // PvpSeason.db2
PrepareStatement(HotfixStatements.SEL_PVP_SEASON, "SELECT ID, MilestoneSeason, AllianceAchievementID, HordeAchievementID FROM pvp_season" + PrepareStatement(HotfixStatements.SEL_PVP_SEASON, "SELECT ID, MilestoneSeason, AllianceAchievementID, HordeAchievementID FROM pvp_season" +
" WHERE (`VerifiedBuild` > 0) = ?"); " WHERE (`VerifiedBuild` > 0) = ?");
@@ -2070,6 +2074,9 @@ namespace Framework.Database
SEL_PVP_ITEM, SEL_PVP_ITEM,
SEL_PVP_STAT,
SEL_PVP_STAT_LOCALE,
SEL_PVP_SEASON, SEL_PVP_SEASON,
SEL_PVP_TALENT, SEL_PVP_TALENT,
-3
View File
@@ -31,10 +31,7 @@ namespace Game.Arenas
public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId) public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{ {
bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player, queueId); base.AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player.GetGUID()] = new ArenaScore(player.GetGUID(), player.GetBGTeam());
if (player.GetBGTeam() == Team.Alliance) // gold if (player.GetBGTeam() == Team.Alliance) // gold
{ {
-42
View File
@@ -1,50 +1,8 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved. // Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. // Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
using Framework.Constants;
using Game.BattleGrounds;
using Game.Entities;
using Game.Networking.Packets;
namespace Game.Arenas namespace Game.Arenas
{ {
class ArenaScore : BattlegroundScore
{
public ArenaScore(ObjectGuid playerGuid, Team team) : base(playerGuid, team)
{
TeamId = (int)(team == Team.Alliance ? PvPTeamId.Alliance : PvPTeamId.Horde);
}
public override void BuildPvPLogPlayerDataPacket(out PVPMatchStatistics.PVPMatchPlayerStatistics playerData)
{
base.BuildPvPLogPlayerDataPacket(out playerData);
if (PreMatchRating != 0)
playerData.PreMatchRating = PreMatchRating;
if (PostMatchRating != PreMatchRating)
playerData.RatingChange = (int)(PostMatchRating - PreMatchRating);
if (PreMatchMMR != 0)
playerData.PreMatchMMR = PreMatchMMR;
if (PostMatchMMR != PreMatchMMR)
playerData.MmrChange = (int)(PostMatchMMR - PreMatchMMR);
}
// For Logging purpose
public override string ToString()
{
return $"Damage done: {DamageDone} Healing done: {HealingDone} Killing blows: {KillingBlows} PreMatchRating: {PreMatchRating} " +
$"PreMatchMMR: {PreMatchMMR} PostMatchRating: {PostMatchRating} PostMatchMMR: {PostMatchMMR}";
}
uint PreMatchRating;
uint PreMatchMMR;
uint PostMatchRating;
uint PostMatchMMR;
}
public class ArenaTeamScore public class ArenaTeamScore
{ {
public void Assign(uint preMatchRating, uint postMatchRating, uint preMatchMMR, uint postMatchMMR) public void Assign(uint preMatchRating, uint postMatchRating, uint preMatchMMR, uint postMatchMMR)
+45 -22
View File
@@ -148,7 +148,7 @@ namespace Game.BattleGrounds
if (m_ValidStartPositionTimer >= BattlegroundConst.CheckPlayerPositionInverval) if (m_ValidStartPositionTimer >= BattlegroundConst.CheckPlayerPositionInverval)
{ {
m_ValidStartPositionTimer = 0; m_ValidStartPositionTimer = 0;
foreach (var guid in GetPlayers().Keys) foreach (var guid in GetPlayers().Keys)
{ {
Player player = Global.ObjAccessor.FindPlayer(guid); Player player = Global.ObjAccessor.FindPlayer(guid);
@@ -177,7 +177,7 @@ namespace Game.BattleGrounds
m_LastPlayerPositionBroadcast = 0; m_LastPlayerPositionBroadcast = 0;
BattlegroundPlayerPositions playerPositions = new(); BattlegroundPlayerPositions playerPositions = new();
for (var i =0; i < _playerPositions.Count; ++i) for (var i = 0; i < _playerPositions.Count; ++i)
{ {
var playerPosition = _playerPositions[i]; var playerPosition = _playerPositions[i];
// Update position data if we found player. // Update position data if we found player.
@@ -477,7 +477,7 @@ namespace Game.BattleGrounds
{ {
return _battlegroundTemplate.MaxStartDistSq; return _battlegroundTemplate.MaxStartDistSq;
} }
public void SendPacketToAll(ServerPacket packet) public void SendPacketToAll(ServerPacket packet)
{ {
foreach (var pair in m_Players) foreach (var pair in m_Players)
@@ -690,11 +690,11 @@ namespace Game.BattleGrounds
stmt.AddValue(6, score.BonusHonor); stmt.AddValue(6, score.BonusHonor);
stmt.AddValue(7, score.DamageDone); stmt.AddValue(7, score.DamageDone);
stmt.AddValue(8, score.HealingDone); stmt.AddValue(8, score.HealingDone);
stmt.AddValue(9, score.GetAttr1()); stmt.AddValue(9, score.GetAttr(1));
stmt.AddValue(10, score.GetAttr2()); stmt.AddValue(10, score.GetAttr(2));
stmt.AddValue(11, score.GetAttr3()); stmt.AddValue(11, score.GetAttr(3));
stmt.AddValue(12, score.GetAttr4()); stmt.AddValue(12, score.GetAttr(4));
stmt.AddValue(13, score.GetAttr5()); stmt.AddValue(13, score.GetAttr(5));
DB.Characters.Execute(stmt); DB.Characters.Execute(stmt);
} }
@@ -760,7 +760,7 @@ namespace Game.BattleGrounds
{ {
return _battlegroundTemplate.ScriptId; return _battlegroundTemplate.ScriptId;
} }
public uint GetBonusHonorFromKill(uint kills) public uint GetBonusHonorFromKill(uint kills)
{ {
//variable kills means how many honorable kills you scored (so we need kills * honor_for_one_kill) //variable kills means how many honorable kills you scored (so we need kills * honor_for_one_kill)
@@ -795,7 +795,7 @@ namespace Game.BattleGrounds
Player player = Global.ObjAccessor.FindPlayer(guid); Player player = Global.ObjAccessor.FindPlayer(guid);
if (player != null) if (player != null)
{ {
// should remove spirit of redemption // should remove spirit of redemption
if (player.HasAuraType(AuraType.SpiritOfRedemption)) if (player.HasAuraType(AuraType.SpiritOfRedemption))
player.RemoveAurasByType(AuraType.ModShapeshift); player.RemoveAurasByType(AuraType.ModShapeshift);
@@ -955,7 +955,10 @@ namespace Game.BattleGrounds
m_Players[guid] = bp; m_Players[guid] = bp;
if (!isInBattleground) if (!isInBattleground)
{
UpdatePlayersCountByTeam(team, false); // +1 player UpdatePlayersCountByTeam(team, false); // +1 player
PlayerScores[player.GetGUID()] = new BattlegroundScore(player.GetGUID(), player.GetBGTeam(), _pvpStatIds);
}
BattlegroundPlayerJoined playerJoined = new(); BattlegroundPlayerJoined playerJoined = new();
playerJoined.Guid = player.GetGUID(); playerJoined.Guid = player.GetGUID();
@@ -1219,7 +1222,7 @@ namespace Game.BattleGrounds
{ {
return !IsArena(); return !IsArena();
} }
public bool HasFreeSlots() public bool HasFreeSlots()
{ {
return GetPlayersSize() < GetMaxPlayers(); return GetPlayersSize() < GetMaxPlayers();
@@ -1231,28 +1234,31 @@ namespace Game.BattleGrounds
foreach (var score in PlayerScores) foreach (var score in PlayerScores)
{ {
PVPMatchStatistics.PVPMatchPlayerStatistics playerData; Player player = Global.ObjAccessor.GetPlayer(GetBgMap(), score.Key);
score.Value.BuildPvPLogPlayerDataPacket(out playerData);
Player player = Global.ObjAccessor.GetPlayer(GetBgMap(), playerData.PlayerGUID);
if (player != null) if (player != null)
{ {
score.Value.BuildPvPLogPlayerDataPacket(out PVPMatchStatistics.PVPMatchPlayerStatistics playerData);
playerData.IsInWorld = true; playerData.IsInWorld = true;
playerData.PrimaryTalentTree = (int)player.GetPrimarySpecialization(); playerData.PrimaryTalentTree = (int)player.GetPrimarySpecialization();
playerData.Sex = (sbyte)player.GetGender(); playerData.Sex = (sbyte)player.GetGender();
playerData.PlayerRace = player.GetRace(); playerData.PlayerRace = player.GetRace();
playerData.PlayerClass = (int)player.GetClass(); playerData.PlayerClass = (int)player.GetClass();
playerData.HonorLevel = (int)player.GetHonorLevel(); playerData.HonorLevel = (int)player.GetHonorLevel();
}
pvpLogData.Statistics.Add(playerData); pvpLogData.Statistics.Add(playerData);
}
} }
pvpLogData.PlayerCount[(int)PvPTeamId.Horde] = (sbyte)GetPlayersCountByTeam(Team.Horde); pvpLogData.PlayerCount[(int)PvPTeamId.Horde] = (sbyte)GetPlayersCountByTeam(Team.Horde);
pvpLogData.PlayerCount[(int)PvPTeamId.Alliance] = (sbyte)GetPlayersCountByTeam(Team.Alliance); pvpLogData.PlayerCount[(int)PvPTeamId.Alliance] = (sbyte)GetPlayersCountByTeam(Team.Alliance);
} }
public BattlegroundScore GetBattlegroundScore(Player player)
{
return PlayerScores.LookupByKey(player.GetGUID());
}
public virtual bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true) public virtual bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true)
{ {
var bgScore = PlayerScores.LookupByKey(player.GetGUID()); var bgScore = PlayerScores.LookupByKey(player.GetGUID());
@@ -1267,6 +1273,13 @@ namespace Game.BattleGrounds
return true; return true;
} }
public void UpdatePvpStat(Player player, uint pvpStatId, uint value)
{
BattlegroundScore score = PlayerScores.LookupByKey(player.GetGUID());
if (score != null)
score.UpdatePvpStat(pvpStatId, value);
}
public bool AddObject(int type, uint entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, uint respawnTime = 0, GameObjectState goState = GameObjectState.Ready) public bool AddObject(int type, uint entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, uint respawnTime = 0, GameObjectState goState = GameObjectState.Ready)
{ {
Map map = FindBgMap(); Map map = FindBgMap();
@@ -1365,6 +1378,15 @@ namespace Game.BattleGrounds
return (uint)_battlegroundTemplate.BattlemasterEntry.MapId[0]; return (uint)_battlegroundTemplate.BattlemasterEntry.MapId[0];
} }
public void SetBgMap(BattlegroundMap map)
{
m_Map = map;
if (map != null)
_pvpStatIds = Global.DB2Mgr.GetPVPStatIDsForMap(map.GetId());
else
_pvpStatIds = null;
}
public void SpawnBGObject(int type, uint respawntime) public void SpawnBGObject(int type, uint respawntime)
{ {
Map map = FindBgMap(); Map map = FindBgMap();
@@ -1548,7 +1570,7 @@ namespace Game.BattleGrounds
{ {
_playerPositions.RemoveAll(playerPosition => playerPosition.Guid == guid); _playerPositions.RemoveAll(playerPosition => playerPosition.Guid == guid);
} }
void EndNow() void EndNow()
{ {
RemoveFromBGFreeSlotQueue(); RemoveFromBGFreeSlotQueue();
@@ -1630,7 +1652,7 @@ namespace Game.BattleGrounds
return false; return false;
} }
void PlayerAddedToBGCheckIfBGIsRunning(Player player) void PlayerAddedToBGCheckIfBGIsRunning(Player player)
{ {
if (GetStatus() != BattlegroundStatus.WaitLeave) if (GetStatus() != BattlegroundStatus.WaitLeave)
@@ -1800,7 +1822,7 @@ namespace Game.BattleGrounds
{ {
return m_Players.LookupByKey(playerGuid); return m_Players.LookupByKey(playerGuid);
} }
public virtual void StartingEventCloseDoors() { } public virtual void StartingEventCloseDoors() { }
public virtual void StartingEventOpenDoors() { } public virtual void StartingEventOpenDoors() { }
@@ -1825,6 +1847,7 @@ namespace Game.BattleGrounds
public void SetRated(bool state) { m_IsRated = state; } public void SetRated(bool state) { m_IsRated = state; }
public void SetArenaType(ArenaTypes type) { m_ArenaType = type; } public void SetArenaType(ArenaTypes type) { m_ArenaType = type; }
public void SetWinner(PvPTeamId winnerTeamId) { _winnerTeamId = winnerTeamId; } public void SetWinner(PvPTeamId winnerTeamId) { _winnerTeamId = winnerTeamId; }
public List<uint> GetPvpStatIds() { return _pvpStatIds; }
void ModifyStartDelayTime(int diff) { m_StartDelayTime -= diff; } void ModifyStartDelayTime(int diff) { m_StartDelayTime -= diff; }
void SetStartDelayTime(BattlegroundStartTimeIntervals Time) { m_StartDelayTime = (int)Time; } void SetStartDelayTime(BattlegroundStartTimeIntervals Time) { m_StartDelayTime = (int)Time; }
@@ -1852,7 +1875,6 @@ namespace Game.BattleGrounds
uint GetPlayersSize() { return (uint)m_Players.Count; } uint GetPlayersSize() { return (uint)m_Players.Count; }
uint GetPlayerScoresSize() { return (uint)PlayerScores.Count; } uint GetPlayerScoresSize() { return (uint)PlayerScores.Count; }
public void SetBgMap(BattlegroundMap map) { m_Map = map; }
BattlegroundMap FindBgMap() { return m_Map; } BattlegroundMap FindBgMap() { return m_Map; }
Group GetBgRaid(Team team) { return m_BgRaids[GetTeamIndexByTeamId(team)]; } Group GetBgRaid(Team team) { return m_BgRaids[GetTeamIndexByTeamId(team)]; }
@@ -1979,6 +2001,7 @@ namespace Game.BattleGrounds
BattlegroundTemplate _battlegroundTemplate; BattlegroundTemplate _battlegroundTemplate;
PvpDifficultyRecord _pvpDifficultyEntry; PvpDifficultyRecord _pvpDifficultyEntry;
List<uint> _pvpStatIds = new();
List<BattlegroundPlayerPosition> _playerPositions = new(); List<BattlegroundPlayerPosition> _playerPositions = new();
#endregion #endregion
+76 -18
View File
@@ -4,15 +4,41 @@
using Framework.Constants; using Framework.Constants;
using Game.Entities; using Game.Entities;
using Game.Networking.Packets; using Game.Networking.Packets;
using System.Collections.Generic;
namespace Game.BattleGrounds namespace Game.BattleGrounds
{ {
public class BattlegroundScore public class BattlegroundScore
{ {
public BattlegroundScore(ObjectGuid playerGuid, Team team) public ObjectGuid PlayerGuid;
public byte TeamId; // PvPTeamId
// Default score, present in every type
public uint KillingBlows;
public uint Deaths;
public uint HonorableKills;
public uint BonusHonor;
public uint DamageDone;
public uint HealingDone;
public uint PreMatchRating;
public uint PreMatchMMR;
public uint PostMatchRating;
public uint PostMatchMMR;
public Dictionary<uint /*pvpStatID*/, uint /*value*/> PvpStats = new();
List<uint> _validPvpStatIds;
public BattlegroundScore(ObjectGuid playerGuid, Team team, List<uint> pvpStatIds)
{ {
PlayerGuid = playerGuid; PlayerGuid = playerGuid;
TeamId = (int)(team == Team.Alliance ? PvPTeamId.Alliance : PvPTeamId.Horde); TeamId = (byte)(team == Team.Alliance ? PvPTeamId.Alliance : PvPTeamId.Horde);
_validPvpStatIds = pvpStatIds;
if (_validPvpStatIds != null)
foreach (uint pvpStatId in _validPvpStatIds)
PvpStats[pvpStatId] = 0;
} }
public virtual void UpdateScore(ScoreType type, uint value) public virtual void UpdateScore(ScoreType type, uint value)
@@ -43,12 +69,34 @@ namespace Game.BattleGrounds
} }
} }
public void UpdatePvpStat(uint pvpStatID, uint value)
{
if (_validPvpStatIds == null)
return;
if (!_validPvpStatIds.Contains(pvpStatID))
{
Log.outWarn(LogFilter.Battleground, $"Tried updating PvpStat {pvpStatID} but this stat is not allowed on this map");
return;
}
PvpStats[pvpStatID] += value;
Player player = Global.ObjAccessor.FindConnectedPlayer(PlayerGuid);
if (player != null)
player.UpdateCriteria(CriteriaType.TrackedWorldStateUIModified, pvpStatID);
}
public uint GetAttr(byte index)
{
return PvpStats.LookupByKey(index);
}
public virtual void BuildPvPLogPlayerDataPacket(out PVPMatchStatistics.PVPMatchPlayerStatistics playerData) public virtual void BuildPvPLogPlayerDataPacket(out PVPMatchStatistics.PVPMatchPlayerStatistics playerData)
{ {
playerData = new PVPMatchStatistics.PVPMatchPlayerStatistics(); playerData = new PVPMatchStatistics.PVPMatchPlayerStatistics();
playerData.PlayerGUID = PlayerGuid; playerData.PlayerGUID = PlayerGuid;
playerData.Kills = KillingBlows; playerData.Kills = KillingBlows;
playerData.Faction = (byte)TeamId; playerData.Faction = TeamId;
if (HonorableKills != 0 || Deaths != 0 || BonusHonor != 0) if (HonorableKills != 0 || Deaths != 0 || BonusHonor != 0)
{ {
PVPMatchStatistics.HonorData playerDataHonor = new(); PVPMatchStatistics.HonorData playerDataHonor = new();
@@ -60,23 +108,33 @@ namespace Game.BattleGrounds
playerData.DamageDone = DamageDone; playerData.DamageDone = DamageDone;
playerData.HealingDone = HealingDone; playerData.HealingDone = HealingDone;
if (PreMatchRating != 0)
playerData.PreMatchRating = PreMatchRating;
if (PostMatchRating != PreMatchRating)
playerData.RatingChange = (int)(PostMatchRating - PreMatchRating);
if (PreMatchMMR != 0)
playerData.PreMatchMMR = PreMatchMMR;
if (PostMatchMMR != PreMatchMMR)
playerData.MmrChange = (int)(PostMatchMMR - PreMatchMMR);
foreach (var (pvpStatID, value) in PvpStats)
playerData.Stats.Add(new PVPMatchStatistics.PVPMatchPlayerPVPStat((int)pvpStatID, value));
} }
public virtual uint GetAttr1() { return 0; } public override string ToString()
public virtual uint GetAttr2() { return 0; } {
public virtual uint GetAttr3() { return 0; } return $"Damage done: {DamageDone}, Healing done: {HealingDone}, Killing blows: {KillingBlows}, PreMatchRating: {PreMatchRating}, PreMatchMMR: {PreMatchMMR}, PostMatchRating: {PostMatchRating}, PostMatchMMR: {PostMatchMMR}";
public virtual uint GetAttr4() { return 0; } }
public virtual uint GetAttr5() { return 0; }
public ObjectGuid PlayerGuid; public uint GetKillingBlows() { return KillingBlows; }
public int TeamId; public uint GetDeaths() { return Deaths; }
public uint GetHonorableKills() { return HonorableKills; }
// Default score, present in every type public uint GetBonusHonor() { return BonusHonor; }
public uint KillingBlows; public uint GetDamageDone() { return DamageDone; }
public uint Deaths; public uint GetHealingDone() { return HealingDone; }
public uint HonorableKills;
public uint BonusHonor;
public uint DamageDone;
public uint HealingDone;
} }
} }
+10 -74
View File
@@ -208,18 +208,6 @@ namespace Game.BattleGrounds.Zones
TriggerGameEvent(EventStartBattle); TriggerGameEvent(EventStartBattle);
} }
public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{
bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player.GetGUID()] = new BattlegroundABScore(player.GetGUID(), player.GetBGTeam());
}
public override void RemovePlayer(Player Player, ObjectGuid guid, Team team)
{
}
public override void HandleAreaTrigger(Player player, uint trigger, bool entered) public override void HandleAreaTrigger(Player player, uint trigger, bool entered)
{ {
switch (trigger) switch (trigger)
@@ -412,7 +400,7 @@ namespace Game.BattleGrounds.Zones
// If node is neutral, change to contested // If node is neutral, change to contested
if (m_Nodes[node] == ABNodeStatus.Neutral) if (m_Nodes[node] == ABNodeStatus.Neutral)
{ {
UpdatePlayerScore(source, ScoreType.BasesAssaulted, 1); UpdatePvpStat(source, (uint)ArathiBasinPvpStats.BasesAssaulted, 1);
m_prevNodes[node] = m_Nodes[node]; m_prevNodes[node] = m_Nodes[node];
m_Nodes[node] = (ABNodeStatus)(teamIndex + 1); m_Nodes[node] = (ABNodeStatus)(teamIndex + 1);
// burn current neutral banner // burn current neutral banner
@@ -436,7 +424,7 @@ namespace Game.BattleGrounds.Zones
// If last state is NOT occupied, change node to enemy-contested // If last state is NOT occupied, change node to enemy-contested
if (m_prevNodes[node] < ABNodeStatus.Occupied) if (m_prevNodes[node] < ABNodeStatus.Occupied)
{ {
UpdatePlayerScore(source, ScoreType.BasesAssaulted, 1); UpdatePvpStat(source, (uint)ArathiBasinPvpStats.BasesAssaulted, 1);
m_prevNodes[node] = m_Nodes[node]; m_prevNodes[node] = m_Nodes[node];
m_Nodes[node] = (ABNodeStatus.Contested + teamIndex); m_Nodes[node] = (ABNodeStatus.Contested + teamIndex);
// burn current contested banner // burn current contested banner
@@ -454,7 +442,7 @@ namespace Game.BattleGrounds.Zones
// If contested, change back to occupied // If contested, change back to occupied
else else
{ {
UpdatePlayerScore(source, ScoreType.BasesDefended, 1); UpdatePvpStat(source, (uint)ArathiBasinPvpStats.BasesDefended, 1);
m_prevNodes[node] = m_Nodes[node]; m_prevNodes[node] = m_Nodes[node];
m_Nodes[node] = (ABNodeStatus.Occupied + teamIndex); m_Nodes[node] = (ABNodeStatus.Occupied + teamIndex);
// burn current contested banner // burn current contested banner
@@ -475,7 +463,7 @@ namespace Game.BattleGrounds.Zones
// If node is occupied, change to enemy-contested // If node is occupied, change to enemy-contested
else else
{ {
UpdatePlayerScore(source, ScoreType.BasesAssaulted, 1); UpdatePvpStat(source, (uint)ArathiBasinPvpStats.BasesAssaulted, 1);
m_prevNodes[node] = m_Nodes[node]; m_prevNodes[node] = m_Nodes[node];
m_Nodes[node] = (ABNodeStatus.Contested + teamIndex); m_Nodes[node] = (ABNodeStatus.Contested + teamIndex);
// burn current occupied banner // burn current occupied banner
@@ -657,25 +645,6 @@ namespace Game.BattleGrounds.Zones
return Global.ObjectMgr.GetWorldSafeLoc(team == Team.Alliance ? ExploitTeleportLocationAlliance : ExploitTeleportLocationHorde); return Global.ObjectMgr.GetWorldSafeLoc(team == Team.Alliance ? ExploitTeleportLocationAlliance : ExploitTeleportLocationHorde);
} }
public override bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true)
{
if (!base.UpdatePlayerScore(player, type, value, doAddHonor))
return false;
switch (type)
{
case ScoreType.BasesAssaulted:
player.UpdateCriteria(CriteriaType.TrackedWorldStateUIModified, (uint)ABObjectives.AssaultBase);
break;
case ScoreType.BasesDefended:
player.UpdateCriteria(CriteriaType.TrackedWorldStateUIModified, (uint)ABObjectives.DefendBase);
break;
default:
break;
}
return true;
}
/// <summary> /// <summary>
/// Nodes info: /// Nodes info:
/// 0: neutral /// 0: neutral
@@ -768,45 +737,6 @@ namespace Game.BattleGrounds.Zones
public static int[] NodeIcons = { 1842, 1846, 1845, 1844, 1843 }; public static int[] NodeIcons = { 1842, 1846, 1845, 1844, 1843 };
} }
class BattlegroundABScore : BattlegroundScore
{
public BattlegroundABScore(ObjectGuid playerGuid, Team team) : base(playerGuid, team)
{
BasesAssaulted = 0;
BasesDefended = 0;
}
public override void UpdateScore(ScoreType type, uint value)
{
switch (type)
{
case ScoreType.BasesAssaulted:
BasesAssaulted += value;
break;
case ScoreType.BasesDefended:
BasesDefended += value;
break;
default:
base.UpdateScore(type, value);
break;
}
}
public override void BuildPvPLogPlayerDataPacket(out PVPMatchStatistics.PVPMatchPlayerStatistics playerData)
{
base.BuildPvPLogPlayerDataPacket(out playerData);
playerData.Stats.Add(new PVPMatchStatistics.PVPMatchPlayerPVPStat((int)ABObjectives.AssaultBase, BasesAssaulted));
playerData.Stats.Add(new PVPMatchStatistics.PVPMatchPlayerPVPStat((int)ABObjectives.DefendBase, BasesDefended));
}
public override uint GetAttr1() { return BasesAssaulted; }
public override uint GetAttr2() { return BasesDefended; }
uint BasesAssaulted;
uint BasesDefended;
}
struct BannerTimer struct BannerTimer
{ {
public uint timer; public uint timer;
@@ -1003,5 +933,11 @@ namespace Game.BattleGrounds.Zones
AssaultBase = 122, AssaultBase = 122,
DefendBase = 123 DefendBase = 123
} }
enum ArathiBasinPvpStats
{
BasesAssaulted = 926,
BasesDefended = 927,
}
#endregion #endregion
} }
+6 -58
View File
@@ -195,16 +195,6 @@ namespace Game.BattleGrounds.Zones.EyeofStorm
} }
} }
public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{
bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player.GetGUID()] = new BgEyeOfStormScore(player.GetGUID(), player.GetBGTeam());
m_PlayersNearPoint[Points.PointsMax].Add(player.GetGUID());
}
public override void RemovePlayer(Player player, ObjectGuid guid, Team team) public override void RemovePlayer(Player player, ObjectGuid guid, Team team)
{ {
// sometimes flag aura not removed :( // sometimes flag aura not removed :(
@@ -655,23 +645,7 @@ namespace Game.BattleGrounds.Zones.EyeofStorm
UpdateWorldState(WorldStateIds.NetherstormFlagStateHorde, (int)FlagState.OnBase); UpdateWorldState(WorldStateIds.NetherstormFlagStateHorde, (int)FlagState.OnBase);
UpdateWorldState(WorldStateIds.NetherstormFlagStateAlliance, (int)FlagState.OnBase); UpdateWorldState(WorldStateIds.NetherstormFlagStateAlliance, (int)FlagState.OnBase);
UpdatePlayerScore(player, ScoreType.FlagCaptures, 1); UpdatePvpStat(player, (uint)EyeOfTheStormPvpStats.FlagCaptures, 1);
}
public override bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true)
{
if (!base.UpdatePlayerScore(player, type, value, doAddHonor))
return false;
switch (type)
{
case ScoreType.FlagCaptures:
player.UpdateCriteria(CriteriaType.TrackedWorldStateUIModified, Misc.ObjectiveCaptureFlag);
break;
default:
break;
}
return true;
} }
public override WorldSafeLocsEntry GetClosestGraveyard(Player player) public override WorldSafeLocsEntry GetClosestGraveyard(Player player)
@@ -809,35 +783,6 @@ namespace Game.BattleGrounds.Zones.EyeofStorm
Dictionary<uint, BgEyeOfStormControlZoneHandler> ControlZoneHandlers = new(); Dictionary<uint, BgEyeOfStormControlZoneHandler> ControlZoneHandlers = new();
} }
class BgEyeOfStormScore : BattlegroundScore
{
public BgEyeOfStormScore(ObjectGuid playerGuid, Team team) : base(playerGuid, team) { }
public override void UpdateScore(ScoreType type, uint value)
{
switch (type)
{
case ScoreType.FlagCaptures: // Flags captured
FlagCaptures += value;
break;
default:
base.UpdateScore(type, value);
break;
}
}
public override void BuildPvPLogPlayerDataPacket(out PVPMatchStatistics.PVPMatchPlayerStatistics playerData)
{
base.BuildPvPLogPlayerDataPacket(out playerData);
playerData.Stats.Add(new PVPMatchStatistics.PVPMatchPlayerPVPStat((int)Misc.ObjectiveCaptureFlag, FlagCaptures));
}
public override uint GetAttr1() { return FlagCaptures; }
uint FlagCaptures;
}
struct BgEyeOfStormPointIconsStruct struct BgEyeOfStormPointIconsStruct
{ {
public BgEyeOfStormPointIconsStruct(uint worldStateControlIndex, uint worldStateAllianceControlledIndex, uint worldStateHordeControlledIndex, uint worldStateAllianceStatusBarIcon, uint worldStateHordeStatusBarIcon) public BgEyeOfStormPointIconsStruct(uint worldStateControlIndex, uint worldStateAllianceControlledIndex, uint worldStateHordeControlledIndex, uint worldStateAllianceStatusBarIcon, uint worldStateHordeStatusBarIcon)
@@ -935,8 +880,6 @@ namespace Game.BattleGrounds.Zones.EyeofStorm
public const uint NotEYWeekendHonorTicks = 260; public const uint NotEYWeekendHonorTicks = 260;
public const uint EYWeekendHonorTicks = 160; public const uint EYWeekendHonorTicks = 160;
public const uint ObjectiveCaptureFlag = 183;
public const uint SpellNetherstormFlag = 34976; public const uint SpellNetherstormFlag = 34976;
public const uint SpellPlayerDroppedFlag = 34991; public const uint SpellPlayerDroppedFlag = 34991;
@@ -1229,4 +1172,9 @@ namespace Game.BattleGrounds.Zones.EyeofStorm
Uncontrolled = 0, Uncontrolled = 0,
UnderControl = 3 UnderControl = 3
} }
enum EyeOfTheStormPvpStats
{
FlagCaptures = 183
}
} }
@@ -420,8 +420,6 @@ namespace Game.BattleGrounds.Zones
{ {
bool isInBattleground = IsPlayerInBattleground(player.GetGUID()); bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player, queueId); base.AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player.GetGUID()] = new BattlegroundSAScore(player.GetGUID(), player.GetBGTeam());
SendTransportInit(player); SendTransportInit(player);
@@ -560,7 +558,7 @@ namespace Game.BattleGrounds.Zones
Player player = unit.GetCharmerOrOwnerPlayerOrPlayerItself(); Player player = unit.GetCharmerOrOwnerPlayerOrPlayerItself();
if (player != null) if (player != null)
{ {
UpdatePlayerScore(player, ScoreType.DestroyedWall, 1); UpdatePvpStat(player, (uint)StrandOfTheAncientsPvpStats.GatesDestroyed, 1);
if (rewardHonor) if (rewardHonor)
UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(1)); UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(1));
} }
@@ -586,7 +584,7 @@ namespace Game.BattleGrounds.Zones
{ {
if (creature.GetEntry() == SACreatureIds.Demolisher) if (creature.GetEntry() == SACreatureIds.Demolisher)
{ {
UpdatePlayerScore(killer, ScoreType.DestroyedDemolisher, 1); UpdatePvpStat(killer, (uint)StrandOfTheAncientsPvpStats.DemolishersDestroyed, 1);
uint worldStateId = Attackers == TeamId.Horde ? SAWorldStateIds.DestroyedHordeVehicles : SAWorldStateIds.DestroyedAllianceVehicles; uint worldStateId = Attackers == TeamId.Horde ? SAWorldStateIds.DestroyedHordeVehicles : SAWorldStateIds.DestroyedAllianceVehicles;
int currentDestroyedVehicles = Global.WorldStateMgr.GetValue((int)worldStateId, GetBgMap()); int currentDestroyedVehicles = Global.WorldStateMgr.GetValue((int)worldStateId, GetBgMap());
UpdateWorldState(worldStateId, currentDestroyedVehicles + 1); UpdateWorldState(worldStateId, currentDestroyedVehicles + 1);
@@ -1022,25 +1020,6 @@ namespace Game.BattleGrounds.Zones
return true; return true;
} }
public override bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true)
{
if (!base.UpdatePlayerScore(player, type, value, doAddHonor))
return false;
switch (type)
{
case ScoreType.DestroyedDemolisher:
player.UpdateCriteria(CriteriaType.TrackedWorldStateUIModified, (uint)SAObjectives.DemolishersDestroyed);
break;
case ScoreType.DestroyedWall:
player.UpdateCriteria(CriteriaType.TrackedWorldStateUIModified, (uint)SAObjectives.GatesDestroyed);
break;
default:
break;
}
return true;
}
SAGateInfo GetGate(uint entry) SAGateInfo GetGate(uint entry)
{ {
foreach (var gate in SAMiscConst.Gates) foreach (var gate in SAMiscConst.Gates)
@@ -1080,41 +1059,6 @@ namespace Game.BattleGrounds.Zones
Dictionary<uint/*id*/, uint/*timer*/> DemoliserRespawnList = new(); Dictionary<uint/*id*/, uint/*timer*/> DemoliserRespawnList = new();
} }
class BattlegroundSAScore : BattlegroundScore
{
public BattlegroundSAScore(ObjectGuid playerGuid, Team team) : base(playerGuid, team) { }
public override void UpdateScore(ScoreType type, uint value)
{
switch (type)
{
case ScoreType.DestroyedDemolisher:
DemolishersDestroyed += value;
break;
case ScoreType.DestroyedWall:
GatesDestroyed += value;
break;
default:
base.UpdateScore(type, value);
break;
}
}
public override void BuildPvPLogPlayerDataPacket(out PVPMatchStatistics.PVPMatchPlayerStatistics playerData)
{
base.BuildPvPLogPlayerDataPacket(out playerData);
playerData.Stats.Add(new PVPMatchStatistics.PVPMatchPlayerPVPStat((int)SAObjectives.DemolishersDestroyed, DemolishersDestroyed));
playerData.Stats.Add(new PVPMatchStatistics.PVPMatchPlayerPVPStat((int)SAObjectives.GatesDestroyed, GatesDestroyed));
}
public override uint GetAttr1() { return DemolishersDestroyed; }
public override uint GetAttr2() { return GatesDestroyed; }
uint DemolishersDestroyed;
uint GatesDestroyed;
}
struct SARoundScore struct SARoundScore
{ {
public uint winner; public uint winner;
@@ -1597,7 +1541,7 @@ namespace Game.BattleGrounds.Zones
public const int Max = 5; public const int Max = 5;
} }
enum SAObjectives enum StrandOfTheAncientsPvpStats
{ {
GatesDestroyed = 231, GatesDestroyed = 231,
DemolishersDestroyed = 232 DemolishersDestroyed = 232
+10 -65
View File
@@ -184,14 +184,6 @@ namespace Game.BattleGrounds.Zones
TriggerGameEvent(8563); TriggerGameEvent(8563);
} }
public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{
bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player.GetGUID()] = new BattlegroundWGScore(player.GetGUID(), player.GetBGTeam());
}
void RespawnFlag(Team Team, bool captured) void RespawnFlag(Team Team, bool captured)
{ {
if (Team == Team.Alliance) if (Team == Team.Alliance)
@@ -303,7 +295,7 @@ namespace Game.BattleGrounds.Zones
UpdateFlagState(team, WSGFlagState.WaitRespawn); // flag state none UpdateFlagState(team, WSGFlagState.WaitRespawn); // flag state none
UpdateTeamScore(GetTeamIndexByTeamId(team)); UpdateTeamScore(GetTeamIndexByTeamId(team));
// only flag capture should be updated // only flag capture should be updated
UpdatePlayerScore(player, ScoreType.FlagCaptures, 1); // +1 flag captures UpdatePvpStat(player, (uint)WarsongGulchPvpStats.FlagCaptures, 1); // +1 flag captures
// update last flag capture to be used if teamscore is equal // update last flag capture to be used if teamscore is equal
SetLastFlagCapture(team); SetLastFlagCapture(team);
@@ -482,7 +474,7 @@ namespace Game.BattleGrounds.Zones
RespawnFlag(Team.Alliance, false); RespawnFlag(Team.Alliance, false);
SpawnBGObject(WSGObjectTypes.AFlag, BattlegroundConst.RespawnImmediately); SpawnBGObject(WSGObjectTypes.AFlag, BattlegroundConst.RespawnImmediately);
PlaySoundToAll(WSGSound.FlagReturned); PlaySoundToAll(WSGSound.FlagReturned);
UpdatePlayerScore(player, ScoreType.FlagReturns, 1); UpdatePvpStat(player, (uint)WarsongGulchPvpStats.FlagReturns, 1);
_bothFlagsKept = false; _bothFlagsKept = false;
HandleFlagRoomCapturePoint(TeamId.Horde); // Check Horde flag if it is in capture zone; if so, capture it HandleFlagRoomCapturePoint(TeamId.Horde); // Check Horde flag if it is in capture zone; if so, capture it
@@ -516,7 +508,7 @@ namespace Game.BattleGrounds.Zones
RespawnFlag(Team.Horde, false); RespawnFlag(Team.Horde, false);
SpawnBGObject(WSGObjectTypes.HFlag, BattlegroundConst.RespawnImmediately); SpawnBGObject(WSGObjectTypes.HFlag, BattlegroundConst.RespawnImmediately);
PlaySoundToAll(WSGSound.FlagReturned); PlaySoundToAll(WSGSound.FlagReturned);
UpdatePlayerScore(player, ScoreType.FlagReturns, 1); UpdatePvpStat(player, (uint)WarsongGulchPvpStats.FlagReturns, 1);
_bothFlagsKept = false; _bothFlagsKept = false;
HandleFlagRoomCapturePoint(TeamId.Alliance); // Check Alliance flag if it is in capture zone; if so, capture it HandleFlagRoomCapturePoint(TeamId.Alliance); // Check Alliance flag if it is in capture zone; if so, capture it
@@ -778,25 +770,6 @@ namespace Game.BattleGrounds.Zones
base.HandleKillPlayer(victim, killer); base.HandleKillPlayer(victim, killer);
} }
public override bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true)
{
if (!base.UpdatePlayerScore(player, type, value, doAddHonor))
return false;
switch (type)
{
case ScoreType.FlagCaptures: // flags captured
player.UpdateCriteria(CriteriaType.TrackedWorldStateUIModified, WSObjectives.CaptureFlag);
break;
case ScoreType.FlagReturns: // flags returned
player.UpdateCriteria(CriteriaType.TrackedWorldStateUIModified, WSObjectives.ReturnFlag);
break;
default:
break;
}
return true;
}
public override WorldSafeLocsEntry GetClosestGraveyard(Player player) public override WorldSafeLocsEntry GetClosestGraveyard(Player player)
{ {
//if status in progress, it returns main graveyards with spiritguides //if status in progress, it returns main graveyards with spiritguides
@@ -883,41 +856,6 @@ namespace Game.BattleGrounds.Zones
const uint ExploitTeleportLocationHorde = 3785; const uint ExploitTeleportLocationHorde = 3785;
} }
class BattlegroundWGScore : BattlegroundScore
{
public BattlegroundWGScore(ObjectGuid playerGuid, Team team) : base(playerGuid, team) { }
public override void UpdateScore(ScoreType type, uint value)
{
switch (type)
{
case ScoreType.FlagCaptures: // Flags captured
FlagCaptures += value;
break;
case ScoreType.FlagReturns: // Flags returned
FlagReturns += value;
break;
default:
base.UpdateScore(type, value);
break;
}
}
public override void BuildPvPLogPlayerDataPacket(out PVPMatchStatistics.PVPMatchPlayerStatistics playerData)
{
base.BuildPvPLogPlayerDataPacket(out playerData);
playerData.Stats.Add(new PVPMatchStatistics.PVPMatchPlayerPVPStat(WSObjectives.CaptureFlag, FlagCaptures));
playerData.Stats.Add(new PVPMatchStatistics.PVPMatchPlayerPVPStat(WSObjectives.ReturnFlag, FlagReturns));
}
public override uint GetAttr1() { return FlagCaptures; }
public override uint GetAttr2() { return FlagReturns; }
uint FlagCaptures;
uint FlagReturns;
}
#region Constants #region Constants
enum WSGRewards enum WSGRewards
{ {
@@ -1057,10 +995,17 @@ namespace Game.BattleGrounds.Zones
public const uint AllianceFlagReturned = 9808; public const uint AllianceFlagReturned = 9808;
public const uint HordeFlagReturned = 9809; public const uint HordeFlagReturned = 9809;
} }
struct WSObjectives struct WSObjectives
{ {
public const int CaptureFlag = 42; public const int CaptureFlag = 42;
public const int ReturnFlag = 44; public const int ReturnFlag = 44;
} }
enum WarsongGulchPvpStats
{
FlagCaptures = 928,
FlagReturns = 929
}
#endregion #endregion
} }
+2
View File
@@ -258,6 +258,7 @@ namespace Game.DataStorage
PrestigeLevelInfoStorage = ReadDB2<PrestigeLevelInfoRecord>("PrestigeLevelInfo.db2", HotfixStatements.SEL_PRESTIGE_LEVEL_INFO, HotfixStatements.SEL_PRESTIGE_LEVEL_INFO_LOCALE); PrestigeLevelInfoStorage = ReadDB2<PrestigeLevelInfoRecord>("PrestigeLevelInfo.db2", HotfixStatements.SEL_PRESTIGE_LEVEL_INFO, HotfixStatements.SEL_PRESTIGE_LEVEL_INFO_LOCALE);
PvpDifficultyStorage = ReadDB2<PvpDifficultyRecord>("PVPDifficulty.db2", HotfixStatements.SEL_PVP_DIFFICULTY); PvpDifficultyStorage = ReadDB2<PvpDifficultyRecord>("PVPDifficulty.db2", HotfixStatements.SEL_PVP_DIFFICULTY);
PvpItemStorage = ReadDB2<PvpItemRecord>("PVPItem.db2", HotfixStatements.SEL_PVP_ITEM); PvpItemStorage = ReadDB2<PvpItemRecord>("PVPItem.db2", HotfixStatements.SEL_PVP_ITEM);
PvpStatStorage = ReadDB2<PvpStatRecord>("PVPStat.db2", HotfixStatements.SEL_PVP_STAT, HotfixStatements.SEL_PVP_STAT_LOCALE);
PvpSeasonStorage = ReadDB2<PvpSeasonRecord>("PvpSeason.db2", HotfixStatements.SEL_PVP_SEASON); PvpSeasonStorage = ReadDB2<PvpSeasonRecord>("PvpSeason.db2", HotfixStatements.SEL_PVP_SEASON);
PvpTalentStorage = ReadDB2<PvpTalentRecord>("PvpTalent.db2", HotfixStatements.SEL_PVP_TALENT, HotfixStatements.SEL_PVP_TALENT_LOCALE); PvpTalentStorage = ReadDB2<PvpTalentRecord>("PvpTalent.db2", HotfixStatements.SEL_PVP_TALENT, HotfixStatements.SEL_PVP_TALENT_LOCALE);
PvpTalentCategoryStorage = ReadDB2<PvpTalentCategoryRecord>("PvpTalentCategory.db2", HotfixStatements.SEL_PVP_TALENT_CATEGORY); PvpTalentCategoryStorage = ReadDB2<PvpTalentCategoryRecord>("PvpTalentCategory.db2", HotfixStatements.SEL_PVP_TALENT_CATEGORY);
@@ -693,6 +694,7 @@ namespace Game.DataStorage
public static DB6Storage<PrestigeLevelInfoRecord> PrestigeLevelInfoStorage; public static DB6Storage<PrestigeLevelInfoRecord> PrestigeLevelInfoStorage;
public static DB6Storage<PvpDifficultyRecord> PvpDifficultyStorage; public static DB6Storage<PvpDifficultyRecord> PvpDifficultyStorage;
public static DB6Storage<PvpItemRecord> PvpItemStorage; public static DB6Storage<PvpItemRecord> PvpItemStorage;
public static DB6Storage<PvpStatRecord> PvpStatStorage;
public static DB6Storage<PvpSeasonRecord> PvpSeasonStorage; public static DB6Storage<PvpSeasonRecord> PvpSeasonStorage;
public static DB6Storage<PvpTalentRecord> PvpTalentStorage; public static DB6Storage<PvpTalentRecord> PvpTalentStorage;
public static DB6Storage<PvpTalentCategoryRecord> PvpTalentCategoryStorage; public static DB6Storage<PvpTalentCategoryRecord> PvpTalentCategoryStorage;
+18 -9
View File
@@ -630,6 +630,9 @@ namespace Game.DataStorage
foreach (WMOAreaTableRecord entry in WMOAreaTableStorage.Values) foreach (WMOAreaTableRecord entry in WMOAreaTableStorage.Values)
_wmoAreaTableLookup[Tuple.Create((short)entry.WmoID, (sbyte)entry.NameSetID, entry.WmoGroupID)] = entry; _wmoAreaTableLookup[Tuple.Create((short)entry.WmoID, (sbyte)entry.NameSetID, entry.WmoGroupID)] = entry;
foreach (PvpStatRecord pvpStat in PvpStatStorage.Values)
_pvpStatIdsByMap.Add(pvpStat.MapID, pvpStat.Id);
} }
public IDB2Storage GetStorage(uint type) public IDB2Storage GetStorage(uint type)
@@ -1051,7 +1054,7 @@ namespace Game.DataStorage
return contentTuningId; return contentTuningId;
} }
public ContentTuningLevels? GetContentTuningData(uint contentTuningId, uint redirectFlag, bool forItem = false) public ContentTuningLevels? GetContentTuningData(uint contentTuningId, uint redirectFlag, bool forItem = false)
{ {
ContentTuningRecord contentTuning = ContentTuningStorage.LookupByKey(GetRedirectedContentTuningId(contentTuningId, redirectFlag)); ContentTuningRecord contentTuning = ContentTuningStorage.LookupByKey(GetRedirectedContentTuningId(contentTuningId, redirectFlag));
@@ -1095,7 +1098,7 @@ namespace Game.DataStorage
{ {
return _contentTuningLabels.Contains((contentTuningId, label)); return _contentTuningLabels.Contains((contentTuningId, label));
} }
public string GetCreatureFamilyPetName(CreatureFamily petfamily, Locale locale) public string GetCreatureFamilyPetName(CreatureFamily petfamily, Locale locale)
{ {
if (petfamily == CreatureFamily.None) if (petfamily == CreatureFamily.None)
@@ -1294,16 +1297,16 @@ namespace Game.DataStorage
{ {
var mythicPlusSeason = MythicPlusSeasonStorage.LookupByKey(contentTuningXExpected.MinMythicPlusSeasonID); var mythicPlusSeason = MythicPlusSeasonStorage.LookupByKey(contentTuningXExpected.MinMythicPlusSeasonID);
if (mythicPlusSeason != null) if (mythicPlusSeason != null)
if (ActiveMilestoneSeason < mythicPlusSeason.MilestoneSeason) if (ActiveMilestoneSeason < mythicPlusSeason.MilestoneSeason)
return mod; return mod;
} }
if (contentTuningXExpected.MaxMythicPlusSeasonID != 0) if (contentTuningXExpected.MaxMythicPlusSeasonID != 0)
{ {
var mythicPlusSeason = MythicPlusSeasonStorage.LookupByKey(contentTuningXExpected.MaxMythicPlusSeasonID); var mythicPlusSeason = MythicPlusSeasonStorage.LookupByKey(contentTuningXExpected.MaxMythicPlusSeasonID);
if (mythicPlusSeason != null) if (mythicPlusSeason != null)
if (ActiveMilestoneSeason >= mythicPlusSeason.MilestoneSeason) if (ActiveMilestoneSeason >= mythicPlusSeason.MilestoneSeason)
return mod; return mod;
} }
var expectedStatMod = ExpectedStatModStorage.LookupByKey(contentTuningXExpected.ExpectedStatModID); var expectedStatMod = ExpectedStatModStorage.LookupByKey(contentTuningXExpected.ExpectedStatModID);
@@ -1872,7 +1875,7 @@ namespace Game.DataStorage
{ {
return _skillRaceClassInfoBySkill.LookupByKey(skill); return _skillRaceClassInfoBySkill.LookupByKey(skill);
} }
public SoulbindConduitRankRecord GetSoulbindConduitRank(int soulbindConduitId, int rank) public SoulbindConduitRankRecord GetSoulbindConduitRank(int soulbindConduitId, int rank)
{ {
return _soulbindConduitRanks.LookupByKey(Tuple.Create(soulbindConduitId, rank)); return _soulbindConduitRanks.LookupByKey(Tuple.Create(soulbindConduitId, rank));
@@ -1902,7 +1905,7 @@ namespace Game.DataStorage
{ {
return _spellVisualMissilesBySet.LookupByKey(spellVisualMissileSetId); return _spellVisualMissilesBySet.LookupByKey(spellVisualMissileSetId);
} }
public List<TalentRecord> GetTalentsByPosition(Class class_, uint tier, uint column) public List<TalentRecord> GetTalentsByPosition(Class class_, uint tier, uint column)
{ {
return _talentsByPosition[(int)class_][tier][column]; return _talentsByPosition[(int)class_][tier][column];
@@ -2223,6 +2226,11 @@ namespace Game.DataStorage
return null; return null;
} }
public List<uint> GetPVPStatIDsForMap(uint mapId)
{
return _pvpStatIdsByMap.LookupByKey(mapId);
}
public bool HasItemCurrencyCost(uint itemId) { return _itemsWithCurrencyCost.Contains(itemId); } public bool HasItemCurrencyCost(uint itemId) { return _itemsWithCurrencyCost.Contains(itemId); }
public Dictionary<uint, Dictionary<uint, MapDifficultyRecord>> GetMapDifficulties() { return _mapDifficulties; } public Dictionary<uint, Dictionary<uint, MapDifficultyRecord>> GetMapDifficulties() { return _mapDifficulties; }
@@ -2316,6 +2324,7 @@ namespace Game.DataStorage
MultiMap<int, UiMapAssignmentRecord>[] _uiMapAssignmentByWmoGroup = new MultiMap<int, UiMapAssignmentRecord>[(int)UiMapSystem.Max]; MultiMap<int, UiMapAssignmentRecord>[] _uiMapAssignmentByWmoGroup = new MultiMap<int, UiMapAssignmentRecord>[(int)UiMapSystem.Max];
List<int> _uiMapPhases = new(); List<int> _uiMapPhases = new();
Dictionary<Tuple<short, sbyte, int>, WMOAreaTableRecord> _wmoAreaTableLookup = new(); Dictionary<Tuple<short, sbyte, int>, WMOAreaTableRecord> _wmoAreaTableLookup = new();
MultiMap<uint, uint> _pvpStatIdsByMap = new();
} }
class UiMapBounds class UiMapBounds
@@ -2526,7 +2535,7 @@ namespace Game.DataStorage
UniqueID = data.ReadUInt32(); UniqueID = data.ReadUInt32();
} }
} }
public class HotfixOptionalData public class HotfixOptionalData
{ {
public uint Key; public uint Key;
@@ -178,6 +178,13 @@ namespace Game.DataStorage
public byte ItemLevelDelta; public byte ItemLevelDelta;
} }
public sealed class PvpStatRecord
{
public LocalizedString Description;
public uint Id;
public uint MapID;
}
public sealed class PvpSeasonRecord public sealed class PvpSeasonRecord
{ {
public uint Id; public uint Id;