Support for minimum and maximum extractable item count.

This commit is contained in:
MobiusDev
2015-12-18 20:37:19 +00:00
parent 3a7d5f5dda
commit 2d37b8c61c
4 changed files with 135 additions and 27 deletions

View File

@@ -63,51 +63,120 @@ public class ExtractableItems implements IItemHandler
return false; return false;
} }
boolean created = false; List<L2ItemInstance> extractedItems = new ArrayList<>();
List<L2ItemInstance> enchantedItems = new ArrayList<>(); List<L2ItemInstance> 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); for (L2ExtractableProduct expi : exitem)
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 ((etcitem.getExtractableCountMax() > 0) && (extractedItems.size() == etcitem.getExtractableCountMax()))
}
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())); break;
enchantedItems.add(newItem);
} }
sendMessage(activeChar, newItem);
} if (Rnd.get(100000) <= expi.getChance())
else
{
while (createItemAmount > 0)
{ {
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) if (expi.getMaxEnchant() > 0)
{ {
newItem.setEnchantLevel(Rnd.get(expi.getMinEnchant(), expi.getMaxEnchant())); newItem.setEnchantLevel(Rnd.get(expi.getMinEnchant(), expi.getMaxEnchant()));
enchantedItems.add(newItem); enchantedItems.add(newItem);
} }
extractedItems.add(newItem);
sendMessage(activeChar, 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); activeChar.sendPacket(SystemMessageId.THERE_WAS_NOTHING_FOUND_INSIDE);
} }

View File

@@ -405,6 +405,8 @@
<set name="icon" val="icon.event_hero_treasure_box_i00" /> <set name="icon" val="icon.event_hero_treasure_box_i00" />
<set name="capsuled_items" val="19448,1,1,0.9666;19447,1,1,0.3666;18552,1,1,5.16666;18551,1,1,5.16666;9555,1,1,7.16666;9553,1,1,7.16666;9554,1,1,7.16666;9552,1,1,7.16666;9557,1,1,7.16666;9556,1,1,7.16666;9549,1,1,21.33333;9547,1,1,21.33333;9548,1,1,21.33333;9546,1,1,21.33333;9551,1,1,21.33333;9550,1,1,21.33333;18553,1,1,5.16666;19509,1,1,13.3443;19508,1,1,13.3443;19510,1,1,13.3443" /> <set name="capsuled_items" val="19448,1,1,0.9666;19447,1,1,0.3666;18552,1,1,5.16666;18551,1,1,5.16666;9555,1,1,7.16666;9553,1,1,7.16666;9554,1,1,7.16666;9552,1,1,7.16666;9557,1,1,7.16666;9556,1,1,7.16666;9549,1,1,21.33333;9547,1,1,21.33333;9548,1,1,21.33333;9546,1,1,21.33333;9551,1,1,21.33333;9550,1,1,21.33333;18553,1,1,5.16666;19509,1,1,13.3443;19508,1,1,13.3443;19510,1,1,13.3443" />
<set name="default_action" val="CAPSULE" /> <set name="default_action" val="CAPSULE" />
<set name="extractableCountMin" val="1" />
<set name="extractableCountMax" val="1" />
<set name="handler" val="ExtractableItems" /> <set name="handler" val="ExtractableItems" />
<set name="is_auctionable" val="false" /> <set name="is_auctionable" val="false" />
<set name="is_depositable" val="false" /> <set name="is_depositable" val="false" />
@@ -420,6 +422,8 @@
<set name="icon" val="icon.event_hero_treasure_box_i00" /> <set name="icon" val="icon.event_hero_treasure_box_i00" />
<set name="capsuled_items" val="19448,1,1,0.9666;19447,1,1,0.3666;18552,1,1,5.16666;18551,1,1,5.16666;9555,1,1,8.16666;9553,1,1,8.16666;9554,1,1,8.16666;9552,1,1,8.16666;9557,1,1,8.16666;9556,1,1,8.16666;9549,1,1,21.33333;9547,1,1,21.33333;9548,1,1,21.33333;9546,1,1,21.33333;9551,1,1,21.33333;9550,1,1,21.33333;17527,1,1,6.16666;17526,1,1,1.16666;18553,1,1,5.16666;19509,1,1,13.3443;19508,1,1,13.3443;19510,1,1,13.3443" /> <set name="capsuled_items" val="19448,1,1,0.9666;19447,1,1,0.3666;18552,1,1,5.16666;18551,1,1,5.16666;9555,1,1,8.16666;9553,1,1,8.16666;9554,1,1,8.16666;9552,1,1,8.16666;9557,1,1,8.16666;9556,1,1,8.16666;9549,1,1,21.33333;9547,1,1,21.33333;9548,1,1,21.33333;9546,1,1,21.33333;9551,1,1,21.33333;9550,1,1,21.33333;17527,1,1,6.16666;17526,1,1,1.16666;18553,1,1,5.16666;19509,1,1,13.3443;19508,1,1,13.3443;19510,1,1,13.3443" />
<set name="default_action" val="CAPSULE" /> <set name="default_action" val="CAPSULE" />
<set name="extractableCountMin" val="1" />
<set name="extractableCountMax" val="1" />
<set name="handler" val="ExtractableItems" /> <set name="handler" val="ExtractableItems" />
<set name="is_auctionable" val="false" /> <set name="is_auctionable" val="false" />
<set name="is_depositable" val="false" /> <set name="is_depositable" val="false" />
@@ -435,6 +439,8 @@
<set name="icon" val="icon.event_hero_treasure_box_i00" /> <set name="icon" val="icon.event_hero_treasure_box_i00" />
<set name="capsuled_items" val="19448,1,1,0.9666;19447,1,1,0.3666;18555,1,1,3.16666;18554,1,1,3.16666;9555,1,1,8.16666;9553,1,1,8.16666;9554,1,1,8.16666;9552,1,1,8.16666;9557,1,1,8.16666;9556,1,1,8.16666;9549,1,1,21.33333;9547,1,1,21.33333;9548,1,1,21.33333;9546,1,1,21.33333;9551,1,1,21.33333;9550,1,1,21.33333;17527,1,1,6.16666;17526,1,1,1.16666;18556,1,1,2.06666;19512,1,1,3.0443;19511,1,1,3.3443;19513,1,1,3.3443" /> <set name="capsuled_items" val="19448,1,1,0.9666;19447,1,1,0.3666;18555,1,1,3.16666;18554,1,1,3.16666;9555,1,1,8.16666;9553,1,1,8.16666;9554,1,1,8.16666;9552,1,1,8.16666;9557,1,1,8.16666;9556,1,1,8.16666;9549,1,1,21.33333;9547,1,1,21.33333;9548,1,1,21.33333;9546,1,1,21.33333;9551,1,1,21.33333;9550,1,1,21.33333;17527,1,1,6.16666;17526,1,1,1.16666;18556,1,1,2.06666;19512,1,1,3.0443;19511,1,1,3.3443;19513,1,1,3.3443" />
<set name="default_action" val="CAPSULE" /> <set name="default_action" val="CAPSULE" />
<set name="extractableCountMin" val="1" />
<set name="extractableCountMax" val="1" />
<set name="handler" val="ExtractableItems" /> <set name="handler" val="ExtractableItems" />
<set name="is_auctionable" val="false" /> <set name="is_auctionable" val="false" />
<set name="is_depositable" val="false" /> <set name="is_depositable" val="false" />
@@ -450,6 +456,8 @@
<set name="icon" val="icon.event_hero_treasure_box_i00" /> <set name="icon" val="icon.event_hero_treasure_box_i00" />
<set name="capsuled_items" val="18552,1,1,5.6666;18551,1,1,5.6666;9555,1,1,3.16666;9553,1,1,3.16666;9554,1,1,3.16666;9552,1,1,3.16666;9557,1,1,3.16666;9556,1,1,3.16666;34651,1,1,21.33333;34650,1,1,21.33333;34652,1,1,21.33333;34649,1,1,21.33333;34653,1,1,21.33333;34654,1,1,21.33333;9549,1,1,13.3443;9547,1,1,13.3443;9548,1,1,13.3443;9546,1,1,13.3443;9551,1,1,13.3443;9550,1,1,13.3443;17527,1,1,5.33333;17526,1,1,1.33333;18553,1,1,5.33333" /> <set name="capsuled_items" val="18552,1,1,5.6666;18551,1,1,5.6666;9555,1,1,3.16666;9553,1,1,3.16666;9554,1,1,3.16666;9552,1,1,3.16666;9557,1,1,3.16666;9556,1,1,3.16666;34651,1,1,21.33333;34650,1,1,21.33333;34652,1,1,21.33333;34649,1,1,21.33333;34653,1,1,21.33333;34654,1,1,21.33333;9549,1,1,13.3443;9547,1,1,13.3443;9548,1,1,13.3443;9546,1,1,13.3443;9551,1,1,13.3443;9550,1,1,13.3443;17527,1,1,5.33333;17526,1,1,1.33333;18553,1,1,5.33333" />
<set name="default_action" val="CAPSULE" /> <set name="default_action" val="CAPSULE" />
<set name="extractableCountMin" val="1" />
<set name="extractableCountMax" val="1" />
<set name="handler" val="ExtractableItems" /> <set name="handler" val="ExtractableItems" />
<set name="is_auctionable" val="false" /> <set name="is_auctionable" val="false" />
<set name="is_depositable" val="false" /> <set name="is_depositable" val="false" />
@@ -465,6 +473,8 @@
<set name="icon" val="icon.event_hero_treasure_box_i00" /> <set name="icon" val="icon.event_hero_treasure_box_i00" />
<set name="capsuled_items" val="18552,1,1,5.6666;18551,1,1,5.6666;9555,1,1,3.16666;9553,1,1,3.16666;9554,1,1,3.16666;9552,1,1,3.16666;9557,1,1,3.16666;9556,1,1,3.16666;34651,1,1,21.33333;34650,1,1,21.33333;34652,1,1,21.33333;34649,1,1,21.33333;34653,1,1,21.33333;34654,1,1,21.33333;9549,1,1,13.3443;9547,1,1,13.3443;9548,1,1,13.3443;9546,1,1,13.3443;9551,1,1,13.3443;9550,1,1,13.3443;17527,1,1,5.33333;17526,1,1,1.33333;18553,1,1,5.33333" /> <set name="capsuled_items" val="18552,1,1,5.6666;18551,1,1,5.6666;9555,1,1,3.16666;9553,1,1,3.16666;9554,1,1,3.16666;9552,1,1,3.16666;9557,1,1,3.16666;9556,1,1,3.16666;34651,1,1,21.33333;34650,1,1,21.33333;34652,1,1,21.33333;34649,1,1,21.33333;34653,1,1,21.33333;34654,1,1,21.33333;9549,1,1,13.3443;9547,1,1,13.3443;9548,1,1,13.3443;9546,1,1,13.3443;9551,1,1,13.3443;9550,1,1,13.3443;17527,1,1,5.33333;17526,1,1,1.33333;18553,1,1,5.33333" />
<set name="default_action" val="CAPSULE" /> <set name="default_action" val="CAPSULE" />
<set name="extractableCountMin" val="1" />
<set name="extractableCountMax" val="1" />
<set name="handler" val="ExtractableItems" /> <set name="handler" val="ExtractableItems" />
<set name="is_auctionable" val="false" /> <set name="is_auctionable" val="false" />
<set name="is_depositable" val="false" /> <set name="is_depositable" val="false" />
@@ -480,6 +490,8 @@
<set name="icon" val="icon.event_hero_treasure_box_i00" /> <set name="icon" val="icon.event_hero_treasure_box_i00" />
<set name="capsuled_items" val="18555,1,1,0.6666;18554,1,1,0.5666;9555,1,1,3.16666;9553,1,1,3.16666;9554,1,1,3.16666;9552,1,1,3.16666;9557,1,1,3.16666;9556,1,1,3.16666;34651,1,1,21.33333;34650,1,1,21.33333;34652,1,1,21.33333;34649,1,1,21.33333;34653,1,1,21.33333;34654,1,1,21.33333;9549,1,1,13.3443;9547,1,1,13.3443;9548,1,1,13.3443;9546,1,1,13.3443;9551,1,1,13.3443;9550,1,1,13.3443;17527,1,1,5.33333;17526,1,1,1.33333;18556,1,1,0.63333" /> <set name="capsuled_items" val="18555,1,1,0.6666;18554,1,1,0.5666;9555,1,1,3.16666;9553,1,1,3.16666;9554,1,1,3.16666;9552,1,1,3.16666;9557,1,1,3.16666;9556,1,1,3.16666;34651,1,1,21.33333;34650,1,1,21.33333;34652,1,1,21.33333;34649,1,1,21.33333;34653,1,1,21.33333;34654,1,1,21.33333;9549,1,1,13.3443;9547,1,1,13.3443;9548,1,1,13.3443;9546,1,1,13.3443;9551,1,1,13.3443;9550,1,1,13.3443;17527,1,1,5.33333;17526,1,1,1.33333;18556,1,1,0.63333" />
<set name="default_action" val="CAPSULE" /> <set name="default_action" val="CAPSULE" />
<set name="extractableCountMin" val="1" />
<set name="extractableCountMax" val="1" />
<set name="handler" val="ExtractableItems" /> <set name="handler" val="ExtractableItems" />
<set name="is_auctionable" val="false" /> <set name="is_auctionable" val="false" />
<set name="is_depositable" val="false" /> <set name="is_depositable" val="false" />

View File

@@ -24,6 +24,8 @@
<xs:enumeration value="equip_condition" /> <xs:enumeration value="equip_condition" />
<xs:enumeration value="equip_reuse_delay" /> <xs:enumeration value="equip_reuse_delay" />
<xs:enumeration value="ex_immediate_effect" /> <xs:enumeration value="ex_immediate_effect" />
<xs:enumeration value="extractableCountMin" />
<xs:enumeration value="extractableCountMax" />
<xs:enumeration value="etcitem_type" /> <xs:enumeration value="etcitem_type" />
<xs:enumeration value="for_npc" /> <xs:enumeration value="for_npc" />
<xs:enumeration value="handler" /> <xs:enumeration value="handler" />

View File

@@ -36,6 +36,8 @@ public final class L2EtcItem extends L2Item
private EtcItemType _type; private EtcItemType _type;
private final boolean _isBlessed; private final boolean _isBlessed;
private final List<L2ExtractableProduct> _extractableItems; private final List<L2ExtractableProduct> _extractableItems;
private final int _extractableCountMin;
private final int _extractableCountMax;
private final boolean _isInfinite; private final boolean _isInfinite;
/** /**
@@ -130,6 +132,13 @@ public final class L2EtcItem extends L2Item
_extractableItems = null; _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); _isInfinite = set.getBoolean("is_infinite", false);
} }
@@ -175,6 +184,22 @@ public final class L2EtcItem extends L2Item
return _extractableItems; 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 * @return true if item is infinite
*/ */