Index: C:/Documents and Settings/Anderson/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/model/ItemContainer.java =================================================================== --- C:/Documents and Settings/Anderson/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/model/ItemContainer.java (revision 1718) +++ C:/Documents and Settings/Anderson/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/model/ItemContainer.java (working copy) @@ -145,6 +145,11 @@ */ public synchronized L2ItemInstance addItem(String process, int itemId, int count, L2PcInstance actor, L2Object reference) { + return addItem(process, itemId, count, 0, actor, reference); + } + + public synchronized L2ItemInstance addItem(String process, int itemId, int count, int ObjectId, L2PcInstance actor, L2Object reference) + { L2ItemInstance item = getItemByItemId(itemId); // If stackable item is found in inventory just add to current quantity @@ -167,11 +172,17 @@ } if (template.isStackable()) { - item = ItemTable.getInstance().createItem(process, itemId, count, actor, reference); + if (ObjectId == 0) + item = ItemTable.getInstance().createItem(process, itemId, count, actor, reference); + else + item = ItemTable.getInstance().createItem(process, itemId, count, ObjectId, actor, reference); i = count; // End iteration } - else item = ItemTable.getInstance().createItem(process, itemId, 1, actor, reference); - + else + if (ObjectId == 0) + item = ItemTable.getInstance().createItem(process, itemId, 1, actor, reference); + else + item = ItemTable.getInstance().createItem(process, itemId, 1, ObjectId, actor, reference); item.setOwnerId(getOwnerId()); item.setLocation(getBaseLocation()); item.setLastChange((L2ItemInstance.ADDED)); @@ -226,6 +237,7 @@ public synchronized L2ItemInstance transferItem(String process, int objectId, int count, ItemContainer target, L2PcInstance actor, L2Object reference) { L2ItemInstance sourceitem = getItemByObjectId(objectId); + int sourceitemcount = sourceitem.getCount(); if (sourceitem == null) return null; L2ItemInstance targetitem = sourceitem.isStackable() ? target.getItemByItemId(sourceitem.getItemId()) : null; @@ -236,8 +248,12 @@ if (sourceitem.getCount() == count && targetitem == null) { removeItem(sourceitem); - target.addItem(process, sourceitem, actor, reference); - targetitem = sourceitem; + ItemTable.getInstance().destroyItem(process, sourceitem, false, false, actor, reference); + sourceitem.updateDatabase(); + //ItemDestroy = true; + targetitem = target.addItem(process, sourceitem.getItemId(), count, objectId, actor, reference); + targetitem.setEnchantLevel(sourceitem.getEnchantLevel()); + //targetitem.setLocation() } else { @@ -246,13 +262,18 @@ else // Otherwise destroy old item { removeItem(sourceitem); - ItemTable.getInstance().destroyItem(process, sourceitem, actor, reference); + ItemTable.getInstance().destroyItem(process, sourceitem, false, false, actor, reference); + sourceitem.updateDatabase(); + //ItemDestroy = true; } if (targetitem != null) // If possible, only update counts targetitem.setCount(process, targetitem.getCount() + count, actor, reference); else // Otherwise add new item - targetitem = target.addItem(process, sourceitem.getItemId(), count, actor, reference); + if (sourceitemcount > count) + targetitem = target.addItem(process, sourceitem.getItemId(), count, actor, reference); + else + targetitem = target.addItem(process, sourceitem.getItemId(), count, objectId, actor, reference); } // Updates database Index: C:/Documents and Settings/Anderson/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/ItemTable.java =================================================================== --- C:/Documents and Settings/Anderson/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/ItemTable.java (revision 1718) +++ C:/Documents and Settings/Anderson/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/ItemTable.java (working copy) @@ -610,8 +610,22 @@ */ public L2ItemInstance createItem(String process, int itemId, int count, L2PcInstance actor, L2Object reference) { + return createItem(process, itemId, count, 0, actor, reference); + } + + public L2ItemInstance createItem(String process, int itemId, int count, L2PcInstance actor) + { + return createItem(process, itemId, count, actor, null); + } + + public L2ItemInstance createItem(String process, int itemId, int count, int objectId, L2PcInstance actor, L2Object reference) + { // Create and Init the L2ItemInstance corresponding to the Item Identifier - L2ItemInstance item = new L2ItemInstance(IdFactory.getInstance().getNextId(), itemId); + L2ItemInstance item; + if (objectId == 0) + item = new L2ItemInstance(IdFactory.getInstance().getNextId(), itemId); + else + item = new L2ItemInstance(objectId, itemId); if (Config.DEBUG) _log.fine("ItemTable: Item created oid:" + item.getObjectId()+ " itemid:" + itemId); // Add the L2ItemInstance object to _allObjects of L2world @@ -629,11 +643,6 @@ } return item; } - - public L2ItemInstance createItem(String process, int itemId, int count, L2PcInstance actor) - { - return createItem(process, itemId, count, actor, null); - } /** * Returns a dummy (fr = factice) item.

@@ -680,6 +689,11 @@ */ public void destroyItem(String process, L2ItemInstance item, L2PcInstance actor, L2Object reference) { + destroyItem(process, item, true, true, actor, reference); + } + + public void destroyItem(String process, L2ItemInstance item, boolean release, boolean destroyPet, L2PcInstance actor, L2Object reference) + { synchronized (item) { item.setCount(0); @@ -688,7 +702,7 @@ item.setLastChange(L2ItemInstance.REMOVED); L2World.getInstance().removeObject(item); - IdFactory.getInstance().releaseId(item.getObjectId()); + if (release) IdFactory.getInstance().releaseId(item.getObjectId()); if (Config.LOG_ITEMS) { @@ -724,11 +738,14 @@ } */ // Delete the pet in db - con = L2DatabaseFactory.getInstance().getConnection(); - PreparedStatement statement = con.prepareStatement("DELETE FROM pets WHERE item_obj_id=?"); - statement.setInt(1, item.getObjectId()); - statement.execute(); - statement.close(); + if (destroyPet) + { + con = L2DatabaseFactory.getInstance().getConnection(); + PreparedStatement statement = con.prepareStatement("DELETE FROM pets WHERE item_obj_id=?"); + statement.setInt(1, item.getObjectId()); + statement.execute(); + statement.close(); + } } catch (Exception e) { @@ -741,7 +758,6 @@ } } } - public void reload() { synchronized(_instance)