Ver código fonte

fix: Fixed HP/MP/CP not updating when receiving a MaxHp/MaxMP/MaxCp effect

The MaxHp/MaxMp/MaxCp effect are calling L2Character#addStatFunc which does not broadcast a status update packet.
Changed the method to private and added an overload for L2Character#addStatFuncs which handles packet broadcast.
Noe Caratini 3 anos atrás
pai
commit
e9e082072a

+ 7 - 6
src/main/java/com/l2jserver/gameserver/model/Elementals.java

@@ -19,6 +19,7 @@
 package com.l2jserver.gameserver.model;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -221,12 +222,12 @@ public final class Elementals {
 			}
 			
 			switch (_elementalType) {
-				case FIRE -> player.addStatFunc(new FuncAdd(isArmor ? Stats.FIRE_RES : Stats.FIRE_POWER, 0x40, this, _elementalValue, null));
-				case WATER -> player.addStatFunc(new FuncAdd(isArmor ? Stats.WATER_RES : Stats.WATER_POWER, 0x40, this, _elementalValue, null));
-				case WIND -> player.addStatFunc(new FuncAdd(isArmor ? Stats.WIND_RES : Stats.WIND_POWER, 0x40, this, _elementalValue, null));
-				case EARTH -> player.addStatFunc(new FuncAdd(isArmor ? Stats.EARTH_RES : Stats.EARTH_POWER, 0x40, this, _elementalValue, null));
-				case DARK -> player.addStatFunc(new FuncAdd(isArmor ? Stats.DARK_RES : Stats.DARK_POWER, 0x40, this, _elementalValue, null));
-				case HOLY -> player.addStatFunc(new FuncAdd(isArmor ? Stats.HOLY_RES : Stats.HOLY_POWER, 0x40, this, _elementalValue, null));
+				case FIRE -> player.addStatFuncs(new FuncAdd(isArmor ? Stats.FIRE_RES : Stats.FIRE_POWER, 0x40, this, _elementalValue, null));
+				case WATER -> player.addStatFuncs(new FuncAdd(isArmor ? Stats.WATER_RES : Stats.WATER_POWER, 0x40, this, _elementalValue, null));
+				case WIND -> player.addStatFuncs(new FuncAdd(isArmor ? Stats.WIND_RES : Stats.WIND_POWER, 0x40, this, _elementalValue, null));
+				case EARTH -> player.addStatFuncs(new FuncAdd(isArmor ? Stats.EARTH_RES : Stats.EARTH_POWER, 0x40, this, _elementalValue, null));
+				case DARK -> player.addStatFuncs(new FuncAdd(isArmor ? Stats.DARK_RES : Stats.DARK_POWER, 0x40, this, _elementalValue, null));
+				case HOLY -> player.addStatFuncs(new FuncAdd(isArmor ? Stats.HOLY_RES : Stats.HOLY_POWER, 0x40, this, _elementalValue, null));
 			}
 			
 			_active = true;

+ 6 - 2
src/main/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -2884,7 +2884,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	 * </ul>
 	 * @param function The Func object to add to the Calculator corresponding to the state affected
 	 */
-	public final void addStatFunc(AbstractFunction function) {
+	private final void addStatFunc(AbstractFunction function) {
 		if (function == null) {
 			return;
 		}
@@ -2943,6 +2943,10 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 			broadcastModifiedStats(modifiedStats);
 		}
 	}
+
+	public final void addStatFuncs(AbstractFunction function) {
+		addStatFuncs(List.of(function));
+	}
 	
 	/**
 	 * Remove a Func from the Calculator set of the L2Character.<br>
@@ -2959,7 +2963,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	 * </ul>
 	 * @param function The Func object to remove from the Calculator corresponding to the state affected
 	 */
-	public final void removeStatFunc(AbstractFunction function) {
+	private final void removeStatFunc(AbstractFunction function) {
 		if (function == null) {
 			return;
 		}

+ 46 - 41
src/main/java/com/l2jserver/gameserver/model/stats/Formulas.java

@@ -69,6 +69,7 @@ import com.l2jserver.gameserver.model.items.type.WeaponType;
 import com.l2jserver.gameserver.model.skills.AttributeType;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.Skill;
+import com.l2jserver.gameserver.model.stats.functions.AbstractFunction;
 import com.l2jserver.gameserver.model.stats.functions.formulas.FuncArmorSet;
 import com.l2jserver.gameserver.model.stats.functions.formulas.FuncAtkAccuracy;
 import com.l2jserver.gameserver.model.stats.functions.formulas.FuncAtkCritical;
@@ -205,50 +206,54 @@ public final class Formulas {
 	 * @param player the player
 	 */
 	public static void addFuncsToNewPlayer(L2PcInstance player) {
-		player.addStatFunc(FuncMaxHpMul.getInstance());
-		player.addStatFunc(FuncMaxCpMul.getInstance());
-		player.addStatFunc(FuncMaxMpMul.getInstance());
-		player.addStatFunc(FuncPAtkMod.getInstance());
-		player.addStatFunc(FuncMAtkMod.getInstance());
-		player.addStatFunc(FuncPDefMod.getInstance());
-		player.addStatFunc(FuncMDefMod.getInstance());
-		player.addStatFunc(FuncAtkCritical.getInstance());
-		player.addStatFunc(FuncMAtkCritical.getInstance());
-		player.addStatFunc(FuncAtkAccuracy.getInstance());
-		player.addStatFunc(FuncAtkEvasion.getInstance());
-		player.addStatFunc(FuncPAtkSpeed.getInstance());
-		player.addStatFunc(FuncMAtkSpeed.getInstance());
-		player.addStatFunc(FuncMoveSpeed.getInstance());
-		
-		player.addStatFunc(FuncHenna.getInstance(STAT_STR));
-		player.addStatFunc(FuncHenna.getInstance(STAT_DEX));
-		player.addStatFunc(FuncHenna.getInstance(STAT_INT));
-		player.addStatFunc(FuncHenna.getInstance(STAT_MEN));
-		player.addStatFunc(FuncHenna.getInstance(STAT_CON));
-		player.addStatFunc(FuncHenna.getInstance(STAT_WIT));
-		
-		player.addStatFunc(FuncArmorSet.getInstance(STAT_STR));
-		player.addStatFunc(FuncArmorSet.getInstance(STAT_DEX));
-		player.addStatFunc(FuncArmorSet.getInstance(STAT_INT));
-		player.addStatFunc(FuncArmorSet.getInstance(STAT_MEN));
-		player.addStatFunc(FuncArmorSet.getInstance(STAT_CON));
-		player.addStatFunc(FuncArmorSet.getInstance(STAT_WIT));
+		player.addStatFuncs(List.of(
+				FuncMaxHpMul.getInstance(),
+				FuncMaxCpMul.getInstance(),
+				FuncMaxMpMul.getInstance(),
+				FuncPAtkMod.getInstance(),
+				FuncMAtkMod.getInstance(),
+				FuncPDefMod.getInstance(),
+				FuncMDefMod.getInstance(),
+				FuncAtkCritical.getInstance(),
+				FuncMAtkCritical.getInstance(),
+				FuncAtkAccuracy.getInstance(),
+				FuncAtkEvasion.getInstance(),
+				FuncPAtkSpeed.getInstance(),
+				FuncMAtkSpeed.getInstance(),
+				FuncMoveSpeed.getInstance(),
+
+				FuncHenna.getInstance(STAT_STR),
+				FuncHenna.getInstance(STAT_DEX),
+				FuncHenna.getInstance(STAT_INT),
+				FuncHenna.getInstance(STAT_MEN),
+				FuncHenna.getInstance(STAT_CON),
+				FuncHenna.getInstance(STAT_WIT),
+
+				FuncArmorSet.getInstance(STAT_STR),
+				FuncArmorSet.getInstance(STAT_DEX),
+				FuncArmorSet.getInstance(STAT_INT),
+				FuncArmorSet.getInstance(STAT_MEN),
+				FuncArmorSet.getInstance(STAT_CON),
+				FuncArmorSet.getInstance(STAT_WIT)
+		));
 	}
 	
 	public static void addFuncsToNewSummon(L2Summon summon) {
-		summon.addStatFunc(FuncMaxHpMul.getInstance());
-		summon.addStatFunc(FuncMaxMpMul.getInstance());
-		summon.addStatFunc(FuncPAtkMod.getInstance());
-		summon.addStatFunc(FuncMAtkMod.getInstance());
-		summon.addStatFunc(FuncPDefMod.getInstance());
-		summon.addStatFunc(FuncMDefMod.getInstance());
-		summon.addStatFunc(FuncAtkCritical.getInstance());
-		summon.addStatFunc(FuncMAtkCritical.getInstance());
-		summon.addStatFunc(FuncAtkAccuracy.getInstance());
-		summon.addStatFunc(FuncAtkEvasion.getInstance());
-		summon.addStatFunc(FuncMoveSpeed.getInstance());
-		summon.addStatFunc(FuncPAtkSpeed.getInstance());
-		summon.addStatFunc(FuncMAtkSpeed.getInstance());
+		summon.addStatFuncs(List.of(
+				FuncMaxHpMul.getInstance(),
+				FuncMaxMpMul.getInstance(),
+				FuncPAtkMod.getInstance(),
+				FuncMAtkMod.getInstance(),
+				FuncPDefMod.getInstance(),
+				FuncMDefMod.getInstance(),
+				FuncAtkCritical.getInstance(),
+				FuncMAtkCritical.getInstance(),
+				FuncAtkAccuracy.getInstance(),
+				FuncAtkEvasion.getInstance(),
+				FuncMoveSpeed.getInstance(),
+				FuncPAtkSpeed.getInstance(),
+				FuncMAtkSpeed.getInstance()
+		));
 	}
 	
 	/**