public void Read(RakNet.BitStream stream, RakNet.Packet packet, Server server) { byte type = 0; int itemID = 0, playerID = 0, mobContainerID, amount = 0; stream.Read(out type); stream.Read(out playerID); stream.Read(out mobContainerID); stream.Read(out itemID); if (!sWorld.VobDict.ContainsKey(playerID)) { throw new Exception("Player ID was not found: " + playerID); } NPCProto npc = (NPCProto)sWorld.VobDict[playerID]; if (!sWorld.VobDict.ContainsKey(mobContainerID)) { throw new Exception("MobContainer ID was not found: " + mobContainerID); } IContainer mobContainer = (IContainer)sWorld.VobDict[mobContainerID]; ContainerItemChanged cic = (ContainerItemChanged)type; if (cic == ContainerItemChanged.itemRemoved) { stream.Read(out amount); if (!sWorld.VobDict.ContainsKey(itemID)) { throw new Exception("Item ID was not found: " + itemID); } Item item = (Item)sWorld.VobDict[itemID]; if (item.ItemInstance.Flags.HasFlag(Flags.ITEM_MULTI)) { if (item.Amount - amount <= 0) { Item itemInInventory = npc.getItemByInstance(item.ItemInstance); if (itemInInventory == null) { itemInInventory = item; item.ScriptingProto.toContainer(npc.ScriptingNPC); } else { itemInInventory.ScriptingProto.Amount += amount; item.ScriptingProto.Amount = 0; } UpdateMobContainer(amount, npc, mobContainer, itemInInventory); } else { Item itemInInventory = npc.HasItem(item.ItemInstance.ID); if (itemInInventory == null) { itemInInventory = npc.ScriptingNPC.addItem(item.ItemInstance.ScriptingProto, amount).ProtoItem; item.ScriptingProto.Amount -= amount; } else { itemInInventory.ScriptingProto.Amount += amount; item.ScriptingProto.Amount -= amount; } UpdateMobContainer(amount, npc, mobContainer, itemInInventory); } } else { item.ScriptingProto.toContainer(npc.ScriptingNPC); UpdateMobContainer(item.Amount, npc, mobContainer, item); } } else if (cic == ContainerItemChanged.itemInsertedOld) { if (!sWorld.VobDict.ContainsKey(itemID)) { throw new Exception("Item ID was not found: " + itemID); } Item item = (Item)sWorld.VobDict[itemID]; if (item.ItemInstance.Flags.HasFlag(Flags.ITEM_MULTI)) { Item gI = null; List <Item> imList = null; if (mobContainer is MobContainer) { imList = ((MobContainer)mobContainer).itemList; } else { imList = ((NPCProto)mobContainer).ItemList; } foreach (Item i in imList) { if (i.ItemInstance == item.ItemInstance) { gI = i; break; } } if (gI == null) { if (mobContainer is MobContainer) { item.ScriptingProto.toContainer((Scripting.Objects.Mob.MobContainer)((MobContainer)mobContainer).ScriptingVob); } else if (mobContainer is NPCProto) { item.ScriptingProto.toContainer(((NPCProto)mobContainer).ScriptingNPC); } UpdateMobContainer(item.Amount, npc, mobContainer, item); } else { int _amount = item.Amount; gI.ScriptingProto.Amount += item.Amount; item.ScriptingProto.Amount = 0; UpdateMobContainer(_amount, npc, mobContainer, gI); } } else { if (mobContainer is MobContainer) { item.ScriptingProto.toContainer((Scripting.Objects.Mob.MobContainer)((MobContainer)mobContainer).ScriptingVob); } else if (mobContainer is NPCProto) { item.ScriptingProto.toContainer(((NPCProto)mobContainer).ScriptingNPC); } UpdateMobContainer(item.Amount, npc, mobContainer, item); } } else if (cic == ContainerItemChanged.itemInsertedNew) { if (!ItemInstance.ItemInstanceDict.ContainsKey(itemID)) { throw new Exception("Iteminstance ID was not found: " + itemID); } ItemInstance item = (ItemInstance)ItemInstance.ItemInstanceDict[itemID]; Item newItem = null; if (mobContainer is MobContainer) { newItem = ((Scripting.Objects.Mob.MobContainer)((MobContainer)mobContainer).ScriptingVob).addItem(item.ScriptingProto, 1).ProtoItem; } else if (mobContainer is NPCProto) { newItem = (((NPCProto)mobContainer).ScriptingNPC).addItem(item.ScriptingProto, 1).ProtoItem; } Item i = npc.getItemByInstance(item); if (i == null) { throw new Exception("NPC has not the item: " + item.ID); } i.ScriptingProto.Amount -= 1; UpdateMobContainer(1, npc, mobContainer, newItem); } }