From 2d37b8c61cf3dfb02eb72f63c34762645cb1d5e2 Mon Sep 17 00:00:00 2001 From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com> Date: Fri, 18 Dec 2015 20:37:19 +0000 Subject: [PATCH] Support for minimum and maximum extractable item count. --- .../itemhandlers/ExtractableItems.java | 123 ++++++++++++++---- .../game/data/stats/items/34900-34999.xml | 12 ++ trunk/dist/game/data/xsd/items.xsd | 2 + .../gameserver/model/items/L2EtcItem.java | 25 ++++ 4 files changed, 135 insertions(+), 27 deletions(-) diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/ExtractableItems.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/ExtractableItems.java index 2f0ec430d3..a628e2f93b 100644 --- a/trunk/dist/game/data/scripts/handlers/itemhandlers/ExtractableItems.java +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/ExtractableItems.java @@ -63,51 +63,120 @@ public class ExtractableItems implements IItemHandler return false; } - boolean created = false; + List extractedItems = new ArrayList<>(); List enchantedItems = new ArrayList<>(); - for (L2ExtractableProduct expi : exitem) + if (etcitem.getExtractableCountMin() > 0) { - if (Rnd.get(100000) <= expi.getChance()) + while (extractedItems.size() < etcitem.getExtractableCountMin()) { - final int min = (int) (expi.getMin() * Config.RATE_EXTRACTABLE); - final int max = (int) (expi.getMax() * Config.RATE_EXTRACTABLE); - - int createItemAmount = (max == min) ? min : (Rnd.get((max - min) + 1) + min); - if (createItemAmount == 0) + for (L2ExtractableProduct expi : exitem) { - continue; - } - - if (item.isStackable() || (createItemAmount == 1)) - { - final L2ItemInstance newItem = activeChar.addItem("Extract", expi.getId(), createItemAmount, activeChar, false); - if (expi.getMaxEnchant() > 0) + if ((etcitem.getExtractableCountMax() > 0) && (extractedItems.size() == etcitem.getExtractableCountMax())) { - newItem.setEnchantLevel(Rnd.get(expi.getMinEnchant(), expi.getMaxEnchant())); - enchantedItems.add(newItem); + break; } - sendMessage(activeChar, newItem); - } - else - { - while (createItemAmount > 0) + + if (Rnd.get(100000) <= expi.getChance()) { - final L2ItemInstance newItem = activeChar.addItem("Extract", expi.getId(), 1, activeChar, false); + final int min = (int) (expi.getMin() * Config.RATE_EXTRACTABLE); + final int max = (int) (expi.getMax() * Config.RATE_EXTRACTABLE); + + int createItemAmount = (max == min) ? min : (Rnd.get((max - min) + 1) + min); + if (createItemAmount == 0) + { + continue; + } + + // Do not extract the same item. + for (L2ItemInstance i : extractedItems) + { + if (i.getItem().getId() == expi.getId()) + { + continue; + } + } + + if (item.isStackable() || (createItemAmount == 1)) + { + final L2ItemInstance newItem = activeChar.addItem("Extract", expi.getId(), createItemAmount, activeChar, false); + if (expi.getMaxEnchant() > 0) + { + newItem.setEnchantLevel(Rnd.get(expi.getMinEnchant(), expi.getMaxEnchant())); + enchantedItems.add(newItem); + } + extractedItems.add(newItem); + sendMessage(activeChar, newItem); + } + else + { + while (createItemAmount > 0) + { + final L2ItemInstance newItem = activeChar.addItem("Extract", expi.getId(), 1, activeChar, false); + if (expi.getMaxEnchant() > 0) + { + newItem.setEnchantLevel(Rnd.get(expi.getMinEnchant(), expi.getMaxEnchant())); + enchantedItems.add(newItem); + } + extractedItems.add(newItem); + sendMessage(activeChar, newItem); + createItemAmount--; + } + } + } + } + } + } + else + { + for (L2ExtractableProduct expi : exitem) + { + if ((etcitem.getExtractableCountMax() > 0) && (extractedItems.size() == etcitem.getExtractableCountMax())) + { + break; + } + + if (Rnd.get(100000) <= expi.getChance()) + { + final int min = (int) (expi.getMin() * Config.RATE_EXTRACTABLE); + final int max = (int) (expi.getMax() * Config.RATE_EXTRACTABLE); + + int createItemAmount = (max == min) ? min : (Rnd.get((max - min) + 1) + min); + if (createItemAmount == 0) + { + continue; + } + + if (item.isStackable() || (createItemAmount == 1)) + { + final L2ItemInstance newItem = activeChar.addItem("Extract", expi.getId(), createItemAmount, activeChar, false); if (expi.getMaxEnchant() > 0) { newItem.setEnchantLevel(Rnd.get(expi.getMinEnchant(), expi.getMaxEnchant())); enchantedItems.add(newItem); } + extractedItems.add(newItem); sendMessage(activeChar, newItem); - createItemAmount--; } - + else + { + while (createItemAmount > 0) + { + final L2ItemInstance newItem = activeChar.addItem("Extract", expi.getId(), 1, activeChar, false); + if (expi.getMaxEnchant() > 0) + { + newItem.setEnchantLevel(Rnd.get(expi.getMinEnchant(), expi.getMaxEnchant())); + enchantedItems.add(newItem); + } + extractedItems.add(newItem); + sendMessage(activeChar, newItem); + createItemAmount--; + } + } } - created = true; } } - if (!created) + if (extractedItems.size() == 0) { activeChar.sendPacket(SystemMessageId.THERE_WAS_NOTHING_FOUND_INSIDE); } diff --git a/trunk/dist/game/data/stats/items/34900-34999.xml b/trunk/dist/game/data/stats/items/34900-34999.xml index 520ea9129f..31bbb583e4 100644 --- a/trunk/dist/game/data/stats/items/34900-34999.xml +++ b/trunk/dist/game/data/stats/items/34900-34999.xml @@ -405,6 +405,8 @@ + + @@ -420,6 +422,8 @@ + + @@ -435,6 +439,8 @@ + + @@ -450,6 +456,8 @@ + + @@ -465,6 +473,8 @@ + + @@ -480,6 +490,8 @@ + + diff --git a/trunk/dist/game/data/xsd/items.xsd b/trunk/dist/game/data/xsd/items.xsd index ad17316c8a..11d27ef763 100644 --- a/trunk/dist/game/data/xsd/items.xsd +++ b/trunk/dist/game/data/xsd/items.xsd @@ -24,6 +24,8 @@ + + diff --git a/trunk/java/com/l2jserver/gameserver/model/items/L2EtcItem.java b/trunk/java/com/l2jserver/gameserver/model/items/L2EtcItem.java index 8e5f652aa2..faf074f957 100644 --- a/trunk/java/com/l2jserver/gameserver/model/items/L2EtcItem.java +++ b/trunk/java/com/l2jserver/gameserver/model/items/L2EtcItem.java @@ -36,6 +36,8 @@ public final class L2EtcItem extends L2Item private EtcItemType _type; private final boolean _isBlessed; private final List _extractableItems; + private final int _extractableCountMin; + private final int _extractableCountMax; private final boolean _isInfinite; /** @@ -130,6 +132,13 @@ public final class L2EtcItem extends L2Item _extractableItems = null; } + _extractableCountMin = set.getInt("extractableCountMin", 0); + _extractableCountMax = set.getInt("extractableCountMax", 0); + if (_extractableCountMin > _extractableCountMax) + { + _log.warning("Item " + this + " extractableCountMin is bigger than extractableCountMax!"); + } + _isInfinite = set.getBoolean("is_infinite", false); } @@ -175,6 +184,22 @@ public final class L2EtcItem extends L2Item return _extractableItems; } + /** + * @return the minimum count of extractable items + */ + public int getExtractableCountMin() + { + return _extractableCountMin; + } + + /** + * @return the maximum count of extractable items + */ + public int getExtractableCountMax() + { + return _extractableCountMax; + } + /** * @return true if item is infinite */