Selaa lähdekoodia

BETA: Fixing NPE vulnerability at `L2PcInstance` and some typos regarding observation.
* Reported by: lion

Rumen Nikiforov 11 vuotta sitten
vanhempi
sitoutus
7aa178b458

+ 12 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -571,7 +571,7 @@ public final class L2PcInstance extends L2Playable
 	private boolean _waitTypeSitting;
 	
 	/** Location before entering Observer Mode */
-	private Location _lastLoc;
+	private final Location _lastLoc = new Location(0, 0, 0);
 	private boolean _observerMode = false;
 	
 	/** Stored from last ValidatePosition **/
@@ -9785,7 +9785,7 @@ public final class L2PcInstance extends L2Playable
 	
 	public void enterObserverMode(Location loc)
 	{
-		_lastLoc = loc;
+		setLastLocation();
 		
 		stopEffects(L2EffectType.HIDE);
 		
@@ -9802,9 +9802,14 @@ public final class L2PcInstance extends L2Playable
 		broadcastUserInfo();
 	}
 	
-	public void setLastLocation(Location loc)
+	public void setLastLocation()
 	{
-		_lastLoc = loc;
+		_lastLoc.setXYZ(getX(), getY(), getZ());
+	}
+	
+	public void unsetLastLocation()
+	{
+		_lastLoc.setXYZ(0, 0, 0);
 	}
 	
 	public void enterOlympiadObserverMode(Location loc, int id)
@@ -9838,7 +9843,7 @@ public final class L2PcInstance extends L2Playable
 		}
 		if (!_observerMode)
 		{
-			_lastLoc = loc;
+			setLastLocation();
 		}
 		
 		_observerMode = true;
@@ -9869,8 +9874,8 @@ public final class L2PcInstance extends L2Playable
 		
 		setFalling(); // prevent receive falling damage
 		_observerMode = false;
-		setLastLocation(null);
 		sendPacket(new ObservationReturn(getLastLocation()));
+		unsetLastLocation();
 		broadcastUserInfo();
 	}
 	
@@ -9895,7 +9900,7 @@ public final class L2PcInstance extends L2Playable
 		{
 			getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
 		}
-		setLastLocation(null);
+		unsetLastLocation();
 		broadcastUserInfo();
 	}
 	

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/olympiad/AbstractOlympiadGame.java

@@ -191,7 +191,7 @@ public abstract class AbstractOlympiadGame
 		
 		try
 		{
-			player.setLastLocation(player.getLocation());
+			player.setLastLocation();
 			if (player.isSitting())
 			{
 				player.standUp();
@@ -438,7 +438,7 @@ public abstract class AbstractOlympiadGame
 		
 		player.setInstanceId(0);
 		player.teleToLocation(loc);
-		player.setLastLocation(null);
+		player.unsetLastLocation();
 	}
 	
 	public static final void rewardParticipant(L2PcInstance player, int[][] reward)