Prechádzať zdrojové kódy

New stat "limitHp" describing non-visible max HP limit.
Old getMaxHp() now renamed to getMaxVisibleHp(), and getMaxHp() return visible HP multiplied by limit.
HP can't increase higher than getMaxHp() anyway.
getMaxVisibleHp() also used in player maxhp condition.

_DS_ 15 rokov pred
rodič
commit
78e2f72840
21 zmenil súbory, kde vykonal 47 pridanie a 29 odobranie
  1. 20 8
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Character.java
  2. 8 0
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/stat/CharStat.java
  3. 0 3
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/stat/NpcStat.java
  4. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/model/actor/stat/PetStat.java
  5. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/DoorStatusUpdate.java
  6. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ExDuelUpdateUserInfo.java
  7. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ExOlympiadUserInfo.java
  8. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ExPartyPetWindowAdd.java
  9. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ExPartyPetWindowUpdate.java
  10. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/GMViewCharacterInfo.java
  11. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowAdd.java
  12. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowAll.java
  13. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowUpdate.java
  14. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PetInfo.java
  15. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PetStatusUpdate.java
  16. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ServerObjectInfo.java
  17. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/StaticObject.java
  18. 2 2
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/StatusUpdate.java
  19. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java
  20. 1 0
      L2_GameServer/java/com/l2jserver/gameserver/skills/Stats.java
  21. 1 1
      L2_GameServer/java/com/l2jserver/gameserver/skills/conditions/ConditionPlayerHp.java

+ 20 - 8
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -392,9 +392,9 @@ public abstract class L2Character extends L2Object
 
 	protected void initCharStatusUpdateValues()
 	{
-		_hpUpdateInterval = getMaxHp()/352.0; // MAX_HP div MAX_HP_BAR_PX
-		_hpUpdateIncCheck = getMaxHp();
-		_hpUpdateDecCheck = getMaxHp()-_hpUpdateInterval;
+		_hpUpdateIncCheck = getMaxVisibleHp();
+		_hpUpdateInterval = _hpUpdateIncCheck / 352.0; // MAX_HP div MAX_HP_BAR_PX
+		_hpUpdateDecCheck = _hpUpdateIncCheck - _hpUpdateInterval;
 	}
 
 	// =========================================================
@@ -495,13 +495,14 @@ public abstract class L2Character extends L2Object
 	protected boolean needHpUpdate(int barPixels)
 	{
 		double currentHp = getCurrentHp();
+		double maxHp = getMaxVisibleHp();
 
-	    if (currentHp <= 1.0 || getMaxHp() < barPixels)
+	    if (currentHp <= 1.0 || maxHp < barPixels)
 	        return true;
 
 	    if (currentHp <= _hpUpdateDecCheck || currentHp >= _hpUpdateIncCheck)
 	    {
-	    	if (currentHp == getMaxHp())
+	    	if (currentHp == maxHp)
 	    	{
 	    		_hpUpdateIncCheck = currentHp + 1;
 	    		_hpUpdateDecCheck = currentHp - _hpUpdateInterval;
@@ -3827,7 +3828,11 @@ public abstract class L2Character extends L2Object
 			else if (stat == Stats.MAX_HP && this instanceof L2Attackable)
 			{
 				if (su == null) su = new StatusUpdate(this);
-				su.addAttribute(StatusUpdate.MAX_HP, getMaxHp());
+				su.addAttribute(StatusUpdate.MAX_HP, getMaxVisibleHp());
+			}
+			else if (stat == Stats.LIMIT_HP)
+			{
+				getStatus().setCurrentHp(getCurrentHp()); // start regeneration if needed
 			}
 			/*else if (stat == Stats.MAX_CP) 
 			{
@@ -6779,8 +6784,15 @@ public abstract class L2Character extends L2Object
 	public double getPDefMonsters(L2Character target) { return getStat().getPDefMonsters(target); }
     public double getPDefPlants(L2Character target) { return getStat().getPDefPlants(target); }
     public double getPDefGiants(L2Character target) { return getStat().getPDefGiants(target); }
-    
-    public int getPAtkSpd() { return getStat().getPAtkSpd(); }
+
+    /**
+     * Return max visible HP for display purpose.
+     * Calculated by applying non-visible HP limit
+     * getMaxHp() = getMaxVisibleHp() * limitHp
+     */
+	public int getMaxVisibleHp() { return getStat().getMaxVisibleHp(); }
+
+	public int getPAtkSpd() { return getStat().getPAtkSpd(); }
 	public int getPDef(L2Character target) { return getStat().getPDef(target); }
 	public final int getPhysicalAttackRange() { return getStat().getPhysicalAttackRange(); }
 	public int getRunSpeed() { return getStat().getRunSpeed(); }

+ 8 - 0
L2_GameServer/java/com/l2jserver/gameserver/model/actor/stat/CharStat.java

@@ -265,6 +265,14 @@ public class CharStat
     	if (_activeChar == null)
     		return 1;
 
+		return (int) calcStat(Stats.LIMIT_HP, getMaxVisibleHp(), null, null);
+	}
+
+	public int getMaxVisibleHp()
+	{
+    	if (_activeChar == null)
+    		return 1;
+
 		return (int) calcStat(Stats.MAX_HP, _activeChar.getTemplate().baseHpMax, null, null);
 	}
 

+ 0 - 3
L2_GameServer/java/com/l2jserver/gameserver/model/actor/stat/NpcStat.java

@@ -33,9 +33,6 @@ public class NpcStat extends CharStat
     @Override
 	public L2Npc getActiveChar() { return (L2Npc)super.getActiveChar(); }
 
-    @Override
-	public final int getMaxHp() { return (int)calcStat(Stats.MAX_HP, getActiveChar().getTemplate().baseHpMax , null, null); }
-    
     @Override
 	public int getWalkSpeed(){ return (int) calcStat(Stats.WALK_SPEED, getActiveChar().getTemplate().baseWalkSpd, null, null);}
     

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/actor/stat/PetStat.java

@@ -123,7 +123,7 @@ public class PetStat extends SummonStat
     public final int getMaxFeed() { return getActiveChar().getPetData().getPetMaxFeed(); }
 
     @Override
-	public int getMaxHp() { return (int)calcStat(Stats.MAX_HP, getActiveChar().getPetData().getPetMaxHP(), null, null); }
+	public int getMaxVisibleHp() { return (int)calcStat(Stats.MAX_HP, getActiveChar().getPetData().getPetMaxHP(), null, null); }
 
     @Override
 	public int getMaxMp() { return (int)calcStat(Stats.MAX_MP, getActiveChar().getPetData().getPetMaxMP(), null, null); }

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/DoorStatusUpdate.java

@@ -49,7 +49,7 @@ public final class DoorStatusUpdate extends L2GameServerPacket
 		writeD(_door.isEnemy() ? 1 : 0);
 		writeD(_door.getDoorId());
 		writeD((int)_door.getCurrentHp());
-		writeD(_door.getMaxHp());
+		writeD(_door.getMaxVisibleHp());
 	}
 
 	/* (non-Javadoc)

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ExDuelUpdateUserInfo.java

@@ -43,7 +43,7 @@ public class ExDuelUpdateUserInfo extends L2GameServerPacket
 		writeD(_activeChar.getClassId().getId());
 		writeD(_activeChar.getLevel());
 		writeD((int)_activeChar.getCurrentHp());
-		writeD(_activeChar.getMaxHp());
+		writeD(_activeChar.getMaxVisibleHp());
 		writeD((int)_activeChar.getCurrentMp());
 		writeD(_activeChar.getMaxMp());
 		writeD((int)_activeChar.getCurrentCp());

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ExOlympiadUserInfo.java

@@ -51,7 +51,7 @@ public class ExOlympiadUserInfo extends L2GameServerPacket
 		writeS(_player.getName());
 		writeD(_player.getClassId().getId());
 		writeD((int)_player.getCurrentHp());
-		writeD(_player.getMaxHp());
+		writeD(_player.getMaxVisibleHp());
 		writeD((int)_player.getCurrentCp());
 		writeD(_player.getMaxCp());
 	}

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ExPartyPetWindowAdd.java

@@ -53,7 +53,7 @@ public final class ExPartyPetWindowAdd extends L2GameServerPacket
         writeD(_summon.getOwner().getObjectId());
         writeS(_summon.getName());
         writeD((int) _summon.getCurrentHp());
-        writeD(_summon.getMaxHp());
+        writeD(_summon.getMaxVisibleHp());
         writeD((int) _summon.getCurrentMp());
         writeD(_summon.getMaxMp());
         writeD(_summon.getLevel());

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ExPartyPetWindowUpdate.java

@@ -52,7 +52,7 @@ public class ExPartyPetWindowUpdate extends L2GameServerPacket
         writeD(_summon.getOwner().getObjectId());
         writeS(_summon.getName());
         writeD((int) _summon.getCurrentHp());
-        writeD(_summon.getMaxHp());
+        writeD(_summon.getMaxVisibleHp());
         writeD((int) _summon.getCurrentMp());
         writeD(_summon.getMaxMp());
         writeD(_summon.getLevel());

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/GMViewCharacterInfo.java

@@ -65,7 +65,7 @@ public class GMViewCharacterInfo extends L2GameServerPacket
 		writeD(_activeChar.getINT());
 		writeD(_activeChar.getWIT());
 		writeD(_activeChar.getMEN());
-		writeD(_activeChar.getMaxHp());
+		writeD(_activeChar.getMaxVisibleHp());
 		writeD((int) _activeChar.getCurrentHp());
 		writeD(_activeChar.getMaxMp());
 		writeD((int)_activeChar.getCurrentMp());

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowAdd.java

@@ -48,7 +48,7 @@ public final class PartySmallWindowAdd extends L2GameServerPacket
 		writeD((int) _member.getCurrentCp()); //c4
 		writeD(_member.getMaxCp()); //c4
 		writeD((int) _member.getCurrentHp());
-		writeD(_member.getMaxHp());
+		writeD(_member.getMaxVisibleHp());
 		writeD((int) _member.getCurrentMp());
 		writeD(_member.getMaxMp());
 		writeD(_member.getLevel());

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowAll.java

@@ -64,7 +64,7 @@ public final class PartySmallWindowAll extends L2GameServerPacket
 				writeD(member.getMaxCp()); // c4
 				
 				writeD((int) member.getCurrentHp());
-				writeD(member.getMaxHp());
+				writeD(member.getMaxVisibleHp());
 				writeD((int) member.getCurrentMp());
 				writeD(member.getMaxMp());
 				writeD(member.getLevel());

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowUpdate.java

@@ -42,7 +42,7 @@ public final class PartySmallWindowUpdate extends L2GameServerPacket
 		writeD(_member.getMaxCp()); //c4
 
 		writeD((int) _member.getCurrentHp());
-		writeD(_member.getMaxHp());
+		writeD(_member.getMaxVisibleHp());
 		writeD((int) _member.getCurrentMp());
 		writeD(_member.getMaxMp());
 		writeD(_member.getLevel());

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PetInfo.java

@@ -57,7 +57,7 @@ public class PetInfo extends L2GameServerPacket
 		_walkSpd =  _summon.isMountable() ? 45 : 30;
 		_swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
 		_swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
-		_maxHp = _summon.getMaxHp();
+		_maxHp = _summon.getMaxVisibleHp();
 		_maxMp = _summon.getMaxMp();
 		_val = val;
 		if (_summon instanceof L2PetInstance)

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/PetStatusUpdate.java

@@ -34,7 +34,7 @@ public class PetStatusUpdate extends L2GameServerPacket
 	public PetStatusUpdate(L2Summon summon)
 	{
         _summon = summon;
-        _maxHp = _summon.getMaxHp();
+        _maxHp = _summon.getMaxVisibleHp();
 		_maxMp = _summon.getMaxMp();
 		if (_summon instanceof L2PetInstance)
 		{

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/ServerObjectInfo.java

@@ -65,7 +65,7 @@ public final class ServerObjectInfo extends L2GameServerPacket
 		writeF(_collisionRadius);
 		writeF(_collisionHeight);
 		writeD((int) (_isAttackable ? _activeChar.getCurrentHp() : 0));
-		writeD(_isAttackable ? _activeChar.getMaxHp() : 0);
+		writeD(_isAttackable ? _activeChar.getMaxVisibleHp() : 0);
 		writeD(0x01); // object type
 		writeD(0x00); // special effects
 	}

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/StaticObject.java

@@ -60,7 +60,7 @@ public class StaticObject extends L2GameServerPacket
         _meshIndex = 1;
         _isClosed = !door.getOpen();
         _isEnemy = door.isEnemy();
-        _maxHp = door.getMaxHp();
+        _maxHp = door.getMaxVisibleHp();
         _currentHp = (int) door.getCurrentHp();
         _showHp = door.getIsShowHp() || showHp;
         _damageGrade = door.getDamage();

+ 2 - 2
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/StatusUpdate.java

@@ -107,7 +107,7 @@ public final class StatusUpdate extends L2GameServerPacket
 		L2Object obj = L2World.getInstance().findObject(objectId);
 		if (obj != null && obj instanceof L2Attackable)
 		{
-			_maxHp = ((L2Character) obj).getMaxHp();
+			_maxHp = ((L2Character) obj).getMaxVisibleHp();
 		}
 	}
 	
@@ -120,7 +120,7 @@ public final class StatusUpdate extends L2GameServerPacket
 		_attributes = new ArrayList<Attribute>();
 		_objectId = object.getObjectId();
 		if (object instanceof L2Attackable)
-			_maxHp = ((L2Character) object).getMaxHp();
+			_maxHp = ((L2Character) object).getMaxVisibleHp();
 	}
 	
 	public void addAttribute(int id, int level)

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java

@@ -139,7 +139,7 @@ public final class UserInfo extends L2GameServerPacket
 		writeD(_activeChar.getINT());
 		writeD(_activeChar.getWIT());
 		writeD(_activeChar.getMEN());
-		writeD(_activeChar.getMaxHp());
+		writeD(_activeChar.getMaxVisibleHp());
 		writeD((int) _activeChar.getCurrentHp());
 		writeD(_activeChar.getMaxMp());
 		writeD((int) _activeChar.getCurrentMp());

+ 1 - 0
L2_GameServer/java/com/l2jserver/gameserver/skills/Stats.java

@@ -101,6 +101,7 @@ public enum Stats
 	// stats of various abilities
 	BREATH("breath"),
 	FALL("fall"),
+	LIMIT_HP("limitHp"), // non-displayed hp limit
 	//
 	AGGRESSION("aggression"), // locks a mob on tank caster
 	BLEED("bleed"), // by daggers, like poison

+ 1 - 1
L2_GameServer/java/com/l2jserver/gameserver/skills/conditions/ConditionPlayerHp.java

@@ -41,6 +41,6 @@ public class ConditionPlayerHp extends Condition
 	@Override
 	public boolean testImpl(Env env)
 	{
-		return env.player.getCurrentHp() * 100 / env.player.getMaxHp() <= _hp;
+		return env.player.getCurrentHp() * 100 / env.player.getMaxVisibleHp() <= _hp;
 	}
 }