aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Unit
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2024-03-30 20:21:28 +0100
committerGitHub <noreply@github.com>2024-03-30 20:21:28 +0100
commitdef601b4ff82ec8a90af60408a87cac92fdf070d (patch)
tree4e5de744a4712a49b1126b8270ac02d842d56e32 /src/server/game/Entities/Unit
parentd8a82ab909543259be7632bb1e1b256ed6bfa4c2 (diff)
Core/Creatures: Changed the spawn health field in creature table to a percentage (#29801)
Diffstat (limited to 'src/server/game/Entities/Unit')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp64
-rw-r--r--src/server/game/Entities/Unit/Unit.h3
2 files changed, 46 insertions, 21 deletions
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();