Skip to content

Commit 2f0ea30

Browse files
authored
Merge pull request #9814 from Frankie-hz/fixnmhp
[cpp] Fix NM hp in mob groups not working
2 parents 4b913a0 + 880a1b2 commit 2f0ea30

1 file changed

Lines changed: 37 additions & 28 deletions

File tree

src/map/utils/mobutils.cpp

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -712,36 +712,43 @@ void CalculateMobStats(CMobEntity* PMob, bool recover)
712712

713713
if (recover == true)
714714
{
715-
// HP Calculations
716-
mJobGrade = grade::GetJobGrade(mJob, 0);
717-
sJobGrade = grade::GetJobGrade(sJob, 0);
718-
719-
// 1. Retrieve HP scaling values from job grades
720-
// Index 0: Base HP
721-
// Index 1: Job scaling
722-
// Index 2: Modifier scale
723-
uint8 BaseHP = grade::GetMobHPScale(mJobGrade, 0);
724-
uint8 JobScale = grade::GetMobHPScale(mJobGrade, 1);
725-
uint8 ScaleXHP = grade::GetMobHPScale(mJobGrade, 2);
726-
uint8 sjJobScale = grade::GetMobHPScale(sJobGrade, 1);
727-
uint8 sjScaleXHP = grade::GetMobHPScale(sJobGrade, 2);
728-
729-
// 2. Calculate base HP from main job
730-
uint32 baseMobHP = CalculateBaseMobHP(mLvl, BaseHP, JobScale, ScaleXHP);
731-
732-
// 3. Calculate subjob HP contribution scaled by level range
733-
uint32 sjHP = CalculateSubjobHP(mLvl, sjJobScale, sjScaleXHP);
734-
735-
// 4. Final mob HP before traits/family modifiers
736-
uint32 mobHP = baseMobHP + sjHP;
737-
738-
// 5. Apply pet multiplier (pets are 30% of base mob HP)
739-
if (PMob->PMaster != nullptr)
715+
if (PMob->HPmodifier == 0)
740716
{
741-
mobHP = (uint32)(mobHP * 0.30f);
742-
}
717+
// HP Calculations
718+
mJobGrade = grade::GetJobGrade(mJob, 0);
719+
sJobGrade = grade::GetJobGrade(sJob, 0);
720+
721+
// 1. Retrieve HP scaling values from job grades
722+
// Index 0: Base HP
723+
// Index 1: Job scaling
724+
// Index 2: Modifier scale
725+
uint8 BaseHP = grade::GetMobHPScale(mJobGrade, 0);
726+
uint8 JobScale = grade::GetMobHPScale(mJobGrade, 1);
727+
uint8 ScaleXHP = grade::GetMobHPScale(mJobGrade, 2);
728+
uint8 sjJobScale = grade::GetMobHPScale(sJobGrade, 1);
729+
uint8 sjScaleXHP = grade::GetMobHPScale(sJobGrade, 2);
730+
731+
// 2. Calculate base HP from main job
732+
uint32 baseMobHP = CalculateBaseMobHP(mLvl, BaseHP, JobScale, ScaleXHP);
733+
734+
// 3. Calculate subjob HP contribution scaled by level range
735+
uint32 sjHP = CalculateSubjobHP(mLvl, sjJobScale, sjScaleXHP);
736+
737+
// 4. Final mob HP before traits/family modifiers
738+
uint32 mobHP = baseMobHP + sjHP;
739+
740+
// 5. Apply pet multiplier (pets are 30% of base mob HP)
741+
if (PMob->PMaster != nullptr)
742+
{
743+
mobHP = (uint32)(mobHP * 0.30f);
744+
}
743745

744-
PMob->health.maxhp = (int16)(mobHP);
746+
PMob->health.maxhp = (int16)(mobHP);
747+
}
748+
else
749+
{
750+
PMob->health.maxhp = PMob->HPmodifier;
751+
}
745752

746753
// Apply NM/Mob HP multiplier from settings
747754
if (isNM)
@@ -1732,6 +1739,7 @@ auto InstantiateAlly(uint32 groupid, uint16 zoneID, CInstance* instance) -> CMob
17321739
PMob->m_SpawnType = rset->get<SPAWNTYPE>("spawntype");
17331740
PMob->m_DropID = rset->get<uint32>("dropid");
17341741

1742+
PMob->HPmodifier = rset->get<uint32>("HP");
17351743
PMob->MPmodifier = rset->get<uint32>("MP");
17361744

17371745
PMob->m_minLevel = rset->get<uint8>("minLevel");
@@ -1904,6 +1912,7 @@ auto InstantiateDynamicMob(uint32 groupid, uint16 groupZoneId, uint16 targetZone
19041912
PMob->m_SpawnType = rset->get<SPAWNTYPE>("spawntype");
19051913
PMob->m_DropID = rset->get<uint32>("dropid");
19061914

1915+
PMob->HPmodifier = rset->get<uint32>("HP");
19071916
PMob->MPmodifier = rset->get<uint32>("MP");
19081917

19091918
uint16 sqlModelID[10];

0 commit comments

Comments
 (0)