Core/Battlegrounds: Store mercenary status separately from the aura obtained from gossip as it can be removed at any time

Port From (https://github.com/TrinityCore/TrinityCore/commit/84486ded67efc4e779412ff865c66ca8b9cee7ea)
This commit is contained in:
hondacrx
2022-05-31 12:07:04 -04:00
parent 5d315fd84d
commit 036c565f69
10 changed files with 83 additions and 54 deletions
@@ -89,9 +89,10 @@ namespace Framework.Constants
public const uint SpellHonorableDefender25y = 68652; // +50% Honor When Standing At A Capture Point That You Control, 25yards Radius (Added In 3.2) public const uint SpellHonorableDefender25y = 68652; // +50% Honor When Standing At A Capture Point That You Control, 25yards Radius (Added In 3.2)
public const uint SpellHonorableDefender60y = 66157; // +50% Honor When Standing At A Capture Point That You Control, 60yards Radius (Added In 3.2), Probably For 40+ Player Battlegrounds public const uint SpellHonorableDefender60y = 66157; // +50% Honor When Standing At A Capture Point That You Control, 60yards Radius (Added In 3.2), Probably For 40+ Player Battlegrounds
public const uint SpellMercenaryHorde1 = 193864; public const uint SpellMercenaryHorde1 = 193864;
public const uint SpellMercenaryHorde2 = 195838; public const uint SpellMercenaryHordeReactions = 195838;
public const uint SpellMercenaryAlliance1 = 193863; public const uint SpellMercenaryAlliance1 = 193863;
public const uint SpellMercenaryAlliance2 = 195843; public const uint SpellMercenaryAllianceReactions = 195843;
public const uint SpellMercenaryShapeshift = 193970;
} }
public enum BattlegroundEventFlags public enum BattlegroundEventFlags
+25 -11
View File
@@ -997,6 +997,7 @@ namespace Game.BattleGrounds
bp.OfflineRemoveTime = 0; bp.OfflineRemoveTime = 0;
bp.Team = team; bp.Team = team;
bp.ActiveSpec = (int)player.GetPrimarySpecialization(); bp.ActiveSpec = (int)player.GetPrimarySpecialization();
bp.Mercenary = player.IsMercenaryForBattlegroundQueueType(GetQueueId());
bool isInBattleground = IsPlayerInBattleground(player.GetGUID()); bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
// Add to list/maps // Add to list/maps
@@ -1071,15 +1072,18 @@ namespace Game.BattleGrounds
player.SendPacket(timer); player.SendPacket(timer);
} }
if (player.HasAura(PlayerConst.SpellMercenaryContractHorde)) if (bp.Mercenary)
{ {
player.CastSpell(player, BattlegroundConst.SpellMercenaryHorde1, true); if (bp.Team == Team.Horde)
player.CastSpell(player, BattlegroundConst.SpellMercenaryHorde2, true); {
} player.CastSpell(player, BattlegroundConst.SpellMercenaryHorde1, true);
else if (player.HasAura(PlayerConst.SpellMercenaryContractAlliance)) player.CastSpell(player, BattlegroundConst.SpellMercenaryHordeReactions, true);
{ }
player.CastSpell(player, BattlegroundConst.SpellMercenaryAlliance1, true); else if (bp.Team == Team.Alliance)
player.CastSpell(player, BattlegroundConst.SpellMercenaryAlliance2, true); {
player.CastSpell(player, BattlegroundConst.SpellMercenaryAlliance1, true);
player.CastSpell(player, BattlegroundConst.SpellMercenaryAllianceReactions, true);
}
} }
} }
@@ -1768,6 +1772,15 @@ namespace Game.BattleGrounds
return m_Players.ContainsKey(guid); return m_Players.ContainsKey(guid);
} }
public bool IsPlayerMercenaryInBattleground(ObjectGuid guid)
{
var player = m_Players.LookupByKey(guid);
if (player != null)
return player.Mercenary;
return false;
}
void PlayerAddedToBGCheckIfBGIsRunning(Player player) void PlayerAddedToBGCheckIfBGIsRunning(Player player)
{ {
if (GetStatus() != BattlegroundStatus.WaitLeave) if (GetStatus() != BattlegroundStatus.WaitLeave)
@@ -2154,8 +2167,9 @@ namespace Game.BattleGrounds
public class BattlegroundPlayer public class BattlegroundPlayer
{ {
public long OfflineRemoveTime; // for tracking and removing offline players from queue after 5 Time.Minutes public long OfflineRemoveTime; // for tracking and removing offline players from queue after 5 Time.Minutes
public Team Team; // Player's team public Team Team; // Player's team
public int ActiveSpec; public int ActiveSpec; // Player's active spec
public bool Mercenary;
} }
} }
+7 -15
View File
@@ -57,7 +57,7 @@ namespace Game.BattleGrounds
} }
// add group or player (grp == null) to bg queue with the given leader and bg specifications // add group or player (grp == null) to bg queue with the given leader and bg specifications
public GroupQueueInfo AddGroup(Player leader, Group grp, PvpDifficultyRecord bracketEntry, bool isPremade, uint ArenaRating, uint MatchmakerRating, uint arenateamid = 0) public GroupQueueInfo AddGroup(Player leader, Group group, Team team, PvpDifficultyRecord bracketEntry, bool isPremade, uint ArenaRating, uint MatchmakerRating, uint arenateamid = 0)
{ {
BattlegroundBracketId bracketId = bracketEntry.GetBracketId(); BattlegroundBracketId bracketId = bracketEntry.GetBracketId();
@@ -67,7 +67,7 @@ namespace Game.BattleGrounds
ginfo.IsInvitedToBGInstanceGUID = 0; ginfo.IsInvitedToBGInstanceGUID = 0;
ginfo.JoinTime = GameTime.GetGameTimeMS(); ginfo.JoinTime = GameTime.GetGameTimeMS();
ginfo.RemoveInviteTime = 0; ginfo.RemoveInviteTime = 0;
ginfo.Team = leader.GetBgQueueTeam(); ginfo.Team = team;
ginfo.ArenaTeamRating = ArenaRating; ginfo.ArenaTeamRating = ArenaRating;
ginfo.ArenaMatchmakerRating = MatchmakerRating; ginfo.ArenaMatchmakerRating = MatchmakerRating;
ginfo.OpponentsTeamRating = 0; ginfo.OpponentsTeamRating = 0;
@@ -88,15 +88,15 @@ namespace Game.BattleGrounds
//announce world (this don't need mutex) //announce world (this don't need mutex)
if (m_queueId.Rated && WorldConfig.GetBoolValue(WorldCfg.ArenaQueueAnnouncerEnable)) if (m_queueId.Rated && WorldConfig.GetBoolValue(WorldCfg.ArenaQueueAnnouncerEnable))
{ {
ArenaTeam team = Global.ArenaTeamMgr.GetArenaTeamById(arenateamid); ArenaTeam arenaTeam = Global.ArenaTeamMgr.GetArenaTeamById(arenateamid);
if (team != null) if (arenaTeam != null)
Global.WorldMgr.SendWorldText( CypherStrings.ArenaQueueAnnounceWorldJoin, team.GetName(), m_queueId.TeamSize, m_queueId.TeamSize, ginfo.ArenaTeamRating); Global.WorldMgr.SendWorldText( CypherStrings.ArenaQueueAnnounceWorldJoin, arenaTeam.GetName(), m_queueId.TeamSize, m_queueId.TeamSize, ginfo.ArenaTeamRating);
} }
//add players from group to ginfo //add players from group to ginfo
if (grp) if (group)
{ {
for (GroupReference refe = grp.GetFirstMember(); refe != null; refe = refe.Next()) for (GroupReference refe = group.GetFirstMember(); refe != null; refe = refe.Next())
{ {
Player member = refe.GetSource(); Player member = refe.GetSource();
if (!member) if (!member)
@@ -109,14 +109,6 @@ namespace Game.BattleGrounds
m_QueuedPlayers[member.GetGUID()] = pl_info; m_QueuedPlayers[member.GetGUID()] = pl_info;
// add the pinfo to ginfo's list // add the pinfo to ginfo's list
ginfo.Players[member.GetGUID()] = pl_info; ginfo.Players[member.GetGUID()] = pl_info;
if (ginfo.Team != member.GetTeam())
{
if (member.GetTeam() == Team.Alliance)
member.CastSpell(member, PlayerConst.SpellMercenaryContractHorde);
else
member.CastSpell(member, PlayerConst.SpellMercenaryContractAlliance);
}
} }
} }
else else
+1
View File
@@ -2828,6 +2828,7 @@ namespace Game.Entities
currentBg.EventPlayerLoggedIn(this); currentBg.EventPlayerLoggedIn(this);
SetInviteForBattlegroundQueueType(bgQueueTypeId, currentBg.GetInstanceID()); SetInviteForBattlegroundQueueType(bgQueueTypeId, currentBg.GetInstanceID());
SetMercenaryForBattlegroundQueueType(bgQueueTypeId, currentBg.IsPlayerMercenaryInBattleground(GetGUID()));
} }
// Bg was not found - go to Entry Point // Bg was not found - go to Entry Point
else else
@@ -554,6 +554,7 @@ namespace Game.Entities
public BattlegroundQueueTypeId bgQueueTypeId; public BattlegroundQueueTypeId bgQueueTypeId;
public uint invitedToInstance; public uint invitedToInstance;
public uint joinTime; public uint joinTime;
public bool mercenary;
} }
// Holder for Battlegrounddata // Holder for Battlegrounddata
+17
View File
@@ -448,6 +448,7 @@ namespace Game.Entities
m_bgBattlegroundQueueID[i].bgQueueTypeId = val; m_bgBattlegroundQueueID[i].bgQueueTypeId = val;
m_bgBattlegroundQueueID[i].invitedToInstance = 0; m_bgBattlegroundQueueID[i].invitedToInstance = 0;
m_bgBattlegroundQueueID[i].joinTime = (uint)GameTime.GetGameTime(); m_bgBattlegroundQueueID[i].joinTime = (uint)GameTime.GetGameTime();
m_bgBattlegroundQueueID[i].mercenary = HasAura(PlayerConst.SpellMercenaryContractHorde) || HasAura(PlayerConst.SpellMercenaryContractAlliance);
return i; return i;
} }
} }
@@ -471,6 +472,7 @@ namespace Game.Entities
m_bgBattlegroundQueueID[i].bgQueueTypeId = default; m_bgBattlegroundQueueID[i].bgQueueTypeId = default;
m_bgBattlegroundQueueID[i].invitedToInstance = 0; m_bgBattlegroundQueueID[i].invitedToInstance = 0;
m_bgBattlegroundQueueID[i].joinTime = 0; m_bgBattlegroundQueueID[i].joinTime = 0;
m_bgBattlegroundQueueID[i].mercenary = false;
return; return;
} }
} }
@@ -491,6 +493,21 @@ namespace Game.Entities
return false; return false;
} }
void SetMercenaryForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId, bool mercenary)
{
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
if (m_bgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
m_bgBattlegroundQueueID[i].mercenary = mercenary;
}
public bool IsMercenaryForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId)
{
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
if (m_bgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
return m_bgBattlegroundQueueID[i].mercenary;
return false;
}
public WorldLocation GetBattlegroundEntryPoint() { return m_bgData.joinPos; } public WorldLocation GetBattlegroundEntryPoint() { return m_bgData.joinPos; }
public bool InBattleground() { return m_bgData.bgInstanceID != 0; } public bool InBattleground() { return m_bgData.bgInstanceID != 0; }
-11
View File
@@ -3524,17 +3524,6 @@ namespace Game.Entities
m_team = (m_team == Team.Alliance) ? Team.Horde : Team.Alliance; m_team = (m_team == Team.Alliance) ? Team.Horde : Team.Alliance;
} }
public Team GetBgQueueTeam()
{
if (HasAura(PlayerConst.SpellMercenaryContractHorde))
return Team.Horde;
if (HasAura(PlayerConst.SpellMercenaryContractAlliance))
return Team.Alliance;
return GetTeam();
}
public Team GetNativeTeam() { return TeamForRace(GetRace()); } public Team GetNativeTeam() { return TeamForRace(GetRace()); }
public uint GetNativeTeamId() { return TeamIdForRace(GetRace()); } public uint GetNativeTeamId() { return TeamIdForRace(GetRace()); }
+10 -7
View File
@@ -1802,7 +1802,7 @@ namespace Game.Groups
BattlemasterListRecord bgEntry = CliDB.BattlemasterListStorage.LookupByKey(bgOrTemplate.GetTypeID()); BattlemasterListRecord bgEntry = CliDB.BattlemasterListStorage.LookupByKey(bgOrTemplate.GetTypeID());
if (bgEntry == null) if (bgEntry == null)
return GroupJoinBattlegroundResult.JoinFailed; // shouldn't happen return GroupJoinBattlegroundResult.BattlegroundJoinFailed; // shouldn't happen
// check for min / max count // check for min / max count
uint memberscount = GetMembersCount(); uint memberscount = GetMembersCount();
@@ -1814,14 +1814,15 @@ namespace Game.Groups
Player reference = GetFirstMember().GetSource(); Player reference = GetFirstMember().GetSource();
// no reference found, can't join this way // no reference found, can't join this way
if (!reference) if (!reference)
return GroupJoinBattlegroundResult.JoinFailed; return GroupJoinBattlegroundResult.BattlegroundJoinFailed;
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bgOrTemplate.GetMapId(), reference.GetLevel()); PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bgOrTemplate.GetMapId(), reference.GetLevel());
if (bracketEntry == null) if (bracketEntry == null)
return GroupJoinBattlegroundResult.JoinFailed; return GroupJoinBattlegroundResult.BattlegroundJoinFailed;
uint arenaTeamId = reference.GetArenaTeamId((byte)arenaSlot); uint arenaTeamId = reference.GetArenaTeamId((byte)arenaSlot);
Team team = reference.GetTeam(); Team team = reference.GetTeam();
bool isMercenary = reference.HasAura(PlayerConst.SpellMercenaryContractHorde) || reference.HasAura(PlayerConst.SpellMercenaryContractAlliance);
// check every member of the group to be able to join // check every member of the group to be able to join
memberscount = 0; memberscount = 0;
@@ -1830,7 +1831,7 @@ namespace Game.Groups
Player member = refe.GetSource(); Player member = refe.GetSource();
// offline member? don't let join // offline member? don't let join
if (!member) if (!member)
return GroupJoinBattlegroundResult.JoinFailed; return GroupJoinBattlegroundResult.BattlegroundJoinFailed;
// rbac permissions // rbac permissions
if (!member.CanJoinToBattleground(bgOrTemplate)) if (!member.CanJoinToBattleground(bgOrTemplate))
return GroupJoinBattlegroundResult.JoinTimedOut; return GroupJoinBattlegroundResult.JoinTimedOut;
@@ -1846,10 +1847,10 @@ namespace Game.Groups
return GroupJoinBattlegroundResult.JoinRangeIndex; return GroupJoinBattlegroundResult.JoinRangeIndex;
// don't let join rated matches if the arena team id doesn't match // don't let join rated matches if the arena team id doesn't match
if (isRated && member.GetArenaTeamId((byte)arenaSlot) != arenaTeamId) if (isRated && member.GetArenaTeamId((byte)arenaSlot) != arenaTeamId)
return GroupJoinBattlegroundResult.JoinFailed; return GroupJoinBattlegroundResult.BattlegroundJoinFailed;
// don't let join if someone from the group is already in that bg queue // don't let join if someone from the group is already in that bg queue
if (member.InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId)) if (member.InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
return GroupJoinBattlegroundResult.JoinFailed; // not blizz-like return GroupJoinBattlegroundResult.BattlegroundJoinFailed; // not blizz-like
// don't let join if someone from the group is in bg queue random // don't let join if someone from the group is in bg queue random
bool isInRandomBgQueue = member.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RB, BattlegroundQueueIdType.Battleground, false, 0)) bool isInRandomBgQueue = member.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RB, BattlegroundQueueIdType.Battleground, false, 0))
|| member.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RandomEpic, BattlegroundQueueIdType.Battleground, false, 0)); || member.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RandomEpic, BattlegroundQueueIdType.Battleground, false, 0));
@@ -1869,7 +1870,9 @@ namespace Game.Groups
return GroupJoinBattlegroundResult.LfgCantUseBattleground; return GroupJoinBattlegroundResult.LfgCantUseBattleground;
// check Freeze debuff // check Freeze debuff
if (member.HasAura(9454)) if (member.HasAura(9454))
return GroupJoinBattlegroundResult.JoinFailed; return GroupJoinBattlegroundResult.BattlegroundJoinFailed;
if (isMercenary != (member.HasAura(PlayerConst.SpellMercenaryContractHorde) || member.HasAura(PlayerConst.SpellMercenaryContractAlliance)))
return GroupJoinBattlegroundResult.BattlegroundJoinMercenary;
} }
// only check for MinPlayerCount since MinPlayerCount == MaxPlayerCount for arenas... // only check for MinPlayerCount since MinPlayerCount == MaxPlayerCount for arenas...
+19 -4
View File
@@ -101,6 +101,21 @@ namespace Game
Group grp = _player.GetGroup(); Group grp = _player.GetGroup();
Team getQueueTeam()
{
// mercenary applies only to unrated battlegrounds
if (!bg.IsRated() && !bg.IsArena())
{
if (_player.HasAura(PlayerConst.SpellMercenaryContractHorde))
return Team.Horde;
if (_player.HasAura(PlayerConst.SpellMercenaryContractAlliance))
return Team.Alliance;
}
return _player.GetTeam();
}
BattlefieldStatusFailed battlefieldStatusFailed; BattlefieldStatusFailed battlefieldStatusFailed;
// check queue conditions // check queue conditions
if (grp == null) if (grp == null)
@@ -163,7 +178,7 @@ namespace Game
return; return;
BattlegroundQueue bgQueue = Global.BattlegroundMgr.GetBattlegroundQueue(bgQueueTypeId); BattlegroundQueue bgQueue = Global.BattlegroundMgr.GetBattlegroundQueue(bgQueueTypeId);
GroupQueueInfo ginfo = bgQueue.AddGroup(GetPlayer(), null, bracketEntry, isPremade, 0, 0); GroupQueueInfo ginfo = bgQueue.AddGroup(GetPlayer(), null, getQueueTeam(), bracketEntry, isPremade, 0, 0);
uint avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId()); uint avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId());
uint queueSlot = GetPlayer().AddBattlegroundQueueId(bgQueueTypeId); uint queueSlot = GetPlayer().AddBattlegroundQueueId(bgQueueTypeId);
@@ -189,7 +204,7 @@ namespace Game
if (err == 0) if (err == 0)
{ {
Log.outDebug(LogFilter.Battleground, "Battleground: the following players are joining as group:"); Log.outDebug(LogFilter.Battleground, "Battleground: the following players are joining as group:");
ginfo = bgQueue.AddGroup(GetPlayer(), grp, bracketEntry, isPremade, 0, 0); ginfo = bgQueue.AddGroup(GetPlayer(), grp, getQueueTeam(), bracketEntry, isPremade, 0, 0);
avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId()); avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId());
} }
@@ -539,7 +554,7 @@ namespace Game
{ {
Log.outDebug(LogFilter.Battleground, "Battleground: arena team id {0}, leader {1} queued with matchmaker rating {2} for type {3}", GetPlayer().GetArenaTeamId(packet.TeamSizeIndex), GetPlayer().GetName(), matchmakerRating, arenatype); Log.outDebug(LogFilter.Battleground, "Battleground: arena team id {0}, leader {1} queued with matchmaker rating {2} for type {3}", GetPlayer().GetArenaTeamId(packet.TeamSizeIndex), GetPlayer().GetName(), matchmakerRating, arenatype);
ginfo = bgQueue.AddGroup(GetPlayer(), grp, bracketEntry, false, arenaRating, matchmakerRating, ateamId); ginfo = bgQueue.AddGroup(GetPlayer(), grp, _player.GetTeam(), bracketEntry, false, arenaRating, matchmakerRating, ateamId);
avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId()); avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId());
} }
@@ -560,7 +575,7 @@ namespace Game
if (!GetPlayer().CanJoinToBattleground(bg)) if (!GetPlayer().CanJoinToBattleground(bg))
{ {
BattlefieldStatusFailed battlefieldStatus; BattlefieldStatusFailed battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.JoinFailed, errorGuid); Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.BattlegroundJoinFailed, errorGuid);
member.SendPacket(battlefieldStatus); member.SendPacket(battlefieldStatus);
return; return;
} }
-4
View File
@@ -403,10 +403,6 @@ namespace Game
if (!spellInfo.IsPositive() || spellInfo.IsPassive()) if (!spellInfo.IsPositive() || spellInfo.IsPassive())
return; return;
if (spellInfo.Id == PlayerConst.SpellMercenaryContractHorde || spellInfo.Id == PlayerConst.SpellMercenaryContractAlliance)
if (_player.InBattlegroundQueue())
return;
GetPlayer().RemoveOwnedAura(cancelAura.SpellID, cancelAura.CasterGUID, 0, AuraRemoveMode.Cancel); GetPlayer().RemoveOwnedAura(cancelAura.SpellID, cancelAura.CasterGUID, 0, AuraRemoveMode.Cancel);
} }