소스 검색

BETA: Fixing trade exploit that allows players to accept the trade when they are far from each other.
* Closing #6223
* Classes formatted.
* Minor typo in !SystemMessageId comment.

Zoey76 13 년 전
부모
커밋
b9f09f33f1

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/SystemMessageId.java

@@ -698,7 +698,7 @@ public final class SystemMessageId
 	
 	/**
 	 * ID: 112<br>
-	 * Message: You may no longer adjust items in the trade because the trade has been confirmed.
+	 * Message: You have run out of arrows.
 	 */
 	public static final SystemMessageId NOT_ENOUGH_ARROWS;
 	

+ 23 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/TradeDone.java

@@ -19,16 +19,13 @@ import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.TradeList;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.util.Util;
 
 /**
- * This class ...
- *
- * @version $Revision: 1.6.2.2.2.2 $ $Date: 2005/03/27 15:29:30 $
+ * This packet manages the trade response.
  */
 public final class TradeDone extends L2GameClientPacket
 {
-	private static final String _C__1C_TRADEDONE = "[C] 1C TradeDone";
-	
 	private int _response;
 	
 	@Override
@@ -40,9 +37,11 @@ public final class TradeDone extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		final L2PcInstance player = getClient().getActiveChar();
+		final L2PcInstance player = getActiveChar();
 		if (player == null)
+		{
 			return;
+		}
 		
 		if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("trade"))
 		{
@@ -54,15 +53,20 @@ public final class TradeDone extends L2GameClientPacket
 		if (trade == null)
 		{
 			if (Config.DEBUG)
+			{
 				_log.warning("player.getTradeList == null in " + getType() + " for player " + player.getName());
+			}
 			return;
 		}
+		
 		if (trade.isLocked())
+		{
 			return;
+		}
 		
 		if (_response == 1)
 		{
-			if (trade.getPartner() == null || L2World.getInstance().getPlayer(trade.getPartner().getObjectId()) == null)
+			if ((trade.getPartner() == null) || (L2World.getInstance().getPlayer(trade.getPartner().getObjectId()) == null))
 			{
 				// Trade partner not found, cancel trade
 				player.cancelActiveTrade();
@@ -70,8 +74,10 @@ public final class TradeDone extends L2GameClientPacket
 				return;
 			}
 			
-			if (trade.getOwner().getActiveEnchantItem() != null || trade.getPartner().getActiveEnchantItem() != null)
+			if ((trade.getOwner().getActiveEnchantItem() != null) || (trade.getPartner().getActiveEnchantItem() != null))
+			{
 				return;
+			}
 			
 			if (!player.getAccessLevel().allowTransaction())
 			{
@@ -80,21 +86,28 @@ public final class TradeDone extends L2GameClientPacket
 				return;
 			}
 			
-			if (player.getInstanceId() != trade.getPartner().getInstanceId() && player.getInstanceId() != -1)
+			if ((player.getInstanceId() != trade.getPartner().getInstanceId()) && (player.getInstanceId() != -1))
 			{
 				player.cancelActiveTrade();
 				return;
 			}
 			
+			if (Util.calculateDistance(player, trade.getPartner(), true) > 150)
+			{
+				player.cancelActiveTrade();
+				return;
+			}
 			trade.confirm();
 		}
 		else
+		{
 			player.cancelActiveTrade();
+		}
 	}
 	
 	@Override
 	public String getType()
 	{
-		return _C__1C_TRADEDONE;
+		return "[C] 1C TradeDone";
 	}
 }

+ 23 - 16
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/TradeRequest.java

@@ -26,14 +26,10 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.util.Util;
 
 /**
- * This class ...
- *
- * @version $Revision: 1.2.2.1.2.3 $ $Date: 2005/03/27 15:29:30 $
+ * This packet manages the trade request.
  */
 public final class TradeRequest extends L2GameClientPacket
 {
-	private static final String _C__1A_TRADEREQUEST = "[C] 15 TradeRequest";
-	
 	private int _objectId;
 	
 	@Override
@@ -45,9 +41,11 @@ public final class TradeRequest extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance player = getClient().getActiveChar();
+		L2PcInstance player = getActiveChar();
 		if (player == null)
+		{
 			return;
+		}
 		
 		if (!player.getAccessLevel().allowTransaction())
 		{
@@ -56,32 +54,37 @@ public final class TradeRequest extends L2GameClientPacket
 			return;
 		}
 		
-		L2Object target = L2World.getInstance().findObject(_objectId);
-		if (target == null || !player.getKnownList().knowsObject(target) || !(target instanceof L2PcInstance))
+		final L2Object target = L2World.getInstance().findObject(_objectId);
+		// If there is no target, target is far away or
+		// they are in different instances (except multiverse)
+		// trade request is ignored and there is no system message.
+		if ((target == null) || !player.getKnownList().knowsObject(target) || ((target.getInstanceId() != player.getInstanceId()) && (player.getInstanceId() != -1)))
 		{
-			player.sendPacket(SystemMessageId.INCORRECT_TARGET);
 			return;
 		}
 		
+		// If target and acting player are the same, trade request is ignored
+		// and the following system message is sent to acting player.
 		if (target.getObjectId() == player.getObjectId())
 		{
 			player.sendPacket(SystemMessageId.TARGET_IS_INCORRECT);
 			return;
 		}
 		
-		L2PcInstance partner = (L2PcInstance) target;
-		
-		// cant trade with players from other instance except from multiverse
-		if (partner.getInstanceId() != player.getInstanceId() && player.getInstanceId() != -1)
+		if (!target.isPlayer())
+		{
+			player.sendPacket(SystemMessageId.INCORRECT_TARGET);
 			return;
+		}
 		
+		final L2PcInstance partner = target.getActingPlayer();
 		if (partner.isInOlympiadMode() || player.isInOlympiadMode())
 		{
 			player.sendMessage("A user currently participating in the Olympiad cannot accept or request a trade.");
 			return;
 		}
 		
-		// Alt game - Karma punishment
+		// L2J Customs: Karma punishment
 		if (!Config.ALT_GAME_KARMA_PLAYER_CAN_TRADE && (player.getKarma() > 0))
 		{
 			player.sendMessage("You cannot trade while you are in a chaotic state.");
@@ -100,7 +103,7 @@ public final class TradeRequest extends L2GameClientPacket
 			return;
 		}
 		
-		if (player.getPrivateStoreType() != 0 || partner.getPrivateStoreType() != 0)
+		if ((player.getPrivateStoreType() != L2PcInstance.STORE_PRIVATE_NONE) || (partner.getPrivateStoreType() != L2PcInstance.STORE_PRIVATE_NONE))
 		{
 			player.sendPacket(SystemMessageId.CANNOT_TRADE_DISCARD_DROP_ITEM_WHILE_IN_SHOPMODE);
 			return;
@@ -109,7 +112,9 @@ public final class TradeRequest extends L2GameClientPacket
 		if (player.isProcessingTransaction())
 		{
 			if (Config.DEBUG)
+			{
 				_log.fine("Already trading with someone else.");
+			}
 			player.sendPacket(SystemMessageId.ALREADY_TRADING);
 			return;
 		}
@@ -118,7 +123,9 @@ public final class TradeRequest extends L2GameClientPacket
 		if (partner.isProcessingRequest() || partner.isProcessingTransaction())
 		{
 			if (Config.DEBUG)
+			{
 				_log.info("Transaction already in progress.");
+			}
 			sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_BUSY_TRY_LATER);
 			sm.addString(partner.getName());
 			player.sendPacket(sm);
@@ -155,6 +162,6 @@ public final class TradeRequest extends L2GameClientPacket
 	@Override
 	public String getType()
 	{
-		return _C__1A_TRADEREQUEST;
+		return "[C] 1A TradeRequest";
 	}
 }