From def601b4ff82ec8a90af60408a87cac92fdf070d Mon Sep 17 00:00:00 2001 From: Meji Date: Sat, 30 Mar 2024 20:21:28 +0100 Subject: Core/Creatures: Changed the spawn health field in creature table to a percentage (#29801) --- src/server/game/Entities/Unit/Unit.cpp | 64 +++++++++++++++++++++++----------- src/server/game/Entities/Unit/Unit.h | 3 +- 2 files changed, 46 insertions(+), 21 deletions(-) (limited to 'src/server/game/Entities/Unit') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 42919533589..6bb4cd2a8cb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5531,12 +5531,43 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType SendAttackStateUpdate(&dmgInfo); } -void Unit::SetPowerType(Powers new_powertype, bool sendUpdate/* = true*/) +void Unit::SetPowerType(Powers power, bool sendUpdate/* = true*/, bool onInit /*= false*/) { - if (GetPowerType() == new_powertype) + if (!onInit && GetPowerType() == power) return; - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::DisplayPower), new_powertype); + PowerTypeEntry const* powerTypeEntry = sDB2Manager.GetPowerTypeEntry(power); + if (!powerTypeEntry) + return; + + if (IsCreature() && !powerTypeEntry->GetFlags().HasFlag(PowerTypeFlags::IsUsedByNPCs)) + return; + + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::DisplayPower), power); + + // Update max power + UpdateMaxPower(power); + + // Update current power + if (!onInit) + { + switch (power) + { + case POWER_MANA: // Keep the same (druid form switching...) + case POWER_ENERGY: + break; + case POWER_RAGE: // Reset to zero + SetPower(POWER_RAGE, 0); + break; + case POWER_FOCUS: // Make it full + SetFullPower(power); + break; + default: + break; + } + } + else + SetInitialPowerValue(power); if (!sendUpdate) return; @@ -5551,25 +5582,18 @@ void Unit::SetPowerType(Powers new_powertype, bool sendUpdate/* = true*/) if (pet->isControlled()) pet->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_POWER_TYPE); }*/ +} - // Update max power - UpdateMaxPower(new_powertype); +void Unit::SetInitialPowerValue(Powers powerType) +{ + PowerTypeEntry const* powerTypeEntry = sDB2Manager.GetPowerTypeEntry(powerType); + if (!powerTypeEntry) + return; - // Update current power - switch (new_powertype) - { - case POWER_MANA: // Keep the same (druid form switching...) - case POWER_ENERGY: - break; - case POWER_RAGE: // Reset to zero - SetPower(POWER_RAGE, 0); - break; - case POWER_FOCUS: // Make it full - SetFullPower(new_powertype); - break; - default: - break; - } + if (powerTypeEntry->GetFlags().HasFlag(PowerTypeFlags::UnitsUseDefaultPowerOnInit)) + SetPower(powerType, powerTypeEntry->DefaultPower); + else + SetFullPower(powerType); } Powers Unit::CalculateDisplayPowerType() const diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index abcf9c295b5..d2a69f57567 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -797,7 +797,8 @@ class TC_GAME_API Unit : public WorldObject virtual float GetArmorMultiplierForTarget(WorldObject const* /*target*/) const { return 1.0f; } Powers GetPowerType() const { return Powers(*m_unitData->DisplayPower); } - void SetPowerType(Powers power, bool sendUpdate = true); + void SetPowerType(Powers power, bool sendUpdate = true, bool onInit = false); + void SetInitialPowerValue(Powers powerType); void SetOverrideDisplayPowerId(uint32 powerDisplayId) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::OverrideDisplayPowerID), powerDisplayId); } Powers CalculateDisplayPowerType() const; void UpdateDisplayPower(); -- cgit v1.2.3