Browse Source

BETA: Fixing issue causing swimming to get client/server out of sync.
* Also fixed properly swapping speed when inside water.
* Thanks to: FBIagent

Rumen Nikiforov 11 năm trước cách đây
mục cha
commit
c87e3c5a72

+ 9 - 17
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TrapInstance.java

@@ -83,22 +83,8 @@ public final class L2TrapInstance extends L2Npc
 	
 	public L2TrapInstance(int objectId, L2NpcTemplate template, L2PcInstance owner, int lifeTime)
 	{
-		super(objectId, template);
-		setInstanceType(InstanceType.L2TrapInstance);
-		setInstanceId(owner.getInstanceId());
-		setName(template.getName());
-		setIsInvul(false);
-		
+		this(objectId, template, owner.getInstanceId(), lifeTime);
 		_owner = owner;
-		_isTriggered = false;
-		_skill = getTemplate().getParameters().getObject("trap_skill", SkillHolder.class);
-		_hasLifeTime = lifeTime >= 0;
-		_lifeTime = lifeTime != 0 ? lifeTime : 30000;
-		_remainingTime = getLifeTime();
-		if (_skill != null)
-		{
-			ThreadPoolManager.getInstance().scheduleGeneral(new TrapTask(this), TICK);
-		}
 	}
 	
 	@Override
@@ -358,7 +344,10 @@ public final class L2TrapInstance extends L2Npc
 	{
 		if (_isInArena)
 		{
-			detector.sendPacket(new TrapInfo(this, detector));
+			if (detector.isPlayable())
+			{
+				sendInfo(detector.getActingPlayer());
+			}
 			return;
 		}
 		
@@ -376,7 +365,10 @@ public final class L2TrapInstance extends L2Npc
 				quest.notifyTrapAction(this, detector, TrapAction.TRAP_DETECTED);
 			}
 		}
-		detector.sendPacket(new TrapInfo(this, detector));
+		if (detector.isPlayable())
+		{
+			sendInfo(detector.getActingPlayer());
+		}
 	}
 	
 	public void stopDecay()

+ 15 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/CharStat.java

@@ -377,9 +377,18 @@ public class CharStat
 		return (int) calcStat(Stats.STAT_MEN, _activeChar.getTemplate().getBaseMEN());
 	}
 	
-	public float getMovementSpeedMultiplier()
+	public final float getMovementSpeedMultiplier()
 	{
-		return (getRunSpeed() / getBaseMoveSpeed(MoveType.RUN));
+		float baseSpeed;
+		if (_activeChar.isInsideZone(ZoneId.WATER))
+		{
+			baseSpeed = getBaseMoveSpeed(_activeChar.isRunning() ? MoveType.FAST_SWIM : MoveType.SLOW_SWIM);
+		}
+		else
+		{
+			baseSpeed = getBaseMoveSpeed(_activeChar.isRunning() ? MoveType.RUN : MoveType.WALK);
+		}
+		return (float) (getMoveSpeed() * (1. / baseSpeed));
 	}
 	
 	/**
@@ -396,6 +405,10 @@ public class CharStat
 	 */
 	public float getMoveSpeed()
 	{
+		if (_activeChar.isInsideZone(ZoneId.WATER))
+		{
+			return _activeChar.isRunning() ? getSwimRunSpeed() : getSwimWalkSpeed();
+		}
 		return _activeChar.isRunning() ? getRunSpeed() : getWalkSpeed();
 	}
 	

+ 4 - 20
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/PcStat.java

@@ -20,7 +20,6 @@ package com.l2jserver.gameserver.model.actor.stat;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.ExperienceTable;
-import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.PetDataTable;
 import com.l2jserver.gameserver.model.L2PetLevelData;
 import com.l2jserver.gameserver.model.PcCondOverride;
@@ -525,11 +524,9 @@ public class PcStat extends PlayableStat
 	public float getBaseMoveSpeed(MoveType type)
 	{
 		final L2PcInstance player = getActiveChar();
-		float val = super.getBaseMoveSpeed(type);
-		
-		if (getActiveChar().isTransformed())
+		if (player.isTransformed())
 		{
-			final TransformTemplate template = getActiveChar().getTransformation().getTemplate(getActiveChar());
+			final TransformTemplate template = player.getTransformation().getTemplate(player);
 			if (template != null)
 			{
 				return template.getBaseMoveSpeed(type);
@@ -537,13 +534,13 @@ public class PcStat extends PlayableStat
 		}
 		else if (player.isMounted())
 		{
-			final L2PetLevelData data = PetDataTable.getInstance().getPetLevelData(getActiveChar().getMountNpcId(), getActiveChar().getMountLevel());
+			final L2PetLevelData data = PetDataTable.getInstance().getPetLevelData(player.getMountNpcId(), player.getMountLevel());
 			if (data != null)
 			{
 				return data.getSpeedOnRide(type);
 			}
 		}
-		return val;
+		return super.getBaseMoveSpeed(type);
 	}
 	
 	@Override
@@ -616,19 +613,6 @@ public class PcStat extends PlayableStat
 		return val;
 	}
 	
-	@Override
-	public float getMovementSpeedMultiplier()
-	{
-		if (getActiveChar().isMounted())
-		{
-			final L2PetLevelData data = PetDataTable.getInstance().getPetLevelData(getActiveChar().getMountNpcId(), getActiveChar().getMountLevel());
-			float baseSpeed = data != null ? data.getSpeedOnRide(MoveType.RUN) : NpcTable.getInstance().getTemplate(getActiveChar().getMountNpcId()).getBaseMoveSpeed(MoveType.RUN);
-			return (getRunSpeed() / baseSpeed);
-		}
-		
-		return super.getMovementSpeedMultiplier();
-	}
-	
 	private void updateVitalityLevel(boolean quiet)
 	{
 		final byte level;

+ 1 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/stat/StaticObjStat.java

@@ -25,8 +25,6 @@ public class StaticObjStat extends CharStat
 	public StaticObjStat(L2StaticObjectInstance activeChar)
 	{
 		super(activeChar);
-		
-		setLevel((byte) 1);
 	}
 	
 	@Override
@@ -38,6 +36,6 @@ public class StaticObjStat extends CharStat
 	@Override
 	public final byte getLevel()
 	{
-		return 1;
+		return (byte) getActiveChar().getLevel();
 	}
 }

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

@@ -27,6 +27,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
 import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
+import com.l2jserver.gameserver.model.zone.ZoneId;
 
 public class CharInfo extends L2GameServerPacket
 {
@@ -98,8 +99,8 @@ public class CharInfo 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;
 	}
@@ -286,7 +287,7 @@ public class CharInfo extends L2GameServerPacket
 			
 			writeD(gmSeeInvis ? (_activeChar.getAbnormalVisualEffects() | AbnormalVisualEffect.STEALTH.getMask()) : _activeChar.getAbnormalVisualEffects());
 			
-			writeC(_activeChar.isFlyingMounted() ? 2 : 0);
+			writeC(_activeChar.isInsideZone(ZoneId.WATER) ? 1 : _activeChar.isFlyingMounted() ? 2 : 0);
 			
 			writeH(_activeChar.getRecomHave()); // Blue value for name (0 = white, 255 = pure blue)
 			writeD(_activeChar.getMountNpcId() + 1000000);

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

@@ -28,6 +28,7 @@ import com.l2jserver.gameserver.model.PcCondOverride;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
+import com.l2jserver.gameserver.model.zone.ZoneId;
 
 public final class UserInfo extends L2GameServerPacket
 {
@@ -78,8 +79,8 @@ public final class UserInfo 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;
 	}
@@ -209,7 +210,7 @@ public final class UserInfo extends L2GameServerPacket
 		writeC(_activeChar.isInPartyMatchRoom() ? 1 : 0);
 		
 		writeD(_activeChar.getAppearance().getInvisible() && _activeChar.isGM() ? _activeChar.getAbnormalVisualEffects() | AbnormalVisualEffect.STEALTH.getMask() : _activeChar.getAbnormalVisualEffects());
-		writeC(_activeChar.isFlyingMounted() ? 2 : 0);
+		writeC(_activeChar.isInsideZone(ZoneId.WATER) ? 1 : _activeChar.isFlyingMounted() ? 2 : 0);
 		
 		writeD(_activeChar.getClanPrivileges());