rendered paste bodyIndex: /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 StatusIndex: /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()