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)