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

BETA: Updating character base attack range to use values from items, transformations and then character template.
* Unhardcoding attack angle.
* Also fixing Minor typo in npc movement speed on water.
* Patch by: UnAfraid, lion

Rumen Nikiforov 11 роки тому
батько
коміт
369e97682e

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

@@ -1375,8 +1375,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	private boolean doAttackHitByPole(Attack attack, L2Character target, int sAtk)
 	{
 		// double angleChar;
-		int maxRadius = getPhysicalAttackRange();
-		int maxAngleDiff = (int) getStat().calcStat(Stats.POWER_ATTACK_ANGLE, 120, null, null);
+		int maxRadius = getStat().getPhysicalAttackRange();
+		int maxAngleDiff = getStat().getPhysicalAttackAngle();
 		
 		// o1 x: 83420 y: 148158 (Giran)
 		// o2 x: 83379 y: 148081 (Giran)
@@ -1403,7 +1403,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 		// angleChar = Util.convertHeadingToDegree(getHeading());
 		
 		// H5 Changes: without Polearm Mastery (skill 216) max simultaneous attacks is 3 (1 by default + 2 in skill 3599).
-		int attackRandomCountMax = (int) getStat().calcStat(Stats.ATTACK_COUNT_MAX, 0, null, null);
+		int attackRandomCountMax = (int) getStat().calcStat(Stats.ATTACK_COUNT_MAX, 1, null, null);
 		int attackcount = 0;
 		
 		// if (angleChar <= 0) angleChar += 360;

+ 32 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/CharStat.java

@@ -24,6 +24,7 @@ import com.l2jserver.Config;
 import com.l2jserver.gameserver.model.Elementals;
 import com.l2jserver.gameserver.model.PcCondOverride;
 import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.items.L2Weapon;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.stats.Calculator;
@@ -467,7 +468,37 @@ public class CharStat
 	 */
 	public final int getPhysicalAttackRange()
 	{
-		return (int) calcStat(Stats.POWER_ATTACK_RANGE, _activeChar.getTemplate().getBaseAttackRange());
+		final L2Weapon weapon = _activeChar.getActiveWeaponItem();
+		int baseAttackRange;
+		if (_activeChar.isTransformed() && _activeChar.isPlayer())
+		{
+			baseAttackRange = _activeChar.getTransformation().getBaseAttackRange(_activeChar.getActingPlayer());
+		}
+		else if (weapon != null)
+		{
+			baseAttackRange = weapon.getBaseAttackRange();
+		}
+		else
+		{
+			baseAttackRange = _activeChar.getTemplate().getBaseAttackRange();
+		}
+		
+		return (int) calcStat(Stats.POWER_ATTACK_RANGE, baseAttackRange, null, null);
+	}
+	
+	public int getPhysicalAttackAngle()
+	{
+		final L2Weapon weapon = _activeChar.getActiveWeaponItem();
+		final int baseAttackAngle;
+		if (weapon != null)
+		{
+			baseAttackAngle = weapon.getBaseAttackAngle();
+		}
+		else
+		{
+			baseAttackAngle = 120;
+		}
+		return baseAttackAngle;
 	}
 	
 	/**

+ 6 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/transform/Transform.java

@@ -198,6 +198,12 @@ public final class Transform implements IIdentifiable
 		return template != null ? template.getCollisionRadius() : player.getCollisionRadius();
 	}
 	
+	public int getBaseAttackRange(L2PcInstance player)
+	{
+		final TransformTemplate template = getTemplate(player);
+		return template != null ? template.getBaseAttackRange() : player.getTemplate().getBaseAttackRange();
+	}
+	
 	public void onTransform(L2PcInstance player)
 	{
 		final TransformTemplate template = getTemplate(player);

+ 7 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/transform/TransformTemplate.java

@@ -43,6 +43,7 @@ public final class TransformTemplate
 	private final double _collisionRadius;
 	private final double _collisionHeight;
 	private final L2WeaponType _baseAttackType;
+	private final int _baseAttackRange;
 	private final double _baseRandomDamage;
 	private List<SkillHolder> _skills;
 	private List<AdditionalSkillHolder> _additionalSkills;
@@ -59,6 +60,7 @@ public final class TransformTemplate
 		_collisionRadius = set.getDouble("radius", 0);
 		_collisionHeight = set.getDouble("height", 0);
 		_baseAttackType = L2WeaponType.findByName(set.getString("attackType", "FIST"));
+		_baseAttackRange = set.getInt("range", 40);
 		_baseRandomDamage = set.getDouble("randomDamage", 0);
 		
 		addSpeed(MoveType.WALK, set.getFloat("walk", 0));
@@ -163,6 +165,11 @@ public final class TransformTemplate
 		return _baseAttackType;
 	}
 	
+	public int getBaseAttackRange()
+	{
+		return _baseAttackRange;
+	}
+	
 	public double getBaseRandomDamage()
 	{
 		return _baseRandomDamage;

+ 23 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/L2Weapon.java

@@ -36,6 +36,7 @@ import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Formulas;
+import com.l2jserver.gameserver.util.Util;
 import com.l2jserver.util.StringUtil;
 
 /**
@@ -49,6 +50,8 @@ public final class L2Weapon extends L2Item
 	private final int _soulShotCount;
 	private final int _spiritShotCount;
 	private final int _mpConsume;
+	private final int _baseAttackRange;
+	private final int _baseAttackAngle;
 	/**
 	 * Skill that activates when item is enchanted +4 (for duals).
 	 */
@@ -86,6 +89,16 @@ public final class L2Weapon extends L2Item
 		_spiritShotCount = set.getInt("spiritshots", 0);
 		_rndDam = set.getInt("random_damage", 0);
 		_mpConsume = set.getInt("mp_consume", 0);
+		_baseAttackRange = set.getInt("attack_range", 40);
+		String[] damgeRange = set.getString("damage_range", "").split(";"); // 0?;0?;fan sector;base attack angle
+		if ((damgeRange.length > 1) && Util.isDigit(damgeRange[3]))
+		{
+			_baseAttackAngle = Integer.parseInt(damgeRange[3]);
+		}
+		else
+		{
+			_baseAttackAngle = 120;
+		}
 		
 		String[] reduced_soulshots = set.getString("reduced_soulshot", "").split(",");
 		_reducedSoulshotChance = (reduced_soulshots.length == 2) ? Integer.parseInt(reduced_soulshots[0]) : 0;
@@ -256,6 +269,16 @@ public final class L2Weapon extends L2Item
 		return _mpConsume;
 	}
 	
+	public int getBaseAttackRange()
+	{
+		return _baseAttackRange;
+	}
+	
+	public int getBaseAttackAngle()
+	{
+		return _baseAttackAngle;
+	}
+	
 	/**
 	 * @return the reduced MP consumption with the weapon.
 	 */

+ 0 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Stats.java

@@ -90,7 +90,6 @@ public enum Stats
 	ACCURACY_COMBAT("accCombat"),
 	POWER_ATTACK_RANGE("pAtkRange"),
 	MAGIC_ATTACK_RANGE("mAtkRange"),
-	POWER_ATTACK_ANGLE("pAtkAngle"),
 	ATTACK_COUNT_MAX("atkCountMax"),
 	// Run speed, walk & escape speed are calculated proportionally, magic speed is a buff
 	MOVE_SPEED("runSpd"),

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java

@@ -65,8 +65,8 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 		_moveMultiplier = cha.getMovementSpeedMultiplier();
 		_runSpd = Math.round(cha.getRunSpeed() / _moveMultiplier);
 		_walkSpd = Math.round(cha.getWalkSpeed() / _moveMultiplier);
-		_swimRunSpd = cha.getSwimRunSpeed();
-		_swimWalkSpd = cha.getSwimWalkSpeed();
+		_swimRunSpd = Math.round(cha.getSwimRunSpeed() / _moveMultiplier);
+		_swimWalkSpd = Math.round(cha.getSwimWalkSpeed() / _moveMultiplier);
 		_flyRunSpd = cha.isFlying() ? _runSpd : 0;
 		_flyWalkSpd = cha.isFlying() ? _walkSpd : 0;
 	}
@@ -188,7 +188,7 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			writeD(_allyId); // ally id
 			writeD(_allyCrest); // all crest
 			
-			writeC(_npc.isFlying() ? 2 : 0); // C2
+			writeC(_npc.isInsideZone(ZoneId.WATER) ? 1 : _npc.isFlying() ? 2 : 0); // C2
 			writeC(_npc.getTeam().getId());
 			
 			writeF(_collisionRadius);
@@ -415,7 +415,7 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			writeD(0x00); // crest id
 			writeD(0x00); // C2
 			writeD(0x00); // C2
-			writeC(0x00); // C2
+			writeC(_summon.isInsideZone(ZoneId.WATER) ? 1 : _summon.isFlying() ? 2 : 0); // C2
 			
 			writeC(_summon.getTeam().getId());