diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.h | 6 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundQueue.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 5 | ||||
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 6 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 6 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 17 |
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); |