diff --git a/Source/Framework/Constants/BattleGroundsConst.cs b/Source/Framework/Constants/BattleGroundsConst.cs index 07bc9f1a9..460309122 100644 --- a/Source/Framework/Constants/BattleGroundsConst.cs +++ b/Source/Framework/Constants/BattleGroundsConst.cs @@ -88,6 +88,10 @@ namespace Framework.Constants public const uint SpellAuraPlayerInactive = 43681; // Inactive 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 SpellMercenaryHorde1 = 193864; + public const uint SpellMercenaryHorde2 = 195838; + public const uint SpellMercenaryAlliance1 = 193863; + public const uint SpellMercenaryAlliance2 = 195843; } public enum BattlegroundEventFlags diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index ba33b896a..6cb0de66e 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -77,6 +77,10 @@ namespace Framework.Constants //Warmode public const uint WarmodeEnlistedSpellOutside = 269083; + + //Mercenary System + public const uint SpellMercenaryContractHorde = 193472; + public const uint SpellMercenaryContractAlliance = 193475; } public struct MoneyConstants diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index 1f04dd62c..31be22538 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -510,8 +510,8 @@ namespace Framework.Constants Unk486 = 486, CosmeticMounted = 487, Unk488 = 488, - Unk489 = 489, - Unk490 = 490, + ModAlternativeDefaultLanguage = 489, // NYI + SwitchTeam = 490, Unk491 = 491, Unk492 = 492, Unk493 = 493, diff --git a/Source/Game/BattleGrounds/BattleGround.cs b/Source/Game/BattleGrounds/BattleGround.cs index 167fb8eb0..8e96c0a95 100644 --- a/Source/Game/BattleGrounds/BattleGround.cs +++ b/Source/Game/BattleGrounds/BattleGround.cs @@ -625,6 +625,9 @@ namespace Game.BattleGrounds if (!player) continue; + if (player.GetNativeTeam() != team) + continue; + uint repGain = Reputation; MathFunctions.AddPct(ref repGain, player.GetTotalAuraModifier(AuraType.ModReputationGain)); MathFunctions.AddPct(ref repGain, player.GetTotalAuraModifierByMiscValue(AuraType.ModFactionReputationGain, (int)faction_id)); @@ -850,6 +853,8 @@ namespace Game.BattleGrounds player.RemoveAurasByType(AuraType.ModShapeshift); player.RemoveAurasByType(AuraType.Mounted); + player.RemoveAurasByType(AuraType.SwitchTeam); + player.RemoveAurasByType(AuraType.ModFaction); if (!player.IsAlive()) // resurrect on exit { @@ -1065,6 +1070,17 @@ namespace Game.BattleGrounds player.SendPacket(timer); } + + if (player.HasAura(PlayerConst.SpellMercenaryContractHorde)) + { + player.CastSpell(player, BattlegroundConst.SpellMercenaryHorde1, true); + player.CastSpell(player, BattlegroundConst.SpellMercenaryHorde2, true); + } + else if (player.HasAura(PlayerConst.SpellMercenaryContractAlliance)) + { + player.CastSpell(player, BattlegroundConst.SpellMercenaryAlliance1, true); + player.CastSpell(player, BattlegroundConst.SpellMercenaryAlliance2, true); + } } // reset all map criterias on map enter diff --git a/Source/Game/BattleGrounds/BattleGroundQueue.cs b/Source/Game/BattleGrounds/BattleGroundQueue.cs index 1bcfe35a5..5632950f9 100644 --- a/Source/Game/BattleGrounds/BattleGroundQueue.cs +++ b/Source/Game/BattleGrounds/BattleGroundQueue.cs @@ -67,7 +67,7 @@ namespace Game.BattleGrounds ginfo.IsInvitedToBGInstanceGUID = 0; ginfo.JoinTime = GameTime.GetGameTimeMS(); ginfo.RemoveInviteTime = 0; - ginfo.Team = leader.GetTeam(); + ginfo.Team = leader.GetBgQueueTeam(); ginfo.ArenaTeamRating = ArenaRating; ginfo.ArenaMatchmakerRating = MatchmakerRating; ginfo.OpponentsTeamRating = 0; @@ -109,6 +109,14 @@ namespace Game.BattleGrounds m_QueuedPlayers[member.GetGUID()] = pl_info; // add the pinfo to ginfo's list 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 diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index e5ef4adc4..f36bff0d3 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -3515,6 +3515,29 @@ namespace Game.Entities uint GetChampioningFaction() { return m_ChampioningFaction; } public void SetChampioningFaction(uint faction) { m_ChampioningFaction = faction; } + + public void SwitchToOppositeTeam(bool apply) + { + m_team = GetNativeTeam(); + + if (apply) + 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 uint GetNativeTeamId() { return TeamIdForRace(GetRace()); } + public void SetFactionForRace(Race race) { m_team = TeamForRace(race); diff --git a/Source/Game/Handlers/SpellHandler.cs b/Source/Game/Handlers/SpellHandler.cs index 91693f1f7..a2dd8e179 100644 --- a/Source/Game/Handlers/SpellHandler.cs +++ b/Source/Game/Handlers/SpellHandler.cs @@ -403,6 +403,10 @@ namespace Game if (!spellInfo.IsPositive() || spellInfo.IsPassive()) return; + if (spellInfo.Id == PlayerConst.SpellMercenaryContractHorde || spellInfo.Id == PlayerConst.SpellMercenaryContractAlliance) + if (_player.InBattlegroundQueue()) + return; + GetPlayer().RemoveOwnedAura(cancelAura.SpellID, cancelAura.CasterGUID, 0, AuraRemoveMode.Cancel); } diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index 797862892..a94769e49 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -5736,6 +5736,17 @@ namespace Game.Spells } } + [AuraEffectHandler(AuraType.SwitchTeam)] + void HandleSwitchTeam(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply) + { + if (!mode.HasFlag(AuraEffectHandleModes.Real)) + return; + + Player player = aurApp.GetTarget().ToPlayer(); + if (player != null) + player.SwitchToOppositeTeam(apply); + } + [AuraEffectHandler(AuraType.SetFFAPvp)] void HandleSetFFAPvP(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply) { diff --git a/Source/Game/Spells/SpellManager.cs b/Source/Game/Spells/SpellManager.cs index 860ad669c..8dcbf833b 100644 --- a/Source/Game/Spells/SpellManager.cs +++ b/Source/Game/Spells/SpellManager.cs @@ -4338,6 +4338,23 @@ namespace Game.Entities spellInfo.Attributes |= SpellAttr0.UnaffectedByInvulnerability; }); + // Horde / Alliance switch (BG mercenary system) + ApplySpellFix(new[] { 195838, 195843 }, spellInfo => + { + ApplySpellEffectFix(spellInfo, 0, spellEffectInfo => + { + spellEffectInfo.Effect = SpellEffectName.ApplyAura; + }); + ApplySpellEffectFix(spellInfo, 1, spellEffectInfo => + { + spellEffectInfo.Effect = SpellEffectName.ApplyAura; + }); + ApplySpellEffectFix(spellInfo, 2, spellEffectInfo => + { + spellEffectInfo.Effect = SpellEffectName.ApplyAura; + }); + }); + foreach (var spellInfo in mSpellInfoMap.Values) { // Fix range for trajectory triggered spell