Support for minimum and maximum extractable item count.
This commit is contained in:
@@ -63,51 +63,120 @@ public class ExtractableItems implements IItemHandler
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean created = false;
|
||||
List<L2ItemInstance> extractedItems = 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);
|
||||
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);
|
||||
}
|
||||
|
12
trunk/dist/game/data/stats/items/34900-34999.xml
vendored
12
trunk/dist/game/data/stats/items/34900-34999.xml
vendored
@@ -405,6 +405,8 @@
|
||||
<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="default_action" val="CAPSULE" />
|
||||
<set name="extractableCountMin" val="1" />
|
||||
<set name="extractableCountMax" val="1" />
|
||||
<set name="handler" val="ExtractableItems" />
|
||||
<set name="is_auctionable" val="false" />
|
||||
<set name="is_depositable" val="false" />
|
||||
@@ -420,6 +422,8 @@
|
||||
<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="default_action" val="CAPSULE" />
|
||||
<set name="extractableCountMin" val="1" />
|
||||
<set name="extractableCountMax" val="1" />
|
||||
<set name="handler" val="ExtractableItems" />
|
||||
<set name="is_auctionable" val="false" />
|
||||
<set name="is_depositable" val="false" />
|
||||
@@ -435,6 +439,8 @@
|
||||
<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="default_action" val="CAPSULE" />
|
||||
<set name="extractableCountMin" val="1" />
|
||||
<set name="extractableCountMax" val="1" />
|
||||
<set name="handler" val="ExtractableItems" />
|
||||
<set name="is_auctionable" val="false" />
|
||||
<set name="is_depositable" val="false" />
|
||||
@@ -450,6 +456,8 @@
|
||||
<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="default_action" val="CAPSULE" />
|
||||
<set name="extractableCountMin" val="1" />
|
||||
<set name="extractableCountMax" val="1" />
|
||||
<set name="handler" val="ExtractableItems" />
|
||||
<set name="is_auctionable" val="false" />
|
||||
<set name="is_depositable" val="false" />
|
||||
@@ -465,6 +473,8 @@
|
||||
<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="default_action" val="CAPSULE" />
|
||||
<set name="extractableCountMin" val="1" />
|
||||
<set name="extractableCountMax" val="1" />
|
||||
<set name="handler" val="ExtractableItems" />
|
||||
<set name="is_auctionable" val="false" />
|
||||
<set name="is_depositable" val="false" />
|
||||
@@ -480,6 +490,8 @@
|
||||
<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="default_action" val="CAPSULE" />
|
||||
<set name="extractableCountMin" val="1" />
|
||||
<set name="extractableCountMax" val="1" />
|
||||
<set name="handler" val="ExtractableItems" />
|
||||
<set name="is_auctionable" val="false" />
|
||||
<set name="is_depositable" val="false" />
|
||||
|
2
trunk/dist/game/data/xsd/items.xsd
vendored
2
trunk/dist/game/data/xsd/items.xsd
vendored
@@ -24,6 +24,8 @@
|
||||
<xs:enumeration value="equip_condition" />
|
||||
<xs:enumeration value="equip_reuse_delay" />
|
||||
<xs:enumeration value="ex_immediate_effect" />
|
||||
<xs:enumeration value="extractableCountMin" />
|
||||
<xs:enumeration value="extractableCountMax" />
|
||||
<xs:enumeration value="etcitem_type" />
|
||||
<xs:enumeration value="for_npc" />
|
||||
<xs:enumeration value="handler" />
|
||||
|
@@ -36,6 +36,8 @@ public final class L2EtcItem extends L2Item
|
||||
private EtcItemType _type;
|
||||
private final boolean _isBlessed;
|
||||
private final List<L2ExtractableProduct> _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
|
||||
*/
|
||||
|
Reference in New Issue
Block a user