aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp16
-rw-r--r--src/server/game/Battlegrounds/Battleground.h6
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.cpp10
-rw-r--r--src/server/game/Entities/Player/Player.cpp19
-rw-r--r--src/server/game/Entities/Player/Player.h5
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp4
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h6
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h6
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp13
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h1
-rw-r--r--src/server/game/Spells/SpellMgr.cpp17
11 files changed, 97 insertions, 6 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 5d18797a419..1f7a3ce187c 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -675,6 +675,9 @@ void Battleground::RewardReputationToTeam(uint32 faction_id, uint32 Reputation,
if (!player)
continue;
+ if (player->GetNativeTeam() != TeamID)
+ continue;
+
uint32 repGain = Reputation;
AddPct(repGain, player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN));
AddPct(repGain, player->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, faction_id));
@@ -898,6 +901,8 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
player->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT);
player->RemoveAurasByType(SPELL_AURA_MOUNTED);
+ player->RemoveAurasByType(SPELL_AURA_SWITCH_TEAM);
+ player->RemoveAurasByType(SPELL_AURA_MOD_FACTION);
if (!player->IsAlive()) // resurrect on exit
{
@@ -1118,6 +1123,17 @@ void Battleground::AddPlayer(Player* player)
startTimer.TotalTime = countdownMaxForBGType;
player->SendDirectMessage(startTimer.Write());
}
+
+ if (player->HasAura(SPELL_MERCENARY_CONTRACT_HORDE))
+ {
+ player->CastSpell(player, SPELL_MERCENARY_HORDE_1, true);
+ player->CastSpell(player, SPELL_MERCENARY_HORDE_2, true);
+ }
+ else if (player->HasAura(SPELL_MERCENARY_CONTRACT_ALLIANCE))
+ {
+ player->CastSpell(player, SPELL_MERCENARY_ALLIANCE_1, true);
+ player->CastSpell(player, SPELL_MERCENARY_ALLIANCE_2, true);
+ }
}
// reset all map criterias on map enter
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index 119ce60e7d2..de1f632a145 100644
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -119,7 +119,11 @@ enum BattlegroundSpells
SPELL_RECENTLY_DROPPED_FLAG = 42792, // Recently Dropped Flag
SPELL_AURA_PLAYER_INACTIVE = 43681, // Inactive
SPELL_HONORABLE_DEFENDER_25Y = 68652, // +50% honor when standing at a capture point that you control, 25yards radius (added in 3.2)
- SPELL_HONORABLE_DEFENDER_60Y = 66157 // +50% honor when standing at a capture point that you control, 60yards radius (added in 3.2), probably for 40+ player battlegrounds
+ SPELL_HONORABLE_DEFENDER_60Y = 66157, // +50% honor when standing at a capture point that you control, 60yards radius (added in 3.2), probably for 40+ player battlegrounds
+ SPELL_MERCENARY_HORDE_1 = 193864,
+ SPELL_MERCENARY_HORDE_2 = 195838,
+ SPELL_MERCENARY_ALLIANCE_1 = 193863,
+ SPELL_MERCENARY_ALLIANCE_2 = 195843,
};
enum BattlegroundTimeIntervals
diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
index 9832628fe04..10b10f805ee 100644
--- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
@@ -140,7 +140,7 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, PVPDiffi
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;
@@ -179,6 +179,14 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, PVPDiffi
pl_info.GroupInfo = ginfo;
// add the pinfo to ginfo's list
ginfo->Players[member->GetGUID()] = &pl_info;
+
+ if (ginfo->Team != member->GetTeam())
+ {
+ if (member->GetTeam() == ALLIANCE)
+ member->CastSpell(member, SPELL_MERCENARY_CONTRACT_HORDE);
+ else
+ member->CastSpell(member, SPELL_MERCENARY_CONTRACT_ALLIANCE);
+ }
}
}
else
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index f649e5169b1..032298b4bd9 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6285,6 +6285,25 @@ TeamId Player::TeamIdForRace(uint8 race)
return TEAM_NEUTRAL;
}
+void Player::SwitchToOppositeTeam(bool apply)
+{
+ m_team = GetNativeTeam();
+
+ if (apply)
+ m_team = (m_team == ALLIANCE) ? HORDE : ALLIANCE;
+}
+
+uint32 Player::GetBgQueueTeam() const
+{
+ if (HasAura(SPELL_MERCENARY_CONTRACT_HORDE))
+ return HORDE;
+
+ if (HasAura(SPELL_MERCENARY_CONTRACT_ALLIANCE))
+ return ALLIANCE;
+
+ return GetTeam();
+}
+
void Player::SetFactionForRace(uint8 race)
{
m_team = TeamForRace(race);
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 12477542e99..c4074cbb44e 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2210,9 +2210,14 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
static uint32 TeamForRace(uint8 race);
static TeamId TeamIdForRace(uint8 race);
uint32 GetTeam() const { return m_team; }
+ void SwitchToOppositeTeam(bool apply);
+ uint32 GetBgQueueTeam() const;
TeamId GetTeamId() const { return m_team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; }
void SetFactionForRace(uint8 race);
+ uint32 GetNativeTeam() const { return TeamForRace(GetRace()); }
+ TeamId GetNativeTeamId() const { return TeamIdForRace(GetRace()); }
+
void InitDisplayIds();
bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const;
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index daa1cda6c88..d0d32a0149b 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -398,6 +398,10 @@ void WorldSession::HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& canc
if (!spellInfo->IsPositive() || spellInfo->IsPassive())
return;
+ if (spellInfo->Id == SPELL_MERCENARY_CONTRACT_HORDE || spellInfo->Id == SPELL_MERCENARY_CONTRACT_ALLIANCE)
+ if (_player->InBattlegroundQueue())
+ return;
+
_player->RemoveOwnedAura(cancelAura.SpellID, cancelAura.CasterGUID, 0, AURA_REMOVE_BY_CANCEL);
}
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 8ddb0a46f84..534d2ec11d8 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -7837,4 +7837,10 @@ enum WorldState : uint32
WS_GUILD_WEEKLY_RESET_TIME = 20050, // Next guild week reset time
};
+enum SpecialSpells : uint32
+{
+ SPELL_MERCENARY_CONTRACT_HORDE = 193472,
+ SPELL_MERCENARY_CONTRACT_ALLIANCE = 193475,
+};
+
#endif
diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index 90c3f3ebc45..7ec70366e36 100644
--- a/src/server/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
@@ -580,9 +580,9 @@ enum AuraType : uint32
SPELL_AURA_486 = 486,
SPELL_AURA_COSMETIC_MOUNTED = 487,
SPELL_AURA_488 = 488,
- SPELL_AURA_MOD_ALTERNATIVE_DEFAULT_LANGUAGE = 489,
- SPELL_AURA_490 = 490,
- SPELL_AURA_491 = 491,
+ SPELL_AURA_MOD_ALTERNATIVE_DEFAULT_LANGUAGE = 489, // NYI
+ SPELL_AURA_SWITCH_TEAM = 490,
+ SPELL_AURA_491 = 491, // NYI
SPELL_AURA_492 = 492,
SPELL_AURA_493 = 493, // 1 spell, 267116 - Animal Companion (modifies Call Pet)
SPELL_AURA_SET_POWER_POINT_CHARGE = 494, // NYI
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 51bcda8d306..c0e88613e1c 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -556,7 +556,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleCosmeticMounted, //487 SPELL_AURA_COSMETIC_MOUNTED
&AuraEffect::HandleNULL, //488
&AuraEffect::HandleNULL, //489 SPELL_AURA_MOD_ALTERNATIVE_DEFAULT_LANGUAGE
- &AuraEffect::HandleNULL, //490
+ &AuraEffect::HandleSwitchTeam, //490 SPELL_AURA_SWITCH_TEAM
&AuraEffect::HandleNULL, //491
&AuraEffect::HandleNULL, //492
&AuraEffect::HandleNULL, //493
@@ -6011,6 +6011,17 @@ void AuraEffect::HandleLinkedSummon(AuraApplication const* aurApp, uint8 mode, b
}
}
+void AuraEffect::HandleSwitchTeam(AuraApplication const* aurApp, uint8 mode, bool apply) const
+{
+ if (!(mode & AURA_EFFECT_HANDLE_REAL))
+ return;
+
+ Unit* target = aurApp->GetTarget();
+
+ if (Player* player = target->ToPlayer())
+ player->SwitchToOppositeTeam(apply);
+}
+
void AuraEffect::HandleSetFFAPvP(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const
{
if (!(mode & AURA_EFFECT_HANDLE_REAL))
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h
index 8ed3ef13e41..0ba6283c94b 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.h
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.h
@@ -317,6 +317,7 @@ class TC_GAME_API AuraEffect
void HandlePlayScene(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleCreateAreaTrigger(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleLinkedSummon(AuraApplication const* aurApp, uint8 mode, bool apply) const;
+ void HandleSwitchTeam(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleSetFFAPvP(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleModOverrideZonePVPType(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleBattlegroundPlayerPosition(AuraApplication const* aurApp, uint8 mode, bool apply) const;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 55fd950d129..c6d34d035ec 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -4658,6 +4658,23 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Attributes |= SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY;
});
+ // Horde / Alliance switch (BG mercenary system)
+ ApplySpellFix({ 195838, 195843 }, [](SpellInfo* spellInfo)
+ {
+ ApplySpellEffectFix(spellInfo, EFFECT_0, [](SpellEffectInfo* spellEffectInfo)
+ {
+ spellEffectInfo->Effect = SPELL_EFFECT_APPLY_AURA;
+ });
+ ApplySpellEffectFix(spellInfo, EFFECT_1, [](SpellEffectInfo* spellEffectInfo)
+ {
+ spellEffectInfo->Effect = SPELL_EFFECT_APPLY_AURA;
+ });
+ ApplySpellEffectFix(spellInfo, EFFECT_2, [](SpellEffectInfo* spellEffectInfo)
+ {
+ spellEffectInfo->Effect = SPELL_EFFECT_APPLY_AURA;
+ });
+ });
+
for (SpellInfo const& s : mSpellInfoMap)
{
SpellInfo* spellInfo = &const_cast<SpellInfo&>(s);