@@ -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