Reuse item info for multisells that are maintainEnchantment enabled.
This commit is contained in:
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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());
|
||||
|
Reference in New Issue
Block a user