Skip to content

Commit bf79d5d

Browse files
authored
fix: health scaling for <100%hp mobs and UNIT_MOD_HEALTH changes (#52)
1 parent 8277c8f commit bf79d5d

File tree

1 file changed

+18
-16
lines changed

1 file changed

+18
-16
lines changed

src/mod_zone_difficulty_scripts.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class mod_zone_difficulty_unitscript : public UnitScript
8686
{
8787
if (sZoneDifficulty->SpellNerfOverrides[spellInfo->Id].find(mapId) != sZoneDifficulty->SpellNerfOverrides[spellInfo->Id].end())
8888
{
89-
// Check if the mode of instance and SpellNerfOverride match
89+
// Check if the mode of instance and SpellNerfOverride match
9090
if (sZoneDifficulty->OverrideModeMatches(target->GetMap()->GetInstanceId(), spellInfo->Id, mapId))
9191
absorb = eff->GetAmount() * sZoneDifficulty->SpellNerfOverrides[spellInfo->Id][mapId].NerfPct;
9292
}
@@ -1084,7 +1084,7 @@ class mod_zone_difficulty_allcreaturescript : public AllCreatureScript
10841084

10851085
CreatureBaseStats const* origCreatureStats = sObjectMgr->GetCreatureBaseStats(creature->GetLevel(), creatureTemplate->unit_class);
10861086
uint32 baseHealth = origCreatureStats->GenerateHealth(creatureTemplate);
1087-
uint32 newHp = baseHealth;
1087+
uint32 scaledBaseHealth = baseHealth;
10881088
uint32 entry = creature->GetEntry();
10891089

10901090
uint32 phaseMask = creature->GetPhaseMask();
@@ -1095,7 +1095,7 @@ class mod_zone_difficulty_allcreaturescript : public AllCreatureScript
10951095
{
10961096
// Trash mobs. Apply generic tuning.
10971097
if (!creature->IsDungeonBoss() && isMythic)
1098-
newHp = round(baseHealth * sZoneDifficulty->MythicmodeHpModifier);
1098+
scaledBaseHealth = round(baseHealth * sZoneDifficulty->MythicmodeHpModifier);
10991099
}
11001100
else
11011101
{
@@ -1105,25 +1105,27 @@ class mod_zone_difficulty_allcreaturescript : public AllCreatureScript
11051105
if (!multiplier)
11061106
multiplier = 1.0f; // never 0
11071107

1108-
newHp = round(baseHealth * multiplier);
1108+
scaledBaseHealth = round(baseHealth * multiplier);
11091109
}
11101110

11111111
if (matchingPhase != -1)
11121112
{
1113-
if (creature->GetMaxHealth() == newHp)
1114-
return;
1115-
1116-
bool hpIsFull = false;
1113+
float scaledHealth = scaledBaseHealth;
1114+
scaledHealth *= creature->GetModifierValue(UNIT_MOD_HEALTH, BASE_PCT);
1115+
scaledHealth += creature->GetModifierValue(UNIT_MOD_HEALTH, TOTAL_VALUE);
1116+
scaledHealth *= creature->GetModifierValue(UNIT_MOD_HEALTH, TOTAL_PCT);
11171117

1118-
if (creature->GetHealthPct() >= 100)
1119-
hpIsFull = true;
1118+
if (creature->GetMaxHealth() == scaledHealth)
1119+
return;
11201120

1121-
creature->SetMaxHealth(newHp);
1122-
creature->SetCreateHealth(newHp);
1123-
creature->SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, (float)newHp);
1124-
if (hpIsFull)
1125-
creature->SetHealth(newHp);
1126-
creature->UpdateAllStats();
1121+
float percent = creature->GetHealthPct();
1122+
creature->SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, (float)scaledBaseHealth);
1123+
creature->UpdateMaxHealth();
1124+
if (creature->IsAlive())
1125+
{
1126+
uint32 scaledCurHealth = creature->CountPctFromMaxHealth(percent);
1127+
creature->SetHealth(scaledCurHealth);
1128+
}
11271129
creature->ResetPlayerDamageReq();
11281130
}
11291131
}

0 commit comments

Comments
 (0)