Переглянути джерело

BETA: Support for Max Recoverable HP/MP/CP (support for retail-like Seal of Limit). Note that life gained by Vampiric Rage - like effects is not blocked(retail-like).

Nik 14 роки тому
батько
коміт
15657efb2c

+ 3 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -6808,10 +6808,13 @@ public abstract class L2Character extends L2Object
 	public int getINT() { return getStat().getINT(); }
 	public final int getMagicalAttackRange(L2Skill skill) { return getStat().getMagicalAttackRange(skill); }
 	public final int getMaxCp() { return getStat().getMaxCp(); }
+	public final int getMaxRecoverableCp() { return getStat().getMaxRecoverableCp(); }
 	public int getMAtk(L2Character target, L2Skill skill) { return getStat().getMAtk(target, skill); }
 	public int getMAtkSpd() { return getStat().getMAtkSpd(); }
 	public int getMaxMp() { return getStat().getMaxMp(); }
+	public int getMaxRecoverableMp() { return getStat().getMaxRecoverableMp(); }
 	public int getMaxHp() { return getStat().getMaxHp(); }
+	public int getMaxRecoverableHp() { return getStat().getMaxRecoverableHp(); }
 	public final int getMCriticalHit(L2Character target, L2Skill skill) { return getStat().getMCriticalHit(target, skill); }
 	public int getMDef(L2Character target, L2Skill skill) { return getStat().getMDef(target, skill); }
 	public int getMEN() { return getStat().getMEN(); }

+ 24 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/CharStat.java

@@ -260,6 +260,14 @@ public class CharStat
 		return (int) calcStat(Stats.MAX_CP, _activeChar.getTemplate().baseCpMax, null, null);
 	}
 	
+	public int getMaxRecoverableCp()
+	{
+		if (_activeChar == null)
+			return 1;
+		
+		return (int) calcStat(Stats.MAX_RECOVERABLE_CP, getMaxCp(), null, null);
+	}
+	
 	public int getMaxHp()
 	{
 		if (_activeChar == null)
@@ -276,6 +284,14 @@ public class CharStat
 		return (int) calcStat(Stats.MAX_HP, _activeChar.getTemplate().baseHpMax, null, null);
 	}
 	
+	public int getMaxRecoverableHp()
+	{
+		if (_activeChar == null)
+			return 1;
+		
+		return (int) calcStat(Stats.MAX_RECOVERABLE_HP, getMaxVisibleHp(), null, null);
+	}
+	
 	public int getMaxMp()
 	{
 		if (_activeChar == null)
@@ -284,6 +300,14 @@ public class CharStat
 		return (int) calcStat(Stats.MAX_MP, _activeChar.getTemplate().baseMpMax, null, null);
 	}
 	
+	public int getMaxRecoverableMp()
+	{
+		if (_activeChar == null)
+			return 1;
+		
+		return (int) calcStat(Stats.MAX_RECOVERABLE_MP, getMaxMp(), null, null);
+	}
+	
 	/**
 	 * Return the MAtk (base+modifier) of the L2Character for a skill used in
 	 * function of abnormal effects in progress.<BR>

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/status/CharStatus.java

@@ -348,12 +348,12 @@ public class CharStatus
 		final CharStat charstat = getActiveChar().getStat();
 		
 		// Modify the current HP of the L2Character and broadcast Server->Client packet StatusUpdate
-		if (getCurrentHp() < charstat.getMaxHp())
+		if (getCurrentHp() < charstat.getMaxRecoverableHp())
 			setCurrentHp(getCurrentHp()
 					+ Formulas.calcHpRegen(getActiveChar()), false);
 		
 		// Modify the current MP of the L2Character and broadcast Server->Client packet StatusUpdate
-		if (getCurrentMp() < charstat.getMaxMp())
+		if (getCurrentMp() < charstat.getMaxRecoverableMp())
 			setCurrentMp(getCurrentMp()
 					+ Formulas.calcMpRegen(getActiveChar()), false);
 		
@@ -361,7 +361,7 @@ public class CharStatus
 		{
 			// no broadcast necessary for characters that are in inactive regions.
 			// stop regeneration for characters who are filled up and in an inactive region.
-			if ((getCurrentHp() == charstat.getMaxHp())
+			if ((getCurrentHp() == charstat.getMaxRecoverableHp())
 					&& (getCurrentMp() == charstat.getMaxMp()))
 				stopHpMpRegeneration();
 		}

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java

@@ -347,15 +347,15 @@ public class PcStatus extends PlayableStatus
 		final PcStat charstat = getActiveChar().getStat();
 		
 		// Modify the current CP of the L2Character and broadcast Server->Client packet StatusUpdate
-		if (getCurrentCp() < charstat.getMaxCp())
+		if (getCurrentCp() < charstat.getMaxRecoverableCp())
 			setCurrentCp(getCurrentCp() + Formulas.calcCpRegen(getActiveChar()), false);
 		
 		// Modify the current HP of the L2Character and broadcast Server->Client packet StatusUpdate
-		if (getCurrentHp() < charstat.getMaxHp())
+		if (getCurrentHp() < charstat.getMaxRecoverableHp())
 			setCurrentHp(getCurrentHp() + Formulas.calcHpRegen(getActiveChar()), false);
 		
 		// Modify the current MP of the L2Character and broadcast Server->Client packet StatusUpdate
-		if (getCurrentMp() < charstat.getMaxMp())
+		if (getCurrentMp() < charstat.getMaxRecoverableMp())
 			setCurrentMp(getCurrentMp() + Formulas.calcMpRegen(getActiveChar()), false);
 		
 		getActiveChar().broadcastStatusUpdate(); //send the StatusUpdate packet

+ 3 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/Stats.java

@@ -29,6 +29,9 @@ public enum Stats
 	MAX_HP("maxHp"),
 	MAX_MP("maxMp"),
 	MAX_CP("maxCp"),
+	MAX_RECOVERABLE_HP("maxRecoverableHp"), // The maximum HP that is able to be recovered trough heals
+	MAX_RECOVERABLE_MP("maxRecoverableMp"),
+	MAX_RECOVERABLE_CP("maxRecoverableCp"),
 	REGENERATE_HP_RATE("regHp"),
 	REGENERATE_CP_RATE("regCp"),
 	REGENERATE_MP_RATE("regMp"),

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/effects/EffectCombatPointHeal.java

@@ -58,8 +58,8 @@ public class EffectCombatPointHeal extends L2Effect
 		
 		double cp = calc();
 		
-		if ((target.getCurrentCp() + cp) > target.getMaxCp())
-			cp = target.getMaxCp() - target.getCurrentCp();
+		if ((target.getCurrentCp() + cp) > target.getMaxRecoverableCp())
+			cp = target.getMaxRecoverableCp() - target.getCurrentCp();
 		target.setCurrentCp(cp + target.getCurrentCp());
 		
 		SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CP_WILL_BE_RESTORED);

+ 6 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/effects/EffectCombatPointHealOverTime.java

@@ -64,7 +64,12 @@ public class EffectCombatPointHealOverTime extends L2Effect
 			return false;
 		
 		double cp = getEffected().getCurrentCp();
-		double maxcp = getEffected().getMaxCp();
+		double maxcp = getEffected().getMaxRecoverableCp();
+		
+		// Not needed to set the CP and send update packet if player is already at max CP
+		if (cp >= maxcp)
+			return true;
+		
 		cp += calc();
 		if (cp > maxcp)
 			cp = maxcp;

+ 6 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/effects/EffectHealOverTime.java

@@ -80,7 +80,12 @@ public class EffectHealOverTime extends L2Effect
 			return false;
 		
 		double hp = getEffected().getCurrentHp();
-		double maxhp = getEffected().getMaxHp();
+		double maxhp = getEffected().getMaxRecoverableHp();
+		
+		// Not needed to set the HP and send update packet if player is already at max HP
+		if (hp >= maxhp)
+			return true;
+		
 		hp += calc();
 		if (hp > maxhp)
 			hp = maxhp;

+ 6 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/effects/EffectManaHealOverTime.java

@@ -64,7 +64,12 @@ public class EffectManaHealOverTime extends L2Effect
 			return false;
 		
 		double mp = getEffected().getCurrentMp();
-		double maxmp = getEffected().getMaxMp();
+		double maxmp = getEffected().getMaxRecoverableMp();
+		
+		// Not needed to set the MP and send update packet if player is already at max MP
+		if (mp >= maxmp)
+			return true;
+		
 		mp += calc();
 		if (mp > maxmp)
 			mp = maxmp;

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/effects/EffectRelax.java

@@ -83,7 +83,7 @@ public class EffectRelax extends L2Effect
 				return false;
 		}
 		
-		if (getEffected().getCurrentHp() + 1 > getEffected().getMaxHp())
+		if (getEffected().getCurrentHp() + 1 > getEffected().getMaxRecoverableHp())
 		{
 			if (getSkill().isToggle())
 			{