From 880a1b23d68d8d470cc14cb32c75ad3794b5465f Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 17 Apr 2026 20:12:55 -0400 Subject: [PATCH] [cpp] Fix NM hp in mob groups not working --- src/map/utils/mobutils.cpp | 65 ++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/src/map/utils/mobutils.cpp b/src/map/utils/mobutils.cpp index c31bf07987a..ee9178e32dd 100644 --- a/src/map/utils/mobutils.cpp +++ b/src/map/utils/mobutils.cpp @@ -712,36 +712,43 @@ void CalculateMobStats(CMobEntity* PMob, bool recover) if (recover == true) { - // HP Calculations - mJobGrade = grade::GetJobGrade(mJob, 0); - sJobGrade = grade::GetJobGrade(sJob, 0); - - // 1. Retrieve HP scaling values from job grades - // Index 0: Base HP - // Index 1: Job scaling - // Index 2: Modifier scale - uint8 BaseHP = grade::GetMobHPScale(mJobGrade, 0); - uint8 JobScale = grade::GetMobHPScale(mJobGrade, 1); - uint8 ScaleXHP = grade::GetMobHPScale(mJobGrade, 2); - uint8 sjJobScale = grade::GetMobHPScale(sJobGrade, 1); - uint8 sjScaleXHP = grade::GetMobHPScale(sJobGrade, 2); - - // 2. Calculate base HP from main job - uint32 baseMobHP = CalculateBaseMobHP(mLvl, BaseHP, JobScale, ScaleXHP); - - // 3. Calculate subjob HP contribution scaled by level range - uint32 sjHP = CalculateSubjobHP(mLvl, sjJobScale, sjScaleXHP); - - // 4. Final mob HP before traits/family modifiers - uint32 mobHP = baseMobHP + sjHP; - - // 5. Apply pet multiplier (pets are 30% of base mob HP) - if (PMob->PMaster != nullptr) + if (PMob->HPmodifier == 0) { - mobHP = (uint32)(mobHP * 0.30f); - } + // HP Calculations + mJobGrade = grade::GetJobGrade(mJob, 0); + sJobGrade = grade::GetJobGrade(sJob, 0); + + // 1. Retrieve HP scaling values from job grades + // Index 0: Base HP + // Index 1: Job scaling + // Index 2: Modifier scale + uint8 BaseHP = grade::GetMobHPScale(mJobGrade, 0); + uint8 JobScale = grade::GetMobHPScale(mJobGrade, 1); + uint8 ScaleXHP = grade::GetMobHPScale(mJobGrade, 2); + uint8 sjJobScale = grade::GetMobHPScale(sJobGrade, 1); + uint8 sjScaleXHP = grade::GetMobHPScale(sJobGrade, 2); + + // 2. Calculate base HP from main job + uint32 baseMobHP = CalculateBaseMobHP(mLvl, BaseHP, JobScale, ScaleXHP); + + // 3. Calculate subjob HP contribution scaled by level range + uint32 sjHP = CalculateSubjobHP(mLvl, sjJobScale, sjScaleXHP); + + // 4. Final mob HP before traits/family modifiers + uint32 mobHP = baseMobHP + sjHP; + + // 5. Apply pet multiplier (pets are 30% of base mob HP) + if (PMob->PMaster != nullptr) + { + mobHP = (uint32)(mobHP * 0.30f); + } - PMob->health.maxhp = (int16)(mobHP); + PMob->health.maxhp = (int16)(mobHP); + } + else + { + PMob->health.maxhp = PMob->HPmodifier; + } // Apply NM/Mob HP multiplier from settings if (isNM) @@ -1732,6 +1739,7 @@ auto InstantiateAlly(uint32 groupid, uint16 zoneID, CInstance* instance) -> CMob PMob->m_SpawnType = rset->get("spawntype"); PMob->m_DropID = rset->get("dropid"); + PMob->HPmodifier = rset->get("HP"); PMob->MPmodifier = rset->get("MP"); PMob->m_minLevel = rset->get("minLevel"); @@ -1904,6 +1912,7 @@ auto InstantiateDynamicMob(uint32 groupid, uint16 groupZoneId, uint16 targetZone PMob->m_SpawnType = rset->get("spawntype"); PMob->m_DropID = rset->get("dropid"); + PMob->HPmodifier = rset->get("HP"); PMob->MPmodifier = rset->get("MP"); uint16 sqlModelID[10];