aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp26
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp52
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp31
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)
{