L2JMobius

C6 Prevent uneccesary ownerId when an item is transfered to a pet

G-hamsteR · 1 · 505

Online G-hamsteR

  • Viscount
  • *****
    • Posts: 333
This is not a bug, because the item gets transferred to the player's inventory with each restart, but I find no meaning to storing an item to a pet's current ID.

I am using foreign keys to store all my items, and this is how I found out about this. I was getting an error that the ownerId's value was wrong since there was no reference inside the characters table.

This is my solution.

Code: [Select]
diff --git a/java/org/l2jmobius/gameserver/model/item/instance/Item.java b/java/org/l2jmobius/gameserver/model/item/instance/Item.java
index c2eac88..ad8d13c 100644
--- a/java/org/l2jmobius/gameserver/model/item/instance/Item.java
+++ b/java/org/l2jmobius/gameserver/model/item/instance/Item.java
@@ -40,6 +40,7 @@
 import org.l2jmobius.gameserver.model.WorldObject;
 import org.l2jmobius.gameserver.model.actor.Creature;
 import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.actor.instance.Pet;
 import org.l2jmobius.gameserver.model.actor.knownlist.NullKnownList;
 import org.l2jmobius.gameserver.model.item.Armor;
 import org.l2jmobius.gameserver.model.item.EtcItem;
@@ -1147,8 +1148,15 @@
 
  try (Connection con = DatabaseFactory.getConnection())
  {
+ int storedOwner = _ownerId;
+ final WorldObject ownerObject = World.getInstance().findObject(_ownerId);
+ if (ownerObject instanceof Pet)
+ {
+ Pet pet = (Pet) ownerObject;
+ storedOwner = pet.getOwner().getObjectId();
+ }
  final PreparedStatement statement = con.prepareStatement("UPDATE items SET owner_id=?,count=?,loc=?,loc_data=?,enchant_level=?,price_sell=?,price_buy=?,custom_type1=?,custom_type2=?,mana_left=? WHERE object_id = ?");
- statement.setInt(1, _ownerId);
+ statement.setInt(1, storedOwner);
  statement.setInt(2, _count);
  statement.setString(3, _loc.name());
  statement.setInt(4, _locData);
@@ -1182,8 +1190,15 @@
 
  try (Connection con = DatabaseFactory.getConnection())
  {
+ int storedOwner = _ownerId;
+ final WorldObject ownerObject = World.getInstance().findObject(_ownerId);
+ if (ownerObject instanceof Pet)
+ {
+ Pet pet = (Pet) ownerObject;
+ storedOwner = pet.getOwner().getObjectId();
+ }
  final PreparedStatement statement = con.prepareStatement("INSERT INTO items (owner_id,item_id,count,loc,loc_data,enchant_level,price_sell,price_buy,object_id,custom_type1,custom_type2,mana_left) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)");
- statement.setInt(1, _ownerId);
+ statement.setInt(1, storedOwner);
  statement.setInt(2, _itemId);
  statement.setInt(3, _count);
  statement.setString(4, _loc.name());