Index: /java/config/server.properties =================================================================== --- /java/config/server.properties (revision 1695) +++ /java/config/server.properties (working copy) @@ -206,6 +206,10 @@ # Show L2Monster level and aggro, ServerSideNpcName must be enabled ServerSideNpcNameWithLvl = False +# Forces full item inventory packet to be sent for any item change +# Note: This can increase network traffic +ForceInventoryUpdate = False + AutoDeleteInvalidQuestData = False # Day/Night Status Index: /java/net/sf/l2j/Config.java =================================================================== --- /java/net/sf/l2j/Config.java (revision 1695) +++ /java/net/sf/l2j/Config.java (working copy) @@ -341,6 +341,7 @@ public static String NEW_NODE_TYPE; public static boolean SERVER_SIDE_NPC_NAME; public static boolean SERVER_SIDE_NPC_NAME_WITH_LVL; + public static boolean FORCE_INVENTORY_UPDATE; public static boolean ALLOW_GUARDS; public static boolean ALLOW_CLASS_MASTERS; public static int IP_UPDATE_TIME; @@ -646,6 +647,8 @@ SERVER_SIDE_NPC_NAME = Boolean.valueOf(serverSettings.getProperty("ServerSideNpcName", "False")); SERVER_SIDE_NPC_NAME_WITH_LVL = Boolean.valueOf(serverSettings.getProperty("ServerSideNpcNameWithLvl", "False")); + + FORCE_INVENTORY_UPDATE = Boolean.valueOf(serverSettings.getProperty("ForceInventoryUpdate", "False")); AUTODELETE_INVALID_QUEST_DATA = Boolean.valueOf(serverSettings.getProperty("AutoDeleteInvalidQuestData", "False")); THREAD_P_HIGH = Integer.parseInt(serverSettings.getProperty("ThreadPoolSizeHigh", "4")); @@ -1164,6 +1167,8 @@ else if (pName.equalsIgnoreCase("ServerSideNpcName")) SERVER_SIDE_NPC_NAME = Boolean.valueOf(pValue); else if (pName.equalsIgnoreCase("ServerSideNpcNameWithLvl")) SERVER_SIDE_NPC_NAME_WITH_LVL = Boolean.valueOf(pValue); + else if (pName.equalsIgnoreCase("ForceInventoryUpdate")) FORCE_INVENTORY_UPDATE = Boolean.valueOf(pValue); + else if (pName.equalsIgnoreCase("AutoDeleteInvalidQuestData")) AUTODELETE_INVALID_QUEST_DATA = Boolean.valueOf(pValue); else if (pName.equalsIgnoreCase("MaximumOnlineUsers")) MAXIMUM_ONLINE_USERS = Integer.parseInt(pValue); Index: /java/net/sf/l2j/gameserver/clientpackets/RequestSellItem.java =================================================================== --- /java/net/sf/l2j/gameserver/clientpackets/RequestSellItem.java (revision 1695) +++ /java/net/sf/l2j/gameserver/clientpackets/RequestSellItem.java (working copy) @@ -31,6 +31,7 @@ import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.serverpackets.ActionFailed; import net.sf.l2j.gameserver.serverpackets.InventoryUpdate; +import net.sf.l2j.gameserver.serverpackets.ItemList; import net.sf.l2j.gameserver.serverpackets.StatusUpdate; import net.sf.l2j.gameserver.serverpackets.SystemMessage; import net.sf.l2j.gameserver.util.Util; @@ -115,7 +116,7 @@ long totalPrice = 0; // Proceed the sell - InventoryUpdate playerIU = new InventoryUpdate(); + InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); for (int i = 0; i < _count; i++) { int objectId = _items[i * 3 + 0]; @@ -141,7 +142,7 @@ } item = player.getInventory().destroyItem("Sell", objectId, count, player, null); - playerIU.addItem(item); + if (playerIU != null) playerIU.addItem(item); /* TODO: Disabled until Leaseholders are rewritten ;-) int price = item.getReferencePrice()*(int)count/2; @@ -167,7 +168,8 @@ player.addAdena("Sell", (int)totalPrice, merchant, false); // Send inventory update packet - sendPacket(playerIU); + if (playerIU != null) player.sendPacket(playerIU); + else player.sendPacket(new ItemList(player, false)); // Update current load as well StatusUpdate su = new StatusUpdate(player.getObjectId()); Index: /java/net/sf/l2j/gameserver/clientpackets/RequestCrystallizeItem.java =================================================================== --- /java/net/sf/l2j/gameserver/clientpackets/RequestCrystallizeItem.java (revision 1695) +++ /java/net/sf/l2j/gameserver/clientpackets/RequestCrystallizeItem.java (working copy) @@ -21,6 +21,7 @@ import java.nio.ByteBuffer; import java.util.logging.Logger; +import net.sf.l2j.Config; import net.sf.l2j.gameserver.ClientThread; import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.L2Skill; @@ -29,6 +30,7 @@ import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.serverpackets.ActionFailed; import net.sf.l2j.gameserver.serverpackets.InventoryUpdate; +import net.sf.l2j.gameserver.serverpackets.ItemList; import net.sf.l2j.gameserver.serverpackets.StatusUpdate; import net.sf.l2j.gameserver.serverpackets.SystemMessage; import net.sf.l2j.gameserver.templates.L2Item; @@ -178,20 +180,19 @@ L2ItemInstance createditem = activeChar.getInventory().addItem("Crystalize", crystalId, crystalAmount, activeChar, itemToRemove); //send inventory update - InventoryUpdate iu = new InventoryUpdate(); - if (removedItem.getCount() == 0) { - iu.addRemovedItem(removedItem); - } else { - iu.addModifiedItem(removedItem); + if (!Config.FORCE_INVENTORY_UPDATE) + { + InventoryUpdate iu = new InventoryUpdate(); + if (removedItem.getCount() == 0) iu.addRemovedItem(removedItem); + else iu.addModifiedItem(removedItem); + + if (createditem.getCount() != crystalAmount) iu.addModifiedItem(createditem); + else iu.addNewItem(createditem); + + activeChar.sendPacket(iu); } - - if (createditem.getCount() != crystalAmount) { - iu.addModifiedItem(createditem); - } else { - iu.addNewItem(createditem); - } - activeChar.sendPacket(iu); - + else activeChar.sendPacket(new ItemList(activeChar, false)); + //status & user info StatusUpdate su = new StatusUpdate(activeChar.getObjectId()); su.addAttribute(StatusUpdate.CUR_LOAD, activeChar.getCurrentLoad()); Index: /java/net/sf/l2j/gameserver/clientpackets/SendWareHouseDepositList.java =================================================================== --- /java/net/sf/l2j/gameserver/clientpackets/SendWareHouseDepositList.java (revision 1695) +++ /java/net/sf/l2j/gameserver/clientpackets/SendWareHouseDepositList.java (working copy) @@ -31,6 +31,7 @@ import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.serverpackets.InventoryUpdate; +import net.sf.l2j.gameserver.serverpackets.ItemList; import net.sf.l2j.gameserver.serverpackets.StatusUpdate; import net.sf.l2j.gameserver.serverpackets.SystemMessage; @@ -124,7 +125,7 @@ } // Proceed to the transfer - InventoryUpdate playerIU = new InventoryUpdate(); + InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); for (int i = 0; i < _count; i++) { int objectId = _items[i * 2 + 0]; @@ -138,12 +139,16 @@ continue; } - if (oldItem.getCount() > 0 && oldItem != newItem) playerIU.addModifiedItem(oldItem); - else playerIU.addRemovedItem(oldItem); + if (playerIU != null) + { + if (oldItem.getCount() > 0 && oldItem != newItem) playerIU.addModifiedItem(oldItem); + else playerIU.addRemovedItem(oldItem); + } } // Send updated item list to the player - player.sendPacket(playerIU); + if (playerIU != null) player.sendPacket(playerIU); + else player.sendPacket(new ItemList(player, false)); // Update current load status on player StatusUpdate su = new StatusUpdate(player.getObjectId()); Index: /java/net/sf/l2j/gameserver/clientpackets/SendWareHouseWithDrawList.java =================================================================== --- /java/net/sf/l2j/gameserver/clientpackets/SendWareHouseWithDrawList.java (revision 1695) +++ /java/net/sf/l2j/gameserver/clientpackets/SendWareHouseWithDrawList.java (working copy) @@ -32,6 +32,7 @@ import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.serverpackets.InventoryUpdate; +import net.sf.l2j.gameserver.serverpackets.ItemList; import net.sf.l2j.gameserver.serverpackets.StatusUpdate; import net.sf.l2j.gameserver.serverpackets.SystemMessage; @@ -119,7 +120,7 @@ } // Proceed to the transfer - InventoryUpdate playerIU = new InventoryUpdate(); + InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); for (int i = 0; i < _count; i++) { int objectId = _items[i * 2 + 0]; @@ -135,12 +136,16 @@ continue; } - if (newItem.getCount() > count) playerIU.addModifiedItem(newItem); - else playerIU.addNewItem(newItem); + if (playerIU != null) + { + if (newItem.getCount() > count) playerIU.addModifiedItem(newItem); + else playerIU.addNewItem(newItem); + } } // Send updated item list to the player - player.sendPacket(playerIU); + if (playerIU != null) player.sendPacket(playerIU); + else player.sendPacket(new ItemList(player, false)); // Update current load status on player StatusUpdate su = new StatusUpdate(player.getObjectId()); Index: /java/net/sf/l2j/gameserver/clientpackets/RequestDestroyItem.java =================================================================== --- /java/net/sf/l2j/gameserver/clientpackets/RequestDestroyItem.java (revision 1695) +++ /java/net/sf/l2j/gameserver/clientpackets/RequestDestroyItem.java (working copy) @@ -24,6 +24,7 @@ import java.util.logging.Level; import java.util.logging.Logger; +import net.sf.l2j.Config; import net.sf.l2j.L2DatabaseFactory; import net.sf.l2j.gameserver.ClientThread; import net.sf.l2j.gameserver.model.L2ItemInstance; @@ -162,21 +163,17 @@ L2ItemInstance removedItem = activeChar.getInventory().destroyItem("Destroy", _objectId, count, activeChar, null); - InventoryUpdate iu = new InventoryUpdate(); - if (removedItem.getCount() == 0) + if (!Config.FORCE_INVENTORY_UPDATE) { - iu.addRemovedItem(removedItem); + InventoryUpdate iu = new InventoryUpdate(); + if (removedItem.getCount() == 0) iu.addRemovedItem(removedItem); + else iu.addModifiedItem(removedItem); + + //client.getConnection().sendPacket(iu); + activeChar.sendPacket(iu); } - else - { - iu.addModifiedItem(removedItem); - } - //client.getConnection().sendPacket(iu); - activeChar.sendPacket(iu); + else sendPacket(new ItemList(activeChar, true)); - ItemList il = new ItemList(activeChar, true); - sendPacket(il); - StatusUpdate su = new StatusUpdate(activeChar.getObjectId()); su.addAttribute(StatusUpdate.CUR_LOAD, activeChar.getCurrentLoad()); activeChar.sendPacket(su); Index: /java/net/sf/l2j/gameserver/clientpackets/RequestBuyItem.java =================================================================== --- /java/net/sf/l2j/gameserver/clientpackets/RequestBuyItem.java (revision 1696) +++ /java/net/sf/l2j/gameserver/clientpackets/RequestBuyItem.java (working copy) @@ -34,6 +34,7 @@ import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.serverpackets.ActionFailed; import net.sf.l2j.gameserver.serverpackets.InventoryUpdate; +import net.sf.l2j.gameserver.serverpackets.ItemList; import net.sf.l2j.gameserver.serverpackets.StatusUpdate; import net.sf.l2j.gameserver.serverpackets.SystemMessage; import net.sf.l2j.gameserver.templates.L2Item; @@ -210,7 +211,7 @@ merchant.getCastle().addToTreasury(tax); // Proceed the purchase - InventoryUpdate playerIU = new InventoryUpdate(); + InventoryUpdate playerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); for (int i=0; i < _count; i++) { int itemId = _items[i * 2 + 0]; @@ -219,8 +220,11 @@ // Add item to Inventory and adjust update packet L2ItemInstance item = player.getInventory().addItem("Buy", itemId, count, player, merchant); - if (item.getCount() > count) playerIU.addModifiedItem(item); - else playerIU.addNewItem(item); + if (playerIU != null) + { + if (item.getCount() > count) playerIU.addModifiedItem(item); + else playerIU.addNewItem(item); + } /* TODO: Disabled until Leaseholders are rewritten ;-) // Update Leaseholder list @@ -244,7 +248,8 @@ */ } // Send update packets - player.sendPacket(playerIU); + if (playerIU != null) player.sendPacket(playerIU); + else player.sendPacket(new ItemList(player, false)); StatusUpdate su = new StatusUpdate(player.getObjectId()); su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad()); Index: /java/net/sf/l2j/gameserver/clientpackets/RequestEnchantItem.java =================================================================== --- /java/net/sf/l2j/gameserver/clientpackets/RequestEnchantItem.java (revision 1695) +++ /java/net/sf/l2j/gameserver/clientpackets/RequestEnchantItem.java (working copy) @@ -181,32 +181,31 @@ activeChar.broadcastUserInfo(); } - L2ItemInstance destroyItem = activeChar.getInventory().destroyItem("Enchant", item, activeChar, null); - - InventoryUpdate iu = new InventoryUpdate(); - if (destroyItem.getCount() == 0) - { - iu.addRemovedItem(destroyItem); - } - else - { - iu.addModifiedItem(destroyItem); - } - activeChar.sendPacket(iu); - // Add 10% to crystal count for each enchant level (starting at 67% for enchant lvl 3) int count = item.getItem().getCrystalCount() * (37 + 10*item.getEnchantLevel()) / 100; if (count < 1) count = 1; + L2ItemInstance destroyItem = activeChar.getInventory().destroyItem("Enchant", item, activeChar, null); + if (destroyItem == null) return; + L2ItemInstance crystals = activeChar.getInventory().addItem("Enchant", crystalId, count, activeChar, destroyItem); + SystemMessage sm2 = new SystemMessage(SystemMessage.EARNED_S2_S1_s); sm2.addItemName(crystals.getItemId()); sm2.addNumber(count); activeChar.sendPacket(sm2); + + if (!Config.FORCE_INVENTORY_UPDATE) + { + InventoryUpdate iu = new InventoryUpdate(); + if (destroyItem.getCount() == 0) iu.addRemovedItem(destroyItem); + else iu.addModifiedItem(destroyItem); + iu.addItem(crystals); + + activeChar.sendPacket(iu); + } + else activeChar.sendPacket(new ItemList(activeChar, true)); - ItemList il = new ItemList(activeChar, true); - sendPacket(il); - StatusUpdate su = new StatusUpdate(activeChar.getObjectId()); su.addAttribute(StatusUpdate.CUR_LOAD, activeChar.getCurrentLoad()); activeChar.sendPacket(su); Index: /java/net/sf/l2j/gameserver/model/TradeList.java =================================================================== --- /java/net/sf/l2j/gameserver/model/TradeList.java (revision 1695) +++ /java/net/sf/l2j/gameserver/model/TradeList.java (working copy) @@ -23,6 +23,7 @@ import javolution.util.FastList; +import net.sf.l2j.Config; import net.sf.l2j.gameserver.ItemTable; import net.sf.l2j.gameserver.BasePacket.ItemRequest; import net.sf.l2j.gameserver.model.L2ItemInstance; @@ -30,6 +31,7 @@ import net.sf.l2j.gameserver.model.L2World; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.serverpackets.InventoryUpdate; +import net.sf.l2j.gameserver.serverpackets.ItemList; import net.sf.l2j.gameserver.serverpackets.StatusUpdate; import net.sf.l2j.gameserver.serverpackets.SystemMessage; import net.sf.l2j.gameserver.templates.L2Item; @@ -448,11 +450,17 @@ if (newItem == null) return false; // Add changes to inventory update packets - if (oldItem.getCount() > 0 && oldItem != newItem) ownerIU.addModifiedItem(oldItem); - else ownerIU.addRemovedItem(oldItem); + if (ownerIU != null) + { + if (oldItem.getCount() > 0 && oldItem != newItem) ownerIU.addModifiedItem(oldItem); + else ownerIU.addRemovedItem(oldItem); + } - if (newItem.getCount() > titem.getCount()) partnerIU.addModifiedItem(newItem); - else partnerIU.addNewItem(newItem); + if (partnerIU != null) + { + if (newItem.getCount() > titem.getCount()) partnerIU.addModifiedItem(newItem); + else partnerIU.addNewItem(newItem); + } } return true; } @@ -463,17 +471,21 @@ private void doExchange(TradeList partnerList) { // Prepare inventory update packet - InventoryUpdate ownerIU = new InventoryUpdate(); - InventoryUpdate partnerIU = new InventoryUpdate(); + InventoryUpdate ownerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); + InventoryUpdate partnerIU = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); // Transfer items partnerList.TransferItems(this.getOwner(), partnerIU, ownerIU); this.TransferItems(partnerList.getOwner(), ownerIU, partnerIU); // Send inventory update packet - _owner.sendPacket(ownerIU); - _partner.sendPacket(partnerIU); + if (ownerIU != null) _owner.sendPacket(ownerIU); + else _owner.sendPacket(new ItemList(_owner, false)); + if (partnerIU != null) _partner.sendPacket(partnerIU); + else _partner.sendPacket(new ItemList(_partner, false)); + + // Update current load as well StatusUpdate playerSU = new StatusUpdate(_owner.getObjectId()); playerSU.addAttribute(StatusUpdate.CUR_LOAD, _owner.getCurrentLoad()); Index: /java/net/sf/l2j/gameserver/handler/itemhandlers/Harvester.java =================================================================== --- /java/net/sf/l2j/gameserver/handler/itemhandlers/Harvester.java (revision 1695) +++ /java/net/sf/l2j/gameserver/handler/itemhandlers/Harvester.java (working copy) @@ -2,6 +2,7 @@ import java.util.Random; +import net.sf.l2j.Config; import net.sf.l2j.gameserver.handler.IItemHandler; import net.sf.l2j.gameserver.model.L2Attackable; import net.sf.l2j.gameserver.model.L2ItemInstance; @@ -9,6 +10,7 @@ import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance; import net.sf.l2j.gameserver.serverpackets.InventoryUpdate; +import net.sf.l2j.gameserver.serverpackets.ItemList; import net.sf.l2j.gameserver.serverpackets.SystemMessage; public class Harvester implements IItemHandler @@ -19,7 +21,7 @@ public void useItem(L2PlayableInstance playable, L2ItemInstance _item) { - InventoryUpdate iu = new InventoryUpdate(); + InventoryUpdate iu = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); player = (L2PcInstance)playable; if(player.getTarget() == null || !(player.getTarget() instanceof L2MonsterInstance)) @@ -45,7 +47,7 @@ else { L2ItemInstance item = player.getInventory().addItem("Manor", ritem.getItemId(), ritem.getCount(), player, target); - iu.addItem(item); + if (iu != null) iu.addItem(item); send = true; total += ritem.getCount(); } @@ -56,7 +58,9 @@ smsg.addNumber(total); smsg.addItemName(cropId); player.sendPacket(smsg); - player.sendPacket(iu); + + if (iu != null) player.sendPacket(iu); + else player.sendPacket(new ItemList(player, false)); } } } Index: /java/net/sf/l2j/gameserver/handler/skillhandlers/Sweep.java =================================================================== --- /java/net/sf/l2j/gameserver/handler/skillhandlers/Sweep.java (revision 1695) +++ /java/net/sf/l2j/gameserver/handler/skillhandlers/Sweep.java (working copy) @@ -18,6 +18,7 @@ */ package net.sf.l2j.gameserver.handler.skillhandlers; +import net.sf.l2j.Config; import net.sf.l2j.gameserver.handler.ISkillHandler; import net.sf.l2j.gameserver.model.L2Attackable; import net.sf.l2j.gameserver.model.L2Character; @@ -27,6 +28,7 @@ import net.sf.l2j.gameserver.model.L2Skill.SkillType; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.serverpackets.InventoryUpdate; +import net.sf.l2j.gameserver.serverpackets.ItemList; import net.sf.l2j.gameserver.serverpackets.SystemMessage; /** @@ -48,7 +50,7 @@ } L2PcInstance player = (L2PcInstance)activeChar; - InventoryUpdate iu = new InventoryUpdate(); + InventoryUpdate iu = Config.FORCE_INVENTORY_UPDATE ? null : new InventoryUpdate(); boolean send = false; for(int index = 0;index < targets.length;index++) @@ -67,7 +69,7 @@ else { L2ItemInstance item = player.getInventory().addItem("Sweep", ritem.getItemId(), ritem.getCount(), player, target); - iu.addItem(item); + if (iu != null) iu.addItem(item); send = true; SystemMessage smsg = new SystemMessage(SystemMessage.YOU_PICKED_UP_S1_S2); // you picked up $s1$s2 @@ -80,7 +82,11 @@ target.endDecayTask(); } - if (send) player.sendPacket(iu); + if (send) + { + if (iu != null) player.sendPacket(iu); + else player.sendPacket(new ItemList(player, false)); + } } public SkillType[] getSkillIds()