From 1d392a8a8a2cdc7b6ec71918ad7d03b84ab33fe3 Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Thu, 16 Sep 2021 22:15:26 +0000 Subject: [PATCH] Reuse item info for multisells that are maintainEnchantment enabled. --- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 26 ++++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 26 ++++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 25 +++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 26 ++++++++++++++++--- .../gameserver/data/xml/MultisellData.java | 2 +- .../clientpackets/MultiSellChoose.java | 25 +++++++----------- .../network/serverpackets/MultiSellList.java | 26 ++++++++++++++++--- 57 files changed, 612 insertions(+), 380 deletions(-) diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index ebc520bf09..66e8836d87 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -149,7 +149,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -291,7 +291,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -354,9 +353,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -375,9 +374,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -395,9 +394,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -500,7 +499,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setAttribute(new AttributeHolder(AttributeType.DARK, itemEnchantment.getAttributeDefence(AttributeType.DARK)), false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -510,12 +511,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -546,7 +541,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 2e3b944b49..021d5b27f5 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -65,8 +69,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -82,7 +99,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -106,7 +123,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index fb817e4ee9..7e4943e71d 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index f938dae245..cf8b56926b 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -65,8 +69,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -82,7 +99,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -106,7 +123,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index fb817e4ee9..7e4943e71d 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 8f70f3c60a..425582d286 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -67,8 +71,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -84,7 +101,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -108,7 +125,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index fb817e4ee9..7e4943e71d 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index beb976c3aa..dbc5342f6c 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index beb976c3aa..dbc5342f6c 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index beb976c3aa..dbc5342f6c 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 5d11ae2823..38c5cc6482 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 5d11ae2823..38c5cc6482 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 886497617c..ec8be38e59 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -79,13 +96,14 @@ public class MultiSellList extends AbstractItemPacket writeItemElemental(packet, itemEnchantment); writeItemEnsoulOptions(packet, itemEnchantment); packet.writeC(0x00); // 286 + packet.writeH(entry.getProducts().size()); packet.writeH(entry.getIngredients().size()); for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -110,7 +128,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 3024111d11..c987ce142c 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -318,7 +318,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -386,9 +385,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -407,9 +406,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -427,9 +426,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -553,7 +552,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -563,12 +564,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -599,7 +594,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 886497617c..ec8be38e59 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -79,13 +96,14 @@ public class MultiSellList extends AbstractItemPacket writeItemElemental(packet, itemEnchantment); writeItemEnsoulOptions(packet, itemEnchantment); packet.writeC(0x00); // 286 + packet.writeH(entry.getProducts().size()); packet.writeH(entry.getIngredients().size()); for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -110,7 +128,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 5d11ae2823..38c5cc6482 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 8f70f3c60a..425582d286 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -67,8 +71,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -84,7 +101,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -108,7 +125,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 5d11ae2823..38c5cc6482 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 5d11ae2823..38c5cc6482 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 5d11ae2823..38c5cc6482 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 5d11ae2823..38c5cc6482 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 5d11ae2823..38c5cc6482 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 1f164c6602..8c3e7052ef 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -85,7 +102,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -109,7 +126,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index 87325466bd..1628274f55 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -299,7 +299,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index ad84ca7fef..85e1130cdf 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -142,7 +142,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -284,7 +284,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -347,9 +346,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -368,9 +367,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -388,9 +387,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -493,7 +492,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setAttribute(new AttributeHolder(AttributeType.DARK, itemEnchantment.getAttributeDefence(AttributeType.DARK)), false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -503,12 +504,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -539,7 +534,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index ebed79d9f8..db9b01c9e2 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -86,7 +103,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -111,7 +128,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index f2a7c953fd..514bbdc518 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -319,7 +319,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -382,9 +381,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -403,9 +402,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -423,9 +422,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -544,7 +543,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -554,12 +555,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -590,7 +585,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 886497617c..ec8be38e59 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -79,13 +96,14 @@ public class MultiSellList extends AbstractItemPacket writeItemElemental(packet, itemEnchantment); writeItemEnsoulOptions(packet, itemEnchantment); packet.writeC(0x00); // 286 + packet.writeH(entry.getProducts().size()); packet.writeH(entry.getIngredients().size()); for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -110,7 +128,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f94b191561..9ed43a0845 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -291,7 +291,7 @@ public class MultisellData implements IXmlReader do { // send list at least once even if size = 0 - player.sendPacket(new MultiSellList(list, index)); + player.sendPacket(new MultiSellList(player, list, index)); index += PAGE_SIZE; } while (index < list.getEntries().size()); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java index 94c8ba24a8..d471561115 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/MultiSellChoose.java @@ -173,7 +173,7 @@ public class MultiSellChoose implements IClientIncomingPacket return; } - final ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. + ItemInfo itemEnchantment = list.getItemEnchantment(_entryId - 1); // Entry Id begins from 1. We currently use entry IDs as index pointer. // Validate the requested item with its full stats. //@formatter:off @@ -318,7 +318,6 @@ public class MultiSellChoose implements IClientIncomingPacket final InventoryUpdate iu = new InventoryUpdate(); boolean itemEnchantmentProcessed = (itemEnchantment == null); - int enchantLevel = -1; // Take all ingredients for (ItemChanceHolder ingredient : entry.getIngredients()) @@ -386,9 +385,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -407,9 +406,9 @@ public class MultiSellChoose implements IClientIncomingPacket { itemEnchantmentProcessed = true; iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -427,9 +426,9 @@ public class MultiSellChoose implements IClientIncomingPacket if (destroyedItem != null) { iu.addItem(destroyedItem); - if (enchantLevel < 0) // Will only consider first ingredient enchant. + if (itemEnchantmentProcessed && destroyedItem.isEquipable()) // Will only consider first equipable ingredient. { - enchantLevel = destroyedItem.getEnchantLevel(); + itemEnchantment = new ItemInfo(destroyedItem); } } else @@ -553,7 +552,9 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.addSpecialAbility(ensoul, 0, 2, false); } } + addedItem.updateDatabase(true); + // Mark that we have already upgraded the item. itemEnchantmentProcessed = false; } @@ -563,12 +564,6 @@ public class MultiSellChoose implements IClientIncomingPacket addedItem.setEnchantLevel(product.getEnchantmentLevel()); addedItem.updateDatabase(true); } - else if (itemEnchantmentProcessed && list.isMaintainEnchantment() && (enchantLevel > 0) && !addedItem.getItem().isEtcItem()) - { - addedItem.setEnchantLevel(enchantLevel); - addedItem.updateDatabase(true); - enchantLevel = -1; // Will only enchant first product. - } if (addedItem.getCount() > 1) { @@ -599,7 +594,7 @@ public class MultiSellChoose implements IClientIncomingPacket // Update inventory and weight. player.sendInventoryUpdate(iu); - // finally, give the tax to the castle... + // Finally, give the tax to the castle. if ((npc != null) && list.isApplyTaxes()) { final OptionalLong taxPaid = entry.getIngredients().stream().filter(i -> i.getId() == Inventory.ADENA_ID).mapToLong(i -> Math.round(i.getCount() * list.getIngredientMultiplier() * list.getTaxRate()) * _amount).reduce(Math::multiplyExact); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java index 886497617c..ec8be38e59 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/MultiSellList.java @@ -21,21 +21,25 @@ import static org.l2jmobius.gameserver.data.xml.MultisellData.PAGE_SIZE; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.model.ItemInfo; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ItemChanceHolder; import org.l2jmobius.gameserver.model.holders.MultisellEntryHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.items.Item; +import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.OutgoingPackets; public class MultiSellList extends AbstractItemPacket { + private final PlayerInstance _player; private int _size; private int _index; private final PreparedMultisellListHolder _list; private final boolean _finished; - public MultiSellList(PreparedMultisellListHolder list, int index) + public MultiSellList(PlayerInstance player, PreparedMultisellListHolder list, int index) { + _player = player; _list = list; _index = index; _size = list.getEntries().size() - index; @@ -68,8 +72,21 @@ public class MultiSellList extends AbstractItemPacket while (_size-- > 0) { - final ItemInfo itemEnchantment = _list.getItemEnchantment(_index); + ItemInfo itemEnchantment = _list.getItemEnchantment(_index); final MultisellEntryHolder entry = _list.getEntries().get(_index++); + if ((itemEnchantment == null) && _list.isMaintainEnchantment()) + { + SEARCH: for (ItemChanceHolder holder : entry.getIngredients()) + { + final ItemInstance item = _player.getInventory().getItemByItemId(holder.getId()); + if ((item != null) && item.isEquipable()) + { + itemEnchantment = new ItemInfo(item); + break SEARCH; + } + } + } + packet.writeD(_index); // Entry ID. Start from 1. packet.writeC(entry.isStackable() ? 1 : 0); @@ -79,13 +96,14 @@ public class MultiSellList extends AbstractItemPacket writeItemElemental(packet, itemEnchantment); writeItemEnsoulOptions(packet, itemEnchantment); packet.writeC(0x00); // 286 + packet.writeH(entry.getProducts().size()); packet.writeH(entry.getIngredients().size()); for (ItemChanceHolder product : entry.getProducts()) { final Item template = ItemTable.getInstance().getTemplate(product.getId()); - final ItemInfo displayItemEnchantment = (_list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = _list.isMaintainEnchantment() && (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId()); @@ -110,7 +128,7 @@ public class MultiSellList extends AbstractItemPacket for (ItemChanceHolder ingredient : entry.getIngredients()) { final Item template = ItemTable.getInstance().getTemplate(ingredient.getId()); - final ItemInfo displayItemEnchantment = ((itemEnchantment != null) && (itemEnchantment.getItem().getId() == ingredient.getId())) ? itemEnchantment : null; + final ItemInfo displayItemEnchantment = (itemEnchantment != null) && (template != null) && template.getClass().equals(itemEnchantment.getItem().getClass()) ? itemEnchantment : null; if (template != null) { packet.writeD(template.getDisplayId());