From befb919676d2b36b16e6cc1565b9bd9a714fc97c Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Wed, 14 Nov 2018 02:37:49 +0100 Subject: [PATCH] Core/Reputation: updated Championing to Cataclysm --- src/server/game/Entities/Player/Player.cpp | 72 +++++++++++++++---- src/server/game/Entities/Player/Player.h | 2 + .../game/Spells/Auras/SpellAuraEffects.cpp | 36 ++++++++++ 3 files changed, 96 insertions(+), 14 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index cda85e10817..2d7f7d640ed 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6655,33 +6655,61 @@ void Player::RewardOnKill(Unit* victim, float rate) // support for: Championing - http://www.wowwiki.com/Championing Map const* map = GetMap(); if (map->IsNonRaidDungeon()) + { if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficulty())) - if (dungeon->reclevel == GetMaxLevelForExpansion(dungeon->expansion)) - ChampioningFaction = GetChampioningFaction(); + { + // WotLK and Cataclysm dungeons only grant championing reputation when in max level dungeons of their corresponding expansion + if (dungeon->reclevel == GetMaxLevelForExpansion(dungeon->expansion) && GetExpansionForChampioningFaction()) + { + if (GetExpansionForChampioningFaction() == dungeon->expansion) + ChampioningFaction = GetChampioningFaction(); + } + else + { + // Classic Tabards (Alliance and Horde capital reputation) always convert the gained reputation + if (!GetExpansionForChampioningFaction()) + ChampioningFaction = GetChampioningFaction(); + } + } + } } uint32 team = GetTeam(); if (Rew->RepFaction1 && (!Rew->TeamDependent || team == ALLIANCE)) { - int32 donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->getLevel(), Rew->RepValue1, ChampioningFaction ? ChampioningFaction : Rew->RepFaction1); - donerep1 = int32(donerep1 * rate); + if (FactionEntry const* rewFactionEntry1 = sFactionStore.LookupEntry(Rew->RepFaction1)) + { + uint32 factionId1 = ChampioningFaction ? ChampioningFaction : Rew->RepFaction1; + if (rewFactionEntry1->GroupExpansion && !ChampioningFaction) + factionId1 = 0; - FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rew->RepFaction1); - uint32 current_reputation_rank1 = GetReputationMgr().GetRank(factionEntry1); - if (factionEntry1) - GetReputationMgr().ModifyReputation(factionEntry1, donerep1, current_reputation_rank1 > Rew->ReputationMaxCap1); + int32 donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->getLevel(), Rew->RepValue1, factionId1); + donerep1 = int32(donerep1 * rate); + + FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(factionId1); + uint32 current_reputation_rank1 = GetReputationMgr().GetRank(factionEntry1); + if (factionEntry1) + GetReputationMgr().ModifyReputation(factionEntry1, donerep1, current_reputation_rank1 > Rew->ReputationMaxCap1); + } } if (Rew->RepFaction2 && (!Rew->TeamDependent || team == HORDE)) { - int32 donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->getLevel(), Rew->RepValue2, ChampioningFaction ? ChampioningFaction : Rew->RepFaction2); - donerep2 = int32(donerep2 * rate); + if (FactionEntry const* rewFactionEntry2 = sFactionStore.LookupEntry(Rew->RepFaction2)) + { + uint32 factionId2 = ChampioningFaction ? ChampioningFaction : Rew->RepFaction2; + if (rewFactionEntry2->GroupExpansion && !ChampioningFaction) + factionId2 = 0; - FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rew->RepFaction2); - uint32 current_reputation_rank2 = GetReputationMgr().GetRank(factionEntry2); - if (factionEntry2) - GetReputationMgr().ModifyReputation(factionEntry2, donerep2, current_reputation_rank2 > Rew->ReputationMaxCap2); + int32 donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->getLevel(), Rew->RepValue2, factionId2); + donerep2 = int32(donerep2 * rate); + + FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(factionId2); + uint32 current_reputation_rank2 = GetReputationMgr().GetRank(factionEntry2); + if (factionEntry2) + GetReputationMgr().ModifyReputation(factionEntry2, donerep2, current_reputation_rank2 > Rew->ReputationMaxCap2); + } } if (Rew->CurrencyId1 && Rew->CurrencyCount1) @@ -26539,6 +26567,22 @@ bool Player::CanSeeSpellClickOn(Creature const* c) const return false; } +uint8 Player::GetExpansionForChampioningFaction() const +{ + if (!m_ChampioningFaction) + return 0; + + FactionEntry const* faction = sFactionStore.LookupEntry(m_ChampioningFaction); + if (!faction || !faction->team) + return 0; + + FactionEntry const* expansionFaction = sFactionStore.LookupEntry(faction->team); + if (!expansionFaction) + return 0; + + return expansionFaction->GroupExpansion; +} + void Player::BuildPlayerTalentsInfoData(WorldPacket* data) { *data << uint32(GetFreeTalentPoints()); // unspentTalentPoints diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 72dfd658c0a..8cff7c79ac9 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2324,6 +2324,8 @@ class TC_GAME_API Player : public Unit, public GridObject uint32 GetChampioningFaction() const { return m_ChampioningFaction; } void SetChampioningFaction(uint32 faction) { m_ChampioningFaction = faction; } + uint8 GetExpansionForChampioningFaction() const; + Spell* m_spellModTakingSpell; float GetAverageItemLevel() const; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index cfc7f99ba9d..c31e6ed3f49 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -4579,6 +4579,24 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool case 57820: // Ebon Champion case 57821: // Champion of the Kirin Tor case 57822: // Wyrmrest Champion + case 93337: // Ramkahen + case 93339: // Earthen Ring + case 93341: // Hyjal + case 93347: // Therazane + case 93368: // Wildhammer Clan + case 94158: // Dragonmaw Clan + case 93827: // Darkspear Champion + case 93830: // Bilgewater Champion + case 94462: // Undercity Champion + case 94463: // Thunder Bluff Champion + case 93828: // Silvermoon Champion + case 93825: // Orgrimmar Champion + case 93821: // Gnomeregan Champion + case 93816: // Gilneas Champion + case 93806: // Darnassus Champion + case 93811: // Exodar Champion + case 93805: // Ironforge Champion + case 93795: // Sturmwind Champion { if (!caster || caster->GetTypeId() != TYPEID_PLAYER) break; @@ -4593,6 +4611,24 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool case 57820: FactionID = 1098; break; // Knights of the Ebon Blade case 57821: FactionID = 1090; break; // Kirin Tor case 57822: FactionID = 1091; break; // The Wyrmrest Accord + case 93337: FactionID = 1173; break; // Ramkahen + case 93339: FactionID = 1135; break; // Earthen Ring + case 93341: FactionID = 1158; break; // Hyjal + case 93347: FactionID = 1171; break; // Therazane + case 93368: FactionID = 1174; break; // Wildhammer Clan + case 94158: FactionID = 1172; break; // Dragonmaw Clan + case 93827: FactionID = 530; break; // Darkspear Champion + case 93830: FactionID = 1133; break; // Bilgewater Champion + case 94462: FactionID = 68; break; // Undercity Champion + case 94463: FactionID = 81; break; // Thunder Bluff Champion + case 93828: FactionID = 911; break; // Silvermoon Champion + case 93825: FactionID = 76; break; // Orgrimmar Champion + case 93821: FactionID = 54; break; // Gnomeregan Champion + case 93816: FactionID = 1134; break; // Gilneas Champion + case 93806: FactionID = 69; break; // Darnassus Champion + case 93811: FactionID = 930; break; // Exodar Champion + case 93805: FactionID = 47; break; // Ironforge Champion + case 93795: FactionID = 72; break; // Sturmwind Champion } } caster->ToPlayer()->SetChampioningFaction(FactionID);