diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 52 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 31 |
5 files changed, 61 insertions, 53 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d3a629d6850..e8650013beb 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17595,6 +17595,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(getClass(), GetActiveTalentGroup())) SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, spec->ID); + UpdateDisplayPower(); _LoadTalents(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS)); _LoadSpells(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS)); GetSession()->GetCollectionMgr()->LoadToys(); @@ -21700,29 +21701,7 @@ void Player::InitDataForForm(bool reapplyMods) else SetRegularAttackTime(); - switch (form) - { - case FORM_GHOUL: - case FORM_CAT_FORM: - { - if (getPowerType() != POWER_ENERGY) - setPowerType(POWER_ENERGY); - break; - } - case FORM_BEAR_FORM: - { - if (getPowerType() != POWER_RAGE) - setPowerType(POWER_RAGE); - break; - } - default: // 0, for example - { - ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(getClass()); - if (cEntry && cEntry->PowerType < MAX_POWERS && uint32(getPowerType()) != cEntry->PowerType) - setPowerType(Powers(cEntry->PowerType)); - break; - } - } + UpdateDisplayPower(); // update auras at form change, ignore this at mods reapply (.reset stats/etc) when form not change. if (!reapplyMods) @@ -26090,6 +26069,7 @@ void Player::ActivateTalentGroup(ChrSpecializationEntry const* spec) SendActionButtons(1); + UpdateDisplayPower(); Powers pw = getPowerType(); if (pw != POWER_MANA) SetPower(POWER_MANA, 0); // Mana must be 0 even if it isn't the active power type. diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 2ebfd4fb2c8..caad21e8148 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -150,7 +150,9 @@ enum TalentSpecialization // talent tabs TALENT_SPEC_WARLOCK_DESTRUCTION = 267, TALENT_SPEC_MONK_BREWMASTER = 268, TALENT_SPEC_MONK_BATTLEDANCER = 269, - TALENT_SPEC_MONK_MISTWEAVER = 270 + TALENT_SPEC_MONK_MISTWEAVER = 270, + TALENT_SPEC_DEMON_HUNTER_HAVOC = 577, + TALENT_SPEC_DEMON_HUNTER_VENGEANCE = 581 }; enum SpecResetType diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 85ff46df66b..bff0123aa87 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6675,6 +6675,58 @@ void Unit::setPowerType(Powers new_powertype) } } +void Unit::UpdateDisplayPower() +{ + Powers displayPower = POWER_MANA; + switch (GetShapeshiftForm()) + { + case FORM_GHOUL: + case FORM_CAT_FORM: + displayPower = POWER_ENERGY; + break; + case FORM_BEAR_FORM: + displayPower = POWER_RAGE; + break; + case FORM_TRAVEL_FORM: + case FORM_GHOST_WOLF: + displayPower = POWER_MANA; + break; + default: + { + ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(getClass()); + if (cEntry && cEntry->PowerType < MAX_POWERS) + displayPower = Powers(cEntry->PowerType); + if (GetTypeId() == TYPEID_PLAYER) + { + switch (GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)) + { + case TALENT_SPEC_PRIEST_SHADOW: + displayPower = POWER_INSANITY; + break; + case TALENT_SPEC_SHAMAN_ELEMENTAL: + case TALENT_SPEC_SHAMAN_ENHANCEMENT: + displayPower = POWER_MAELSTROM; + break; + case TALENT_SPEC_MONK_MISTWEAVER: + displayPower = POWER_MANA; + break; + case TALENT_SPEC_DRUID_BALANCE: + displayPower = POWER_LUNAR_POWER; // only balance druids get lunar power, even if other specs have access to moonkin form + break; + case TALENT_SPEC_DEMON_HUNTER_VENGEANCE: + displayPower = POWER_PAIN; + break; + default: + break; + } + } + break; + } + } + + setPowerType(displayPower); +} + FactionTemplateEntry const* Unit::GetFactionTemplateEntry() const { FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(getFaction()); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f5c5e20429f..c61a8bc3c04 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1469,6 +1469,7 @@ class TC_GAME_API Unit : public WorldObject Powers getPowerType() const { return Powers(GetUInt32Value(UNIT_FIELD_DISPLAY_POWER)); } void setPowerType(Powers power); + void UpdateDisplayPower(); int32 GetPower(Powers power) const; int32 GetMinPower(Powers power) const { return power == POWER_LUNAR_POWER ? -100 : 0; } int32 GetMaxPower(Powers power) const; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 93d868aaf37..ea1a064461e 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1822,34 +1822,6 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo if (aurApp->GetRemoveMode()) return; - if (PowerType != POWER_MANA) - { - int32 oldPower = target->GetPower(PowerType); - // reset power to default values only at power change - if (target->getPowerType() != PowerType) - target->setPowerType(PowerType); - - if (form == FORM_CAT_FORM || form == FORM_BEAR_FORM) - { - // get furor proc chance - int32 FurorChance = 0; - if (AuraEffect const* dummy = target->GetDummyAuraEffect(SPELLFAMILY_DRUID, 238, 0)) - FurorChance = std::max(dummy->GetAmount(), 0); - - if (form == FORM_CAT_FORM) - { - int32 basePoints = std::min<int32>(oldPower, FurorChance); - target->SetPower(POWER_ENERGY, 0); - target->CastCustomSpell(target, 17099, &basePoints, NULL, NULL, true, NULL, this); - } - else if (roll_chance_i(FurorChance)) - target->CastSpell(target, 17057, true); - } - } - // stop handling the effect if it was removed by linked event - if (aurApp->GetRemoveMode()) - return; - target->SetShapeshiftForm(form); if (modelid > 0) { @@ -1867,7 +1839,6 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo target->SetShapeshiftForm(FORM_NONE); if (target->getClass() == CLASS_DRUID) { - target->setPowerType(POWER_MANA); // Remove movement impairing effects also when shifting out target->RemoveMovementImpairingAuras(); } @@ -1923,6 +1894,8 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo if (target->GetTypeId() == TYPEID_PLAYER) target->ToPlayer()->InitDataForForm(); + else + target->UpdateDisplayPower(); if (target->getClass() == CLASS_DRUID) { |