Fixed sell item exploit.

This commit is contained in:
MobiusDevelopment
2022-01-18 05:16:10 +00:00
parent da52de192f
commit b8f0b1f39c
14 changed files with 104 additions and 38 deletions

View File

@@ -130,13 +130,20 @@ public class CastleWarehouse extends Folk
@Override @Override
public void onBypassFeedback(Player player, String command) public void onBypassFeedback(Player player, String command)
{ {
if (player.getActiveEnchantItem() != null) if ((player.getActiveEnchantItem() != null) || (player.getActiveTradeList() != null))
{ {
LOGGER.info("Player " + player.getName() + " trying to use enchant exploit, ban this player!"); LOGGER.info("Player " + player.getName() + " trying to use enchant exploit, ban this player!");
player.closeNetConnection(); player.closeNetConnection();
return; return;
} }
if ((player.getPrivateStoreType() != 0) || player.isInStoreMode())
{
player.sendPacket(SystemMessageId.ITEMS_CANNOT_BE_DISCARDED_WHILE_IN_PRIVATE_STORE_STATUS);
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
if (command.startsWith("WithdrawP")) if (command.startsWith("WithdrawP"))
{ {
showRetrieveWindow(player); showRetrieveWindow(player);

View File

@@ -132,10 +132,12 @@ public class EnterWorld implements IClientIncomingPacket
// Set online status // Set online status
player.setOnlineStatus(true); player.setOnlineStatus(true);
// running is default
player.setRunning(); // running is default player.setRunning();
player.standUp(); // standing is default // standing is default
player.broadcastKarma(); // include UserInfo player.standUp();
// include UserInfo
player.broadcastKarma();
// Engage and notify Partner // Engage and notify Partner
if (Config.ALLOW_WEDDING) if (Config.ALLOW_WEDDING)
@@ -237,7 +239,7 @@ public class EnterWorld implements IClientIncomingPacket
player.getMacroses().sendUpdate(); player.getMacroses().sendUpdate();
// Send packets info // Send packets info
player.sendPacket(new ClientSetTime()); // SetClientTime player.sendPacket(new ClientSetTime());
player.sendPacket(new UserInfo(player)); player.sendPacket(new UserInfo(player));
player.sendPacket(new HennaInfo(player)); player.sendPacket(new HennaInfo(player));
player.sendPacket(new FriendList(player)); player.sendPacket(new FriendList(player));
@@ -271,8 +273,6 @@ public class EnterWorld implements IClientIncomingPacket
PetitionManager.getInstance().checkPetitionMessages(player); PetitionManager.getInstance().checkPetitionMessages(player);
// Send user info again .. just like the real client
// sendPacket(ui);
if ((player.getClanId() != 0) && (player.getClan() != null)) if ((player.getClanId() != 0) && (player.getClan() != null))
{ {
player.sendPacket(new PledgeShowMemberListAll(player.getClan(), player)); player.sendPacket(new PledgeShowMemberListAll(player.getClan(), player));

View File

@@ -56,6 +56,12 @@ public class RequestDropItem implements IClientIncomingPacket
@Override @Override
public void run(GameClient client) public void run(GameClient client)
{ {
// Flood protect drop to avoid packet lag
if (!client.getFloodProtectors().canDropItem())
{
return;
}
final Player player = client.getPlayer(); final Player player = client.getPlayer();
if ((player == null) || player.isDead()) if ((player == null) || player.isDead())
{ {
@@ -75,12 +81,6 @@ public class RequestDropItem implements IClientIncomingPacket
return; return;
} }
// Flood protect drop to avoid packet lag
if (!client.getFloodProtectors().canDropItem())
{
return;
}
final Item item = player.getInventory().getItemByObjectId(_objectId); final Item item = player.getInventory().getItemByObjectId(_objectId);
if ((item == null) || (_count == 0) || !player.validateItemManipulation(_objectId, "drop")) if ((item == null) || (_count == 0) || !player.validateItemManipulation(_objectId, "drop"))
{ {
@@ -107,6 +107,12 @@ public class RequestDropItem implements IClientIncomingPacket
return; return;
} }
// Don't allow if it's flying
if (player.isFlying())
{
return;
}
if (_count > item.getCount()) if (_count > item.getCount())
{ {
player.sendPacket(SystemMessageId.THIS_ITEM_CANNOT_BE_DISCARDED); player.sendPacket(SystemMessageId.THIS_ITEM_CANNOT_BE_DISCARDED);

View File

@@ -27,6 +27,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.type.WeaponType; import org.l2jmobius.gameserver.model.item.type.WeaponType;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
import org.l2jmobius.gameserver.network.serverpackets.EnchantResult; import org.l2jmobius.gameserver.network.serverpackets.EnchantResult;
import org.l2jmobius.gameserver.network.serverpackets.InventoryUpdate; import org.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
import org.l2jmobius.gameserver.network.serverpackets.ItemList; import org.l2jmobius.gameserver.network.serverpackets.ItemList;
@@ -132,7 +133,8 @@ public class RequestEnchantItem implements IClientIncomingPacket
if (player.getActiveTradeList() != null) if (player.getActiveTradeList() != null)
{ {
player.cancelActiveTrade(); player.cancelActiveTrade();
player.sendMessage("Your trade canceled"); player.sendMessage("Your trade was cancelled.");
player.sendPacket(ActionFailed.STATIC_PACKET);
return; return;
} }
@@ -141,6 +143,7 @@ public class RequestEnchantItem implements IClientIncomingPacket
{ {
player.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITIONS); player.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITIONS);
player.setActiveEnchantItem(null); player.setActiveEnchantItem(null);
player.sendPacket(ActionFailed.STATIC_PACKET);
return; return;
} }
@@ -150,6 +153,20 @@ public class RequestEnchantItem implements IClientIncomingPacket
return; return;
} }
if ((player.getPrivateStoreType() != 0) || player.isInStoreMode())
{
player.sendPacket(SystemMessageId.ITEMS_CANNOT_BE_DISCARDED_WHILE_IN_PRIVATE_STORE_STATUS);
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
if ((player.getActiveWarehouse() != null) || (player.getActiveTradeList() != null))
{
player.sendMessage("You can't enchant items when you got active warehouse or active trade.");
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
final Item item = player.getInventory().getItemByObjectId(_objectId); final Item item = player.getInventory().getItemByObjectId(_objectId);
Item scroll = player.getActiveEnchantItem(); Item scroll = player.getActiveEnchantItem();
player.setActiveEnchantItem(null); player.setActiveEnchantItem(null);

View File

@@ -25,6 +25,7 @@ import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.instance.Fisherman; import org.l2jmobius.gameserver.model.actor.instance.Fisherman;
import org.l2jmobius.gameserver.model.actor.instance.Merchant; import org.l2jmobius.gameserver.model.actor.instance.Merchant;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.instance.Item.ItemLocation;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed; import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@@ -139,10 +140,9 @@ public class RequestSellItem implements IClientIncomingPacket
return; return;
} }
Item item = player.checkItemManipulation(objectId, count, "sell");
// Check Item // Check Item
if ((item == null) || !item.getItem().isSellable()) final Item item = player.checkItemManipulation(objectId, count, "sell");
if ((item == null) || !item.getItem().isSellable() || (item.getItemLocation() != ItemLocation.INVENTORY))
{ {
continue; continue;
} }

View File

@@ -23,6 +23,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.instance.Item.ItemLocation;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
/** /**
@@ -41,6 +42,7 @@ public class SellList implements IClientOutgoingPacket
for (Item item : _player.getInventory().getItems()) for (Item item : _player.getInventory().getItems())
{ {
if ((item != null) && !item.isEquipped() && // Not equipped if ((item != null) && !item.isEquipped() && // Not equipped
(item.getItemLocation() == ItemLocation.INVENTORY) && // exploit fix
item.getItem().isSellable() && // Item is sellable item.getItem().isSellable() && // Item is sellable
(item.getItem().getItemId() != 57) && // Adena is not sellable (item.getItem().getItemId() != 57) && // Adena is not sellable
((_player.getPet() == null) || // Pet not summoned or ((_player.getPet() == null) || // Pet not summoned or

View File

@@ -27,6 +27,7 @@ import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CastleManorManager.CropProcure; import org.l2jmobius.gameserver.instancemanager.CastleManorManager.CropProcure;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.instance.Item.ItemLocation;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
public class SellListProcure implements IClientOutgoingPacket public class SellListProcure implements IClientOutgoingPacket
@@ -46,7 +47,7 @@ public class SellListProcure implements IClientOutgoingPacket
for (CropProcure c : _procureList) for (CropProcure c : _procureList)
{ {
final Item item = _player.getInventory().getItemByItemId(c.getId()); final Item item = _player.getInventory().getItemByItemId(c.getId());
if ((item != null) && (c.getAmount() > 0)) if ((item != null) && (c.getAmount() > 0) && (item.getItemLocation() == ItemLocation.INVENTORY))
{ {
_sellList.put(item, c.getAmount()); _sellList.put(item, c.getAmount());
} }

View File

@@ -130,13 +130,20 @@ public class CastleWarehouse extends Folk
@Override @Override
public void onBypassFeedback(Player player, String command) public void onBypassFeedback(Player player, String command)
{ {
if (player.getActiveEnchantItem() != null) if ((player.getActiveEnchantItem() != null) || (player.getActiveTradeList() != null))
{ {
LOGGER.info("Player " + player.getName() + " trying to use enchant exploit, ban this player!"); LOGGER.info("Player " + player.getName() + " trying to use enchant exploit, ban this player!");
player.closeNetConnection(); player.closeNetConnection();
return; return;
} }
if ((player.getPrivateStoreType() != 0) || player.isInStoreMode())
{
player.sendPacket(SystemMessageId.ITEMS_CANNOT_BE_DISCARDED_WHILE_IN_PRIVATE_STORE_STATUS);
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
if (command.startsWith("WithdrawP")) if (command.startsWith("WithdrawP"))
{ {
showRetrieveWindow(player); showRetrieveWindow(player);

View File

@@ -134,10 +134,12 @@ public class EnterWorld implements IClientIncomingPacket
// Set online status // Set online status
player.setOnlineStatus(true); player.setOnlineStatus(true);
// running is default
player.setRunning(); // running is default player.setRunning();
player.standUp(); // standing is default // standing is default
player.broadcastKarma(); // include UserInfo player.standUp();
// include UserInfo
player.broadcastKarma();
// Engage and notify Partner // Engage and notify Partner
if (Config.ALLOW_WEDDING) if (Config.ALLOW_WEDDING)
@@ -260,7 +262,7 @@ public class EnterWorld implements IClientIncomingPacket
player.getMacroses().sendUpdate(); player.getMacroses().sendUpdate();
// Send packets info // Send packets info
player.sendPacket(new ClientSetTime()); // SetClientTime player.sendPacket(new ClientSetTime());
player.sendPacket(new UserInfo(player)); player.sendPacket(new UserInfo(player));
player.sendPacket(new HennaInfo(player)); player.sendPacket(new HennaInfo(player));
player.sendPacket(new FriendList(player)); player.sendPacket(new FriendList(player));
@@ -294,8 +296,6 @@ public class EnterWorld implements IClientIncomingPacket
PetitionManager.getInstance().checkPetitionMessages(player); PetitionManager.getInstance().checkPetitionMessages(player);
// Send user info again .. just like the real client
// sendPacket(ui);
if ((player.getClanId() != 0) && (player.getClan() != null)) if ((player.getClanId() != 0) && (player.getClan() != null))
{ {
player.sendPacket(new PledgeShowMemberListAll(player.getClan(), player)); player.sendPacket(new PledgeShowMemberListAll(player.getClan(), player));

View File

@@ -57,6 +57,12 @@ public class RequestDropItem implements IClientIncomingPacket
@Override @Override
public void run(GameClient client) public void run(GameClient client)
{ {
// Flood protect drop to avoid packet lag
if (!client.getFloodProtectors().canDropItem())
{
return;
}
final Player player = client.getPlayer(); final Player player = client.getPlayer();
if ((player == null) || player.isDead()) if ((player == null) || player.isDead())
{ {
@@ -76,12 +82,6 @@ public class RequestDropItem implements IClientIncomingPacket
return; return;
} }
// Flood protect drop to avoid packet lag
if (!client.getFloodProtectors().canDropItem())
{
return;
}
final Item item = player.getInventory().getItemByObjectId(_objectId); final Item item = player.getInventory().getItemByObjectId(_objectId);
if ((item == null) || (_count == 0) || !player.validateItemManipulation(_objectId, "drop")) if ((item == null) || (_count == 0) || !player.validateItemManipulation(_objectId, "drop"))
{ {
@@ -114,6 +114,12 @@ public class RequestDropItem implements IClientIncomingPacket
return; return;
} }
// Don't allow if it's flying
if (player.isFlying())
{
return;
}
// Cursed Weapons cannot be dropped // Cursed Weapons cannot be dropped
if (CursedWeaponsManager.getInstance().isCursed(item.getItemId())) if (CursedWeaponsManager.getInstance().isCursed(item.getItemId()))
{ {

View File

@@ -27,6 +27,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.type.WeaponType; import org.l2jmobius.gameserver.model.item.type.WeaponType;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
import org.l2jmobius.gameserver.network.serverpackets.EnchantResult; import org.l2jmobius.gameserver.network.serverpackets.EnchantResult;
import org.l2jmobius.gameserver.network.serverpackets.InventoryUpdate; import org.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
import org.l2jmobius.gameserver.network.serverpackets.ItemList; import org.l2jmobius.gameserver.network.serverpackets.ItemList;
@@ -132,7 +133,8 @@ public class RequestEnchantItem implements IClientIncomingPacket
if (player.getActiveTradeList() != null) if (player.getActiveTradeList() != null)
{ {
player.cancelActiveTrade(); player.cancelActiveTrade();
player.sendMessage("Your trade canceled"); player.sendMessage("Your trade was cancelled.");
player.sendPacket(ActionFailed.STATIC_PACKET);
return; return;
} }
@@ -141,6 +143,7 @@ public class RequestEnchantItem implements IClientIncomingPacket
{ {
player.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITIONS); player.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITIONS);
player.setActiveEnchantItem(null); player.setActiveEnchantItem(null);
player.sendPacket(ActionFailed.STATIC_PACKET);
return; return;
} }
@@ -150,6 +153,20 @@ public class RequestEnchantItem implements IClientIncomingPacket
return; return;
} }
if ((player.getPrivateStoreType() != 0) || player.isInStoreMode())
{
player.sendPacket(SystemMessageId.ITEMS_CANNOT_BE_DISCARDED_WHILE_IN_PRIVATE_STORE_STATUS);
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
if ((player.getActiveWarehouse() != null) || (player.getActiveTradeList() != null))
{
player.sendMessage("You can't enchant items when you got active warehouse or active trade.");
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
final Item item = player.getInventory().getItemByObjectId(_objectId); final Item item = player.getInventory().getItemByObjectId(_objectId);
Item scroll = player.getActiveEnchantItem(); Item scroll = player.getActiveEnchantItem();
player.setActiveEnchantItem(null); player.setActiveEnchantItem(null);

View File

@@ -25,6 +25,7 @@ import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.instance.Fisherman; import org.l2jmobius.gameserver.model.actor.instance.Fisherman;
import org.l2jmobius.gameserver.model.actor.instance.Merchant; import org.l2jmobius.gameserver.model.actor.instance.Merchant;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.instance.Item.ItemLocation;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed; import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@@ -139,10 +140,9 @@ public class RequestSellItem implements IClientIncomingPacket
return; return;
} }
Item item = player.checkItemManipulation(objectId, count, "sell");
// Check Item // Check Item
if ((item == null) || !item.getItem().isSellable()) final Item item = player.checkItemManipulation(objectId, count, "sell");
if ((item == null) || !item.getItem().isSellable() || (item.getItemLocation() != ItemLocation.INVENTORY))
{ {
continue; continue;
} }

View File

@@ -23,6 +23,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.instance.Item.ItemLocation;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
/** /**
@@ -41,6 +42,7 @@ public class SellList implements IClientOutgoingPacket
for (Item item : _player.getInventory().getItems()) for (Item item : _player.getInventory().getItems())
{ {
if ((item != null) && !item.isEquipped() && // Not equipped if ((item != null) && !item.isEquipped() && // Not equipped
(item.getItemLocation() == ItemLocation.INVENTORY) && // exploit fix
item.getItem().isSellable() && // Item is sellable item.getItem().isSellable() && // Item is sellable
(item.getItem().getItemId() != 57) && // Adena is not sellable (item.getItem().getItemId() != 57) && // Adena is not sellable
((_player.getPet() == null) || // Pet not summoned or ((_player.getPet() == null) || // Pet not summoned or

View File

@@ -27,6 +27,7 @@ import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CastleManorManager.CropProcure; import org.l2jmobius.gameserver.instancemanager.CastleManorManager.CropProcure;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.instance.Item; import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.instance.Item.ItemLocation;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
public class SellListProcure implements IClientOutgoingPacket public class SellListProcure implements IClientOutgoingPacket
@@ -46,7 +47,7 @@ public class SellListProcure implements IClientOutgoingPacket
for (CropProcure c : _procureList) for (CropProcure c : _procureList)
{ {
final Item item = _player.getInventory().getItemByItemId(c.getId()); final Item item = _player.getInventory().getItemByItemId(c.getId());
if ((item != null) && (c.getAmount() > 0)) if ((item != null) && (c.getAmount() > 0) && (item.getItemLocation() == ItemLocation.INVENTORY))
{ {
_sellList.put(item, c.getAmount()); _sellList.put(item, c.getAmount());
} }