From 13a5bd183601e8e05dae287548ee7518d695c112 Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Wed, 3 Mar 2021 22:04:53 +0000 Subject: [PATCH] Check multisell product price when possible. --- .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 23 ++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ .../gameserver/data/xml/MultisellData.java | 27 +++++++++++++++++++ 18 files changed, 482 insertions(+) diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index f5b4b77935..60b15fcc24 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -94,11 +95,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -114,6 +121,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -162,6 +172,8 @@ public class MultisellData implements IXmlReader { continue; } + + totalPrice += item.getReferencePrice(); } products.add(product); @@ -180,6 +192,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName())) diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/MultisellData.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/MultisellData.java index a9676bd184..509e359217 100644 --- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/MultisellData.java +++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/MultisellData.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; @@ -93,11 +94,17 @@ public class MultisellData implements IXmlReader final StatSet set = new StatSet(parseAttributes(listNode)); final int listId = Integer.parseInt(f.getName().substring(0, f.getName().length() - 4)); final List entries = new ArrayList<>(listNode.getChildNodes().getLength()); + final AtomicInteger entryCounter = new AtomicInteger(); forEach(listNode, itemNode -> { if ("item".equalsIgnoreCase(itemNode.getNodeName())) { + int totalPrice = 0; + int lastIngredientId = 0; + long lastIngredientCount = 0; + entryCounter.incrementAndGet(); + final List ingredients = new ArrayList<>(1); final List products = new ArrayList<>(1); final MultisellEntryHolder entry = new MultisellEntryHolder(ingredients, products); @@ -113,6 +120,9 @@ public class MultisellData implements IXmlReader if (itemExists(ingredient)) { ingredients.add(ingredient); + + lastIngredientId = id; + lastIngredientCount = count; } else { @@ -153,6 +163,12 @@ public class MultisellData implements IXmlReader } products.add(product); + + final Item item = ItemTable.getInstance().getTemplate(id); + if (item != null) + { + totalPrice += item.getReferencePrice(); + } } else { @@ -168,6 +184,17 @@ public class MultisellData implements IXmlReader LOGGER.warning("Products' total chance of " + totalChance + "% exceeds 100% for list: " + listId + " at entry " + entries.size() + 1 + "."); } + // Check if buy price is lower than sell price. + // Only applies when there is only one ingredient and it is adena. + if ((ingredients.size() == 1) && (lastIngredientId == 57) && (lastIngredientCount < totalPrice)) + { + LOGGER.warning("Buy price " + lastIngredientCount + " is less than sell price " + totalPrice + " at entry " + entryCounter.intValue() + " of multisell " + listId + "."); + // Adjust price. + final ItemChanceHolder ingredient = new ItemChanceHolder(57, 0, totalPrice, (byte) 0, ingredients.get(0).isMaintainIngredient()); + ingredients.clear(); + ingredients.add(ingredient); + } + entries.add(entry); } else if ("npcs".equalsIgnoreCase(itemNode.getNodeName()))