Ammunition equip changes.

Thanks to realAprox.
This commit is contained in:
MobiusDevelopment
2021-04-16 17:17:25 +00:00
parent 852bd79494
commit 7810605bff
63 changed files with 1114 additions and 806 deletions
@@ -398,9 +398,8 @@
<item id="17" name="Wooden Arrow" type="EtcItem"> <item id="17" name="Wooden Arrow" type="EtcItem">
<!-- Arrow made of wood. It is an arrow used for a No-grade bow. --> <!-- Arrow made of wood. It is an arrow used for a No-grade bow. -->
<set name="icon" val="icon.etc_wooden_quiver_i00" /> <set name="icon" val="icon.etc_wooden_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="WOOD" /> <set name="material" val="WOOD" />
<set name="weight" val="6" /> <set name="weight" val="6" />
@@ -749,9 +749,8 @@
<item id="1341" name="Bone Arrow" type="EtcItem"> <item id="1341" name="Bone Arrow" type="EtcItem">
<!-- Arrow made from a piece of sharpened bone. It is used as an arrow for a D-grade bow. --> <!-- Arrow made from a piece of sharpened bone. It is used as an arrow for a D-grade bow. -->
<set name="icon" val="icon.etc_bone_quiver_i00" /> <set name="icon" val="icon.etc_bone_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="5" /> <set name="weight" val="5" />
@@ -764,9 +763,8 @@
<item id="1342" name="Steel Arrow" type="EtcItem"> <item id="1342" name="Steel Arrow" type="EtcItem">
<!-- Powerful arrow made of steel. It is used as an arrow for a C-grade bow. --> <!-- Powerful arrow made of steel. It is used as an arrow for a C-grade bow. -->
<set name="icon" val="icon.etc_fine_steel_quiver_i00" /> <set name="icon" val="icon.etc_fine_steel_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -779,9 +777,8 @@
<item id="1343" name="Silver Arrow" type="EtcItem"> <item id="1343" name="Silver Arrow" type="EtcItem">
<!-- Steel arrow plated with silver. --> <!-- Steel arrow plated with silver. -->
<set name="icon" val="icon.etc_silver_quiver_i00" /> <set name="icon" val="icon.etc_silver_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -794,9 +791,8 @@
<item id="1344" name="Mithril Arrow" type="EtcItem"> <item id="1344" name="Mithril Arrow" type="EtcItem">
<!-- Steel Arrow coated by mithril. For A-grade bows. --> <!-- Steel Arrow coated by mithril. For A-grade bows. -->
<set name="icon" val="icon.etc_mithril_quiver_i00" /> <set name="icon" val="icon.etc_mithril_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -809,9 +805,8 @@
<item id="1345" name="Arrow of Light" type="EtcItem"> <item id="1345" name="Arrow of Light" type="EtcItem">
<!-- Very hard arrow made of unknown material. For S-grade bows. --> <!-- Very hard arrow made of unknown material. For S-grade bows. -->
<set name="icon" val="icon.etc_shining_quiver_i00" /> <set name="icon" val="icon.etc_shining_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -461,9 +461,8 @@
<item id="9632" name="Wooden Bolt" type="EtcItem"> <item id="9632" name="Wooden Bolt" type="EtcItem">
<!-- Can be used as a bolt for a no-grade Crossbow. --> <!-- Can be used as a bolt for a no-grade Crossbow. -->
<set name="icon" val="icon.etc_wooden_bolt_i00" /> <set name="icon" val="icon.etc_wooden_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="WOOD" /> <set name="material" val="WOOD" />
<set name="weight" val="6" /> <set name="weight" val="6" />
@@ -474,9 +473,8 @@
<item id="9633" name="Bone Bolt" type="EtcItem"> <item id="9633" name="Bone Bolt" type="EtcItem">
<!-- Can be used as a bolt for a D-grade Crossbow. --> <!-- Can be used as a bolt for a D-grade Crossbow. -->
<set name="icon" val="icon.etc_bone_bolt_i00" /> <set name="icon" val="icon.etc_bone_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="5" /> <set name="weight" val="5" />
@@ -488,9 +486,8 @@
<item id="9634" name="Steel Bolt" type="EtcItem"> <item id="9634" name="Steel Bolt" type="EtcItem">
<!-- Can be used as a bolt for a C-grade Crossbow. --> <!-- Can be used as a bolt for a C-grade Crossbow. -->
<set name="icon" val="icon.etc_fine_steel_bolt_i00" /> <set name="icon" val="icon.etc_fine_steel_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -502,9 +499,8 @@
<item id="9635" name="Silver Bolt" type="EtcItem"> <item id="9635" name="Silver Bolt" type="EtcItem">
<!-- This silver-plated steel bolt can be used with a B-grade Crossbow. --> <!-- This silver-plated steel bolt can be used with a B-grade Crossbow. -->
<set name="icon" val="icon.etc_silver_bolt_i00" /> <set name="icon" val="icon.etc_silver_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -516,9 +512,8 @@
<item id="9636" name="Mithril Bolt" type="EtcItem"> <item id="9636" name="Mithril Bolt" type="EtcItem">
<!-- This mithril-plated steel bolt can be used with an A-grade Crossbow. --> <!-- This mithril-plated steel bolt can be used with an A-grade Crossbow. -->
<set name="icon" val="icon.etc_mithril_bolt_i00" /> <set name="icon" val="icon.etc_mithril_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -530,9 +525,8 @@
<item id="9637" name="Bolt of Light" type="EtcItem"> <item id="9637" name="Bolt of Light" type="EtcItem">
<!-- This bolt, made of unknown material, can be used with an S-grade Crossbow. --> <!-- This bolt, made of unknown material, can be used with an S-grade Crossbow. -->
<set name="icon" val="icon.etc_shining_bolt_i00" /> <set name="icon" val="icon.etc_shining_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -879,9 +879,8 @@
<item id="18550" name="Orichalcum Arrow" type="EtcItem"> <item id="18550" name="Orichalcum Arrow" type="EtcItem">
<!-- Arrow made of Orichalcum. Used as arrows for R-grade bows. --> <!-- Arrow made of Orichalcum. Used as arrows for R-grade bows. -->
<set name="icon" val="icon.etc_oricalcum_quiver_i00" /> <set name="icon" val="icon.etc_oricalcum_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="12" /> <set name="price" val="12" />
@@ -607,9 +607,8 @@
<item id="19443" name="Orichalcum Bolt" type="EtcItem"> <item id="19443" name="Orichalcum Bolt" type="EtcItem">
<!-- Bolt made of Orichalcum. Used as bolts for R-grade crossbows. --> <!-- Bolt made of Orichalcum. Used as bolts for R-grade crossbows. -->
<set name="icon" val="icon.etc_oricalcum_bolt_i00" /> <set name="icon" val="icon.etc_oricalcum_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="price" val="12" /> <set name="price" val="12" />
@@ -1338,9 +1338,8 @@
<item id="22067" name="Bone Arrow" type="EtcItem"> <item id="22067" name="Bone Arrow" type="EtcItem">
<!-- Arrow made of bone that was sharpened at the tip. Can be used with a D-grade bow. It is very light. --> <!-- Arrow made of bone that was sharpened at the tip. Can be used with a D-grade bow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_bone_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_bone_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1355,9 +1354,8 @@
<item id="22068" name="Steel Arrow" type="EtcItem"> <item id="22068" name="Steel Arrow" type="EtcItem">
<!-- Powerful arrow made of steel. Can be used with a C-grade bow. It is very light. --> <!-- Powerful arrow made of steel. Can be used with a C-grade bow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_fine_steel_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_fine_steel_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1372,9 +1370,8 @@
<item id="22069" name="Silver Arrow" type="EtcItem"> <item id="22069" name="Silver Arrow" type="EtcItem">
<!-- Steel arrow plated with silver. Can be used with a B-grade bow. It is very light. --> <!-- Steel arrow plated with silver. Can be used with a B-grade bow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_silver_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_silver_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1389,9 +1386,8 @@
<item id="22070" name="Mithril Arrow" type="EtcItem"> <item id="22070" name="Mithril Arrow" type="EtcItem">
<!-- Steel arrow plated with mithril. Can be used with an A-grade bow. It is very light. --> <!-- Steel arrow plated with mithril. Can be used with an A-grade bow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_mithril_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_mithril_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1406,9 +1402,8 @@
<item id="22071" name="Arrow of Light" type="EtcItem"> <item id="22071" name="Arrow of Light" type="EtcItem">
<!-- The strongest arrow. Materials are unknown. It is very light. --> <!-- The strongest arrow. Materials are unknown. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_shining_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_shining_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -815,9 +815,8 @@
<item id="22144" name="Bone Bolt" type="EtcItem"> <item id="22144" name="Bone Bolt" type="EtcItem">
<!-- Bolt made of bone that was sharpened at the tip. Can be used with a D-grade Crossbow. It is very light. --> <!-- Bolt made of bone that was sharpened at the tip. Can be used with a D-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_bone_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_bone_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -832,9 +831,8 @@
<item id="22145" name="Steel Bolt" type="EtcItem"> <item id="22145" name="Steel Bolt" type="EtcItem">
<!-- Powerful bolt made of steel. Can used with a C-grade Crossbow. It is very light. --> <!-- Powerful bolt made of steel. Can used with a C-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_fine_steel_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_fine_steel_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -849,9 +847,8 @@
<item id="22146" name="Silver Bolt" type="EtcItem"> <item id="22146" name="Silver Bolt" type="EtcItem">
<!-- Steel bolt plated with silver. Can be used with a B-grade Crossbow. It is very light. --> <!-- Steel bolt plated with silver. Can be used with a B-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_silver_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_silver_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -866,9 +863,8 @@
<item id="22147" name="Mithril Bolt" type="EtcItem"> <item id="22147" name="Mithril Bolt" type="EtcItem">
<!-- Steel bolt plated with mithril. Can be used with an A-grade Crossbow. It is very light. --> <!-- Steel bolt plated with mithril. Can be used with an A-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_mithril_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_mithril_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -883,9 +879,8 @@
<item id="22148" name="Bolt of Light" type="EtcItem"> <item id="22148" name="Bolt of Light" type="EtcItem">
<!-- Bolt made of unknown materials. Can be used with an S-grade Crossbow. It is very light. --> <!-- Bolt made of unknown materials. Can be used with an S-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_shining_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_shining_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1328,9 +1328,8 @@
</item> </item>
<item id="30375" name="Infinite Orichalcum Quiver" additionalName="Additional Hit" type="EtcItem"> <item id="30375" name="Infinite Orichalcum Quiver" additionalName="Additional Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1338,9 +1337,8 @@
</item> </item>
<item id="30376" name="Infinite Orichalcum Quiver" additionalName="Critical Hit" type="EtcItem"> <item id="30376" name="Infinite Orichalcum Quiver" additionalName="Critical Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1348,9 +1346,8 @@
</item> </item>
<item id="30377" name="Infinite Orichalcum Quiver" additionalName="Bleed Hit" type="EtcItem"> <item id="30377" name="Infinite Orichalcum Quiver" additionalName="Bleed Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1358,9 +1355,8 @@
</item> </item>
<item id="30378" name="Infinite Orichalcum Bolt Container" additionalName="Additional Hit" type="EtcItem"> <item id="30378" name="Infinite Orichalcum Bolt Container" additionalName="Additional Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1368,9 +1364,8 @@
</item> </item>
<item id="30379" name="Infinite Orichalcum Bolt Container" additionalName="Critical Hit" type="EtcItem"> <item id="30379" name="Infinite Orichalcum Bolt Container" additionalName="Critical Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1378,9 +1373,8 @@
</item> </item>
<item id="30380" name="Infinite Orichalcum Bolt Container" additionalName="Bleed Hit" type="EtcItem"> <item id="30380" name="Infinite Orichalcum Bolt Container" additionalName="Bleed Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -922,9 +922,8 @@
<item id="32249" name="Infinite Wooden Quiver" type="EtcItem"> <item id="32249" name="Infinite Wooden Quiver" type="EtcItem">
<!-- Quiver containing arrows made of wood. Used with a No-grade bow. --> <!-- Quiver containing arrows made of wood. Used with a No-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1580" /> <set name="price" val="1580" />
@@ -934,9 +933,8 @@
<item id="32250" name="Infinite Bone Quiver" type="EtcItem"> <item id="32250" name="Infinite Bone Quiver" type="EtcItem">
<!-- Quiver containing arrows made of sharply ground bone. Used with a D-grade bow. --> <!-- Quiver containing arrows made of sharply ground bone. Used with a D-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="7320" /> <set name="price" val="7320" />
@@ -947,9 +945,8 @@
<item id="32251" name="Infinite Steel Quiver" type="EtcItem"> <item id="32251" name="Infinite Steel Quiver" type="EtcItem">
<!-- Quiver containing arrows made of steel. Used with a C-grade bow. --> <!-- Quiver containing arrows made of steel. Used with a C-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="11490" /> <set name="price" val="11490" />
@@ -960,9 +957,8 @@
<item id="32252" name="Infinite Silver Quiver" type="EtcItem"> <item id="32252" name="Infinite Silver Quiver" type="EtcItem">
<!-- Quiver containing steel arrows plated in silver. Used with a B-grade bow. --> <!-- Quiver containing steel arrows plated in silver. Used with a B-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="34630" /> <set name="price" val="34630" />
@@ -973,9 +969,8 @@
<item id="32253" name="Infinite Mithril Quiver" type="EtcItem"> <item id="32253" name="Infinite Mithril Quiver" type="EtcItem">
<!-- Quiver containing steel arrows plated in mithril. Used with an A-grade bow. --> <!-- Quiver containing steel arrows plated in mithril. Used with an A-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="364800" /> <set name="price" val="364800" />
@@ -986,9 +981,8 @@
<item id="32254" name="Infinite Quiver of Light" type="EtcItem"> <item id="32254" name="Infinite Quiver of Light" type="EtcItem">
<!-- This quiver contains arrows made of unknown material. Used with S-grade bows. --> <!-- This quiver contains arrows made of unknown material. Used with S-grade bows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1716000" /> <set name="price" val="1716000" />
@@ -999,9 +993,8 @@
<item id="32255" name="Infinite Orichalcum Quiver" type="EtcItem"> <item id="32255" name="Infinite Orichalcum Quiver" type="EtcItem">
<!-- Quiver containing arrows made of orichalcum. Used with an R-grade bow. --> <!-- Quiver containing arrows made of orichalcum. Used with an R-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="4528800" /> <set name="price" val="4528800" />
@@ -1012,9 +1005,8 @@
<item id="32256" name="Infinite Wooden Bolt Container" type="EtcItem"> <item id="32256" name="Infinite Wooden Bolt Container" type="EtcItem">
<!-- Container with bolts made of wood. Used with a No-grade Crossbow. --> <!-- Container with bolts made of wood. Used with a No-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1580" /> <set name="price" val="1580" />
@@ -1024,9 +1016,8 @@
<item id="32257" name="Infinite Bone Bolt Container" type="EtcItem"> <item id="32257" name="Infinite Bone Bolt Container" type="EtcItem">
<!-- Container with bolts made of sharply ground bone. Used with a D-grade Crossbow. --> <!-- Container with bolts made of sharply ground bone. Used with a D-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="7320" /> <set name="price" val="7320" />
@@ -1037,9 +1028,8 @@
<item id="32258" name="Infinite Steel Bolt Container" type="EtcItem"> <item id="32258" name="Infinite Steel Bolt Container" type="EtcItem">
<!-- Container with bolts made of steel. Used with a C-grade Crossbow. --> <!-- Container with bolts made of steel. Used with a C-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="11490" /> <set name="price" val="11490" />
@@ -1050,9 +1040,8 @@
<item id="32259" name="Infinite Silver Bolt Container" type="EtcItem"> <item id="32259" name="Infinite Silver Bolt Container" type="EtcItem">
<!-- Container with steel bolts plated in silver. Used with a B-grade Crossbow. --> <!-- Container with steel bolts plated in silver. Used with a B-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="34630" /> <set name="price" val="34630" />
@@ -1063,9 +1052,8 @@
<item id="32260" name="Infinite Mithril Bolt Container" type="EtcItem"> <item id="32260" name="Infinite Mithril Bolt Container" type="EtcItem">
<!-- A container of bolts coated by mithril. For A-grade bows. --> <!-- A container of bolts coated by mithril. For A-grade bows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="364800" /> <set name="price" val="364800" />
@@ -1076,9 +1064,8 @@
<item id="32261" name="Infinite Light Bolt Container" type="EtcItem"> <item id="32261" name="Infinite Light Bolt Container" type="EtcItem">
<!-- This container Has bolts made of unknown material. Used with S-grade crossbows. --> <!-- This container Has bolts made of unknown material. Used with S-grade crossbows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1716000" /> <set name="price" val="1716000" />
@@ -1089,9 +1076,8 @@
<item id="32262" name="Infinite Orichalcum Bolt Container" type="EtcItem"> <item id="32262" name="Infinite Orichalcum Bolt Container" type="EtcItem">
<!-- Container with bolts made of orichalcum. Used with an R-grade Crossbow. --> <!-- Container with bolts made of orichalcum. Used with an R-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="4528800" /> <set name="price" val="4528800" />
@@ -269,7 +269,7 @@
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="is_stackable" val="true" /> <set name="is_stackable" val="true" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
</item> </item>
<item id="45429" name="Orichalcum Bolt" additionalName="Event" type="EtcItem"> <item id="45429" name="Orichalcum Bolt" additionalName="Event" type="EtcItem">
@@ -281,7 +281,7 @@
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="is_stackable" val="true" /> <set name="is_stackable" val="true" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
</item> </item>
<item id="45430" name="Entrance Pass: Spezion (Epic)" type="EtcItem"> <item id="45430" name="Entrance Pass: Spezion (Epic)" type="EtcItem">
@@ -1560,9 +1560,8 @@
<!-- Enhanced Orichalcum arrow with +5% Atk. Spd. Used as arrows for R-grade bows. --> <!-- Enhanced Orichalcum arrow with +5% Atk. Spd. Used as arrows for R-grade bows. -->
<set name="icon" val="icon.etc_oricalcum_quiver_i00" /> <set name="icon" val="icon.etc_oricalcum_quiver_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1577,9 +1576,8 @@
<!-- Enhanced Orichalcum arrow with +5% P. Atk. Used as arrows for R-grade bows. --> <!-- Enhanced Orichalcum arrow with +5% P. Atk. Used as arrows for R-grade bows. -->
<set name="icon" val="icon.etc_oricalcum_quiver_i00" /> <set name="icon" val="icon.etc_oricalcum_quiver_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1594,9 +1592,8 @@
<!-- Enhanced Orichalcum arrow with Additional Hit. Used as arrows for R-grade bows. --> <!-- Enhanced Orichalcum arrow with Additional Hit. Used as arrows for R-grade bows. -->
<set name="icon" val="icon.etc_oricalcum_quiver_i00" /> <set name="icon" val="icon.etc_oricalcum_quiver_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1611,9 +1608,8 @@
<!-- Enhanced Orichalcum bolt with +5% Atk. Spd. Used as bolts for R-grade crossbows. --> <!-- Enhanced Orichalcum bolt with +5% Atk. Spd. Used as bolts for R-grade crossbows. -->
<set name="icon" val="icon.etc_oricalcum_bolt_i00" /> <set name="icon" val="icon.etc_oricalcum_bolt_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1628,9 +1624,8 @@
<!-- Enhanced Orichalcum bolt with +5% P. Atk. Used as bolts for R-grade crossbows. --> <!-- Enhanced Orichalcum bolt with +5% P. Atk. Used as bolts for R-grade crossbows. -->
<set name="icon" val="icon.etc_oricalcum_bolt_i00" /> <set name="icon" val="icon.etc_oricalcum_bolt_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1645,9 +1640,8 @@
<!-- Allows to make an extra shot. Used as bolts for R-grade ?rossbows. --> <!-- Allows to make an extra shot. Used as bolts for R-grade ?rossbows. -->
<set name="icon" val="icon.etc_oricalcum_bolt_i00" /> <set name="icon" val="icon.etc_oricalcum_bolt_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -450,9 +450,8 @@
<item id="80433" name="Infinite Orichalcum Quiver" type="EtcItem"> <item id="80433" name="Infinite Orichalcum Quiver" type="EtcItem">
<!-- Quiver containing arrows made of Orichalcum. Used with an R-grade Bow. --> <!-- Quiver containing arrows made of Orichalcum. Used with an R-grade Bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -463,9 +462,8 @@
<item id="80434" name="Infinite Orichalcum Bolt Container" type="EtcItem"> <item id="80434" name="Infinite Orichalcum Bolt Container" type="EtcItem">
<!-- Container with bolts made of Orichalcum. Used with an R-grade Crossbow. --> <!-- Container with bolts made of Orichalcum. Used with an R-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -47,11 +47,14 @@ import org.l2jmobius.gameserver.model.actor.instance.EventMonsterInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate; import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.Armor; import org.l2jmobius.gameserver.model.items.Armor;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.Weapon; import org.l2jmobius.gameserver.model.items.Weapon;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.skills.AmmunitionSkillList;
import org.l2jmobius.gameserver.util.DocumentItem; import org.l2jmobius.gameserver.util.DocumentItem;
import org.l2jmobius.gameserver.util.GMAudit; import org.l2jmobius.gameserver.util.GMAudit;
@@ -194,6 +197,15 @@ public class ItemTable
if (item instanceof EtcItem) if (item instanceof EtcItem)
{ {
_etcItems.put(item.getId(), (EtcItem) item); _etcItems.put(item.getId(), (EtcItem) item);
if ((item.getItemType() == EtcItemType.ARROW) || (item.getItemType() == EtcItemType.BOLT))
{
final List<ItemSkillHolder> skills = item.getAllSkills();
if (skills != null)
{
AmmunitionSkillList.add(skills);
}
}
} }
else if (item instanceof Armor) else if (item instanceof Armor)
{ {
@@ -1154,11 +1154,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Try to do what is expected by having more attack speed. // Try to do what is expected by having more attack speed.
// final int reuse = (int) (Formulas.calculateReuseTime(this, weaponItem) / (Math.max(1, _stat.getAttackSpeedMultiplier() - 1))); // final int reuse = (int) (Formulas.calculateReuseTime(this, weaponItem) / (Math.max(1, _stat.getAttackSpeedMultiplier() - 1)));
// Consume arrows // Consume ammunition.
final Inventory inventory = getInventory(); final Inventory inventory = getInventory();
if (inventory != null) if (inventory != null)
{ {
inventory.reduceArrowCount(crossbow ? EtcItemType.BOLT : EtcItemType.ARROW); inventory.reduceAmmunitionCount(crossbow ? EtcItemType.BOLT : EtcItemType.ARROW);
} }
// Check if the Creature is a PlayerInstance // Check if the Creature is a PlayerInstance
@@ -220,6 +220,7 @@ import org.l2jmobius.gameserver.model.holders.AutoPlaySettingsHolder;
import org.l2jmobius.gameserver.model.holders.AutoUseSettingsHolder; import org.l2jmobius.gameserver.model.holders.AutoUseSettingsHolder;
import org.l2jmobius.gameserver.model.holders.DamageTakenHolder; import org.l2jmobius.gameserver.model.holders.DamageTakenHolder;
import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.holders.MovieHolder; import org.l2jmobius.gameserver.model.holders.MovieHolder;
import org.l2jmobius.gameserver.model.holders.PlayerEventHolder; import org.l2jmobius.gameserver.model.holders.PlayerEventHolder;
import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder;
@@ -261,6 +262,7 @@ import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.siege.Fort; import org.l2jmobius.gameserver.model.siege.Fort;
import org.l2jmobius.gameserver.model.siege.Siege; import org.l2jmobius.gameserver.model.siege.Siege;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.AmmunitionSkillList;
import org.l2jmobius.gameserver.model.skills.BuffInfo; import org.l2jmobius.gameserver.model.skills.BuffInfo;
import org.l2jmobius.gameserver.model.skills.CommonSkill; import org.l2jmobius.gameserver.model.skills.CommonSkill;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
@@ -725,6 +727,8 @@ public class PlayerInstance extends Playable
private BroochJewel _activeRubyJewel = null; private BroochJewel _activeRubyJewel = null;
private BroochJewel _activeShappireJewel = null; private BroochJewel _activeShappireJewel = null;
private int _lastAmmunitionId = 0;
/** Event parameters */ /** Event parameters */
private PlayerEventHolder eventStatus = null; private PlayerEventHolder eventStatus = null;
@@ -853,7 +857,7 @@ public class PlayerInstance extends Playable
// Shared dualclass skills. // Shared dualclass skills.
private static final String KNOWN_DUAL_SKILLS_VAR = "KNOWN_DUAL_SKILLS"; private static final String KNOWN_DUAL_SKILLS_VAR = "KNOWN_DUAL_SKILLS";
private static final int[] DUAL_CLASS_SKILLS = new int[] private static final int[] DUAL_CLASS_SKILLS =
{ {
19222, // Dignity of the Exalted 19222, // Dignity of the Exalted
19223, // Belief of the Exalted 19223, // Belief of the Exalted
@@ -4439,20 +4443,6 @@ public class PlayerInstance extends Playable
else else
{ {
addItem("Pickup", target, null, true); addItem("Pickup", target, null, true);
// Auto-Equip arrows/bolts if player has a bow/crossbow and player picks up arrows/bolts.
final ItemInstance weapon = _inventory.getPaperdollItem(Inventory.PAPERDOLL_RHAND);
if (weapon != null)
{
final EtcItem etcItem = target.getEtcItem();
if (etcItem != null)
{
final EtcItemType itemType = etcItem.getItemType();
if (((weapon.getItemType() == WeaponType.BOW) && (itemType == EtcItemType.ARROW)) || (((weapon.getItemType() == WeaponType.CROSSBOW) || (weapon.getItemType() == WeaponType.TWOHANDCROSSBOW)) && (itemType == EtcItemType.BOLT)))
{
checkAndEquipAmmunition(itemType);
}
}
}
} }
} }
} }
@@ -5772,33 +5762,85 @@ public class PlayerInstance extends Playable
@Override @Override
protected boolean checkAndEquipAmmunition(EtcItemType type) protected boolean checkAndEquipAmmunition(EtcItemType type)
{ {
ItemInstance arrows = _inventory.getPaperdollItem(Inventory.PAPERDOLL_LHAND); ItemInstance ammunition = null;
if (arrows == null)
{
final Weapon weapon = getActiveWeaponItem(); final Weapon weapon = getActiveWeaponItem();
if (type == EtcItemType.ARROW) if (type == EtcItemType.ARROW)
{ {
arrows = _inventory.findArrowForBow(weapon); ammunition = _inventory.findArrowForBow(weapon);
} }
else if (type == EtcItemType.BOLT) else if (type == EtcItemType.BOLT)
{ {
arrows = _inventory.findBoltForCrossBow(weapon); ammunition = _inventory.findBoltForCrossBow(weapon);
} }
if (arrows != null)
if (ammunition != null)
{ {
// Equip arrows needed in left hand addAmmunitionSkills(ammunition);
_inventory.setPaperdollItem(Inventory.PAPERDOLL_LHAND, arrows);
sendItemList(); sendItemList();
return true; return true;
} }
}
else removeAmmunitionSkills();
{
return true;
}
return false; return false;
} }
private void addAmmunitionSkills(ItemInstance ammunition)
{
final int currentAmmunitionId = ammunition.getId();
if (_lastAmmunitionId == currentAmmunitionId)
{
return;
}
removeAmmunitionSkills();
_lastAmmunitionId = currentAmmunitionId;
final List<ItemSkillHolder> skills = ammunition.getItem().getAllSkills();
if (skills == null)
{
return;
}
boolean sendSkillList = false;
for (ItemSkillHolder holder : skills)
{
if (!isAffectedBySkill(holder))
{
final Skill skill = holder.getSkill();
if (skill.isPassive())
{
addSkill(skill);
sendSkillList = true;
}
}
}
if (sendSkillList)
{
sendSkillList();
}
}
public void removeAmmunitionSkills()
{
if (_lastAmmunitionId == 0)
{
return;
}
_lastAmmunitionId = 0;
boolean sendSkillList = false;
for (Integer skillId : AmmunitionSkillList.values())
{
if (removeSkill(skillId.intValue(), true) != null)
{
sendSkillList = true;
}
}
if (sendSkillList)
{
sendSkillList();
}
}
/** /**
* Disarm the player's weapon. * Disarm the player's weapon.
* @return {@code true} if the player was disarmed or doesn't have a weapon to disarm, {@code false} otherwise. * @return {@code true} if the player was disarmed or doesn't have a weapon to disarm, {@code false} otherwise.
@@ -53,14 +53,12 @@ import org.l2jmobius.gameserver.model.holders.AgathionSkillHolder;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder; import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceType; import org.l2jmobius.gameserver.model.items.appearance.AppearanceType;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.ArmorType; import org.l2jmobius.gameserver.model.items.type.ArmorType;
import org.l2jmobius.gameserver.model.items.type.EtcItemType; import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.items.type.ItemType;
import org.l2jmobius.gameserver.model.items.type.WeaponType; import org.l2jmobius.gameserver.model.items.type.WeaponType;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillConditionScope; import org.l2jmobius.gameserver.model.skills.SkillConditionScope;
@@ -231,61 +229,57 @@ public abstract class Inventory extends ItemContainer
@Override @Override
public void notifyUnequiped(int slot, ItemInstance item, Inventory inventory) public void notifyUnequiped(int slot, ItemInstance item, Inventory inventory)
{ {
if (slot != PAPERDOLL_RHAND) if ((slot != PAPERDOLL_RHAND) || !item.isWeapon())
{ {
return; return;
} }
if (item.getItemType() == WeaponType.BOW) switch (item.getWeaponItem().getItemType())
{ {
final ItemInstance arrow = inventory.getPaperdollItem(PAPERDOLL_LHAND); case BOW:
if (arrow != null) {
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (((leftHandItem != null) && ((leftHandItem.getItemType()) != ArmorType.SIGIL)))
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
} final PlayerInstance owner = inventory.getOwner().getActingPlayer();
else if ((item.getItemType() == WeaponType.CROSSBOW) || (item.getItemType() == WeaponType.TWOHANDCROSSBOW)) if (owner != null)
{ {
final ItemInstance bolts = inventory.getPaperdollItem(PAPERDOLL_LHAND); owner.removeAmmunitionSkills();
if (bolts != null) }
break;
}
case CROSSBOW:
case TWOHANDCROSSBOW:
{
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (((leftHandItem != null) && ((leftHandItem.getItemType()) != ArmorType.SIGIL)))
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
} final PlayerInstance owner = inventory.getOwner().getActingPlayer();
else if (item.getItemType() == WeaponType.FISHINGROD) if (owner != null)
{ {
final ItemInstance lure = inventory.getPaperdollItem(PAPERDOLL_LHAND); owner.removeAmmunitionSkills();
if (lure != null) }
break;
}
case FISHINGROD:
{
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (leftHandItem != null)
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
break;
}
} }
} }
@Override @Override
public void notifyEquiped(int slot, ItemInstance item, Inventory inventory) public void notifyEquiped(int slot, ItemInstance item, Inventory inventory)
{ {
if (slot != PAPERDOLL_RHAND)
{
return;
}
if (item.getItemType() == WeaponType.BOW)
{
final ItemInstance arrow = inventory.findArrowForBow(item.getItem());
if (arrow != null)
{
inventory.setPaperdollItem(PAPERDOLL_LHAND, arrow);
}
}
else if ((item.getItemType() == WeaponType.CROSSBOW) || (item.getItemType() == WeaponType.TWOHANDCROSSBOW))
{
final ItemInstance bolts = inventory.findBoltForCrossBow(item.getItem());
if (bolts != null)
{
inventory.setPaperdollItem(PAPERDOLL_LHAND, bolts);
}
}
} }
} }
@@ -1847,24 +1841,6 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
// Equip only identical grade arrows.
final EtcItem etcItem = item.getEtcItem();
if (etcItem != null)
{
final ItemInstance weapon = getPaperdollItem(Inventory.PAPERDOLL_RHAND);
if (weapon != null)
{
final EtcItemType itemType = etcItem.getItemType();
final ItemType weaponItemType = weapon.getItemType();
if ((((weaponItemType == WeaponType.BOW) && (itemType == EtcItemType.ARROW)) //
|| (((weaponItemType == WeaponType.CROSSBOW) || (weaponItemType == WeaponType.TWOHANDCROSSBOW)) && (itemType == EtcItemType.BOLT))) //
&& (weapon.getItem().getCrystalTypePlus() != item.getItem().getCrystalTypePlus()))
{
return;
}
}
}
final PlayerInstance player = (PlayerInstance) getOwner(); final PlayerInstance player = (PlayerInstance) getOwner();
if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !player.isHero() && item.isHeroItem()) if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !player.isHero() && item.isHeroItem())
{ {
@@ -1885,27 +1861,23 @@ public abstract class Inventory extends ItemContainer
} }
} }
// don't care about arrows, listener will unequip them (hopefully)
// handle full armor // handle full armor
// formal dress // formal dress
if (targetSlot == Item.SLOT_LR_HAND) if (targetSlot == Item.SLOT_LR_HAND)
{ {
setPaperdollItem(PAPERDOLL_LHAND, null); final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND);
if ((rh != null) && (!rh.isArmor() || (rh.getArmorItem().getItemType() != ArmorType.SIGIL)))
{
setPaperdollItem(PAPERDOLL_RHAND, null);
}
setPaperdollItem(PAPERDOLL_RHAND, item); setPaperdollItem(PAPERDOLL_RHAND, item);
} }
else if (targetSlot == Item.SLOT_L_HAND) else if (targetSlot == Item.SLOT_L_HAND)
{ {
final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND); final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND);
if (rh != null) if ((rh != null) && (rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE)))
{ {
if (item.getItemType() == ArmorType.SIGIL) if (!item.isArmor() || (item.getArmorItem().getItemType() != ArmorType.SIGIL))
{
if ((rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !(((rh.getItemType() == WeaponType.BOW) || (rh.getItemType() == WeaponType.POLE) || (rh.getItemType() == WeaponType.DUALFIST) || (rh.getItemType() == WeaponType.DUALBLUNT) || (rh.getItemType() == WeaponType.DUALDAGGER) || (rh.getItemType() == WeaponType.DUAL) || (rh.getItemType() == WeaponType.BLUNT) || (rh.getItemType() == WeaponType.SWORD) || (rh.getItemType() == WeaponType.CROSSBOW) || (rh.getItemType() == WeaponType.TWOHANDCROSSBOW)) || ((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE))))
{
setPaperdollItem(PAPERDOLL_RHAND, null);
}
}
else if ((rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !(((rh.getItemType() == WeaponType.BOW) && (item.getItemType() == EtcItemType.ARROW)) || (((rh.getItemType() == WeaponType.CROSSBOW) || (rh.getItemType() == WeaponType.TWOHANDCROSSBOW)) && (item.getItemType() == EtcItemType.BOLT)) || ((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE))))
{ {
setPaperdollItem(PAPERDOLL_RHAND, null); setPaperdollItem(PAPERDOLL_RHAND, null);
} }
@@ -2096,6 +2068,18 @@ public abstract class Inventory extends ItemContainer
return _totalWeight; return _totalWeight;
} }
/**
* Reduce the arrow number of the Creature.<br>
* <br>
* <b><u>Overridden in</u>:</b>
* <li>PlayerInstance</li><br>
* @param type
*/
public void reduceAmmunitionCount(EtcItemType type)
{
// Default is to do nothing.
}
/** /**
* Return the ItemInstance of the arrows needed for this bow. * Return the ItemInstance of the arrows needed for this bow.
* @param bow : Item designating the bow * @param bow : Item designating the bow
@@ -2462,18 +2446,6 @@ public abstract class Inventory extends ItemContainer
_blockedItemSlotsMask = itemSlotsMask; _blockedItemSlotsMask = itemSlotsMask;
} }
/**
* Reduce the arrow number of the Creature.<br>
* <br>
* <b><u>Overridden in</u>:</b>
* <li>PlayerInstance</li><br>
* @param type
*/
public void reduceArrowCount(EtcItemType type)
{
// default is to do nothing
}
/** /**
* Gets the items in paperdoll slots filtered by filter. * Gets the items in paperdoll slots filtered by filter.
* @param filters multiple filters * @param filters multiple filters
@@ -42,6 +42,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDe
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDrop; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDrop;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemTransfer; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemTransfer;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.Weapon;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType; import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.variables.ItemVariables; import org.l2jmobius.gameserver.model.variables.ItemVariables;
@@ -955,26 +956,52 @@ public class PlayerInventory extends Inventory
* @param type * @param type
*/ */
@Override @Override
public void reduceArrowCount(EtcItemType type) public void reduceAmmunitionCount(EtcItemType type)
{ {
if ((type != EtcItemType.ARROW) && (type != EtcItemType.BOLT)) if ((type != EtcItemType.ARROW) && (type != EtcItemType.BOLT))
{ {
LOGGER.log(Level.WARNING, type.toString(), " which is not arrow type passed to PlayerInstance.reduceArrowCount()"); LOGGER.log(Level.WARNING, type.toString(), " which is not ammo type.");
return; return;
} }
final ItemInstance arrows = getPaperdollItem(Inventory.PAPERDOLL_LHAND); final Weapon weapon = _owner.getActiveWeaponItem();
if ((arrows == null) || (arrows.getItemType() != type)) if (weapon == null)
{ {
return; return;
} }
if (arrows.getEtcItem().isInfinite()) // Null-safe due to type checks above ItemInstance ammunition = null;
switch (weapon.getItemType())
{
case BOW:
{
ammunition = findArrowForBow(weapon);
break;
}
case CROSSBOW:
case TWOHANDCROSSBOW:
{
ammunition = findBoltForCrossBow(weapon);
break;
}
default:
{
return;
}
}
if ((ammunition == null) || (ammunition.getItemType() != type))
{ {
return; return;
} }
updateItemCountNoDbUpdate(null, arrows, -1, _owner, null); if (ammunition.getEtcItem().isInfinite())
{
return;
}
// Reduce item count.
updateItemCountNoDbUpdate(null, ammunition, -1, _owner, null);
} }
/** /**
@@ -0,0 +1,44 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.skills;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
/**
* @author Mobius
*/
public class AmmunitionSkillList
{
private static final Set<Integer> SKILLS = ConcurrentHashMap.newKeySet();
public static void add(List<ItemSkillHolder> skills)
{
for (ItemSkillHolder skill : skills)
{
SKILLS.add(skill.getSkillId());
}
}
public static Set<Integer> values()
{
return SKILLS;
}
}
@@ -53,8 +53,10 @@ import org.l2jmobius.gameserver.model.clan.Clan;
import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder; import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder;
import org.l2jmobius.gameserver.model.holders.ClientHardwareInfoHolder; import org.l2jmobius.gameserver.model.holders.ClientHardwareInfoHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.quest.Quest; import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.residences.ClanHall; import org.l2jmobius.gameserver.model.residences.ClanHall;
import org.l2jmobius.gameserver.model.siege.Fort; import org.l2jmobius.gameserver.model.siege.Fort;
@@ -668,6 +670,13 @@ public class EnterWorld implements IClientIncomingPacket
player.getInventory().equipItemAndRecord(agathion); player.getInventory().equipItemAndRecord(agathion);
} }
// Old ammunition check.
final ItemInstance leftHandItem = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
if ((leftHandItem != null) && ((leftHandItem.getItemType() == EtcItemType.ARROW) || (leftHandItem.getItemType() == EtcItemType.BOLT)))
{
player.getInventory().unEquipItemInBodySlot(Inventory.PAPERDOLL_LHAND);
}
if (Config.ENABLE_ATTENDANCE_REWARDS) if (Config.ENABLE_ATTENDANCE_REWARDS)
{ {
ThreadPool.schedule(() -> ThreadPool.schedule(() ->
@@ -398,9 +398,8 @@
<item id="17" name="Wooden Arrow" type="EtcItem"> <item id="17" name="Wooden Arrow" type="EtcItem">
<!-- Arrow made of wood. It is an arrow used for a No-grade bow. --> <!-- Arrow made of wood. It is an arrow used for a No-grade bow. -->
<set name="icon" val="icon.etc_wooden_quiver_i00" /> <set name="icon" val="icon.etc_wooden_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="WOOD" /> <set name="material" val="WOOD" />
<set name="weight" val="6" /> <set name="weight" val="6" />
@@ -749,9 +749,8 @@
<item id="1341" name="Bone Arrow" type="EtcItem"> <item id="1341" name="Bone Arrow" type="EtcItem">
<!-- Arrow made from a piece of sharpened bone. It is used as an arrow for a D-grade bow. --> <!-- Arrow made from a piece of sharpened bone. It is used as an arrow for a D-grade bow. -->
<set name="icon" val="icon.etc_bone_quiver_i00" /> <set name="icon" val="icon.etc_bone_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="5" /> <set name="weight" val="5" />
@@ -764,9 +763,8 @@
<item id="1342" name="Steel Arrow" type="EtcItem"> <item id="1342" name="Steel Arrow" type="EtcItem">
<!-- Powerful arrow made of steel. It is used as an arrow for a C-grade bow. --> <!-- Powerful arrow made of steel. It is used as an arrow for a C-grade bow. -->
<set name="icon" val="icon.etc_fine_steel_quiver_i00" /> <set name="icon" val="icon.etc_fine_steel_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -779,9 +777,8 @@
<item id="1343" name="Silver Arrow" type="EtcItem"> <item id="1343" name="Silver Arrow" type="EtcItem">
<!-- Steel arrow plated with silver. --> <!-- Steel arrow plated with silver. -->
<set name="icon" val="icon.etc_silver_quiver_i00" /> <set name="icon" val="icon.etc_silver_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -794,9 +791,8 @@
<item id="1344" name="Mithril Arrow" type="EtcItem"> <item id="1344" name="Mithril Arrow" type="EtcItem">
<!-- Steel Arrow coated by mithril. For A-grade bows. --> <!-- Steel Arrow coated by mithril. For A-grade bows. -->
<set name="icon" val="icon.etc_mithril_quiver_i00" /> <set name="icon" val="icon.etc_mithril_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -809,9 +805,8 @@
<item id="1345" name="Arrow of Light" type="EtcItem"> <item id="1345" name="Arrow of Light" type="EtcItem">
<!-- Very hard arrow made of unknown material. For S-grade bows. --> <!-- Very hard arrow made of unknown material. For S-grade bows. -->
<set name="icon" val="icon.etc_shining_quiver_i00" /> <set name="icon" val="icon.etc_shining_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -461,9 +461,8 @@
<item id="9632" name="Wooden Bolt" type="EtcItem"> <item id="9632" name="Wooden Bolt" type="EtcItem">
<!-- Can be used as a bolt for a no-grade Crossbow. --> <!-- Can be used as a bolt for a no-grade Crossbow. -->
<set name="icon" val="icon.etc_wooden_bolt_i00" /> <set name="icon" val="icon.etc_wooden_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="WOOD" /> <set name="material" val="WOOD" />
<set name="weight" val="6" /> <set name="weight" val="6" />
@@ -474,9 +473,8 @@
<item id="9633" name="Bone Bolt" type="EtcItem"> <item id="9633" name="Bone Bolt" type="EtcItem">
<!-- Can be used as a bolt for a D-grade Crossbow. --> <!-- Can be used as a bolt for a D-grade Crossbow. -->
<set name="icon" val="icon.etc_bone_bolt_i00" /> <set name="icon" val="icon.etc_bone_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="5" /> <set name="weight" val="5" />
@@ -488,9 +486,8 @@
<item id="9634" name="Steel Bolt" type="EtcItem"> <item id="9634" name="Steel Bolt" type="EtcItem">
<!-- Can be used as a bolt for a C-grade Crossbow. --> <!-- Can be used as a bolt for a C-grade Crossbow. -->
<set name="icon" val="icon.etc_fine_steel_bolt_i00" /> <set name="icon" val="icon.etc_fine_steel_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -502,9 +499,8 @@
<item id="9635" name="Silver Bolt" type="EtcItem"> <item id="9635" name="Silver Bolt" type="EtcItem">
<!-- This silver-plated steel bolt can be used with a B-grade Crossbow. --> <!-- This silver-plated steel bolt can be used with a B-grade Crossbow. -->
<set name="icon" val="icon.etc_silver_bolt_i00" /> <set name="icon" val="icon.etc_silver_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -516,9 +512,8 @@
<item id="9636" name="Mithril Bolt" type="EtcItem"> <item id="9636" name="Mithril Bolt" type="EtcItem">
<!-- This mithril-plated steel bolt can be used with an A-grade Crossbow. --> <!-- This mithril-plated steel bolt can be used with an A-grade Crossbow. -->
<set name="icon" val="icon.etc_mithril_bolt_i00" /> <set name="icon" val="icon.etc_mithril_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -530,9 +525,8 @@
<item id="9637" name="Bolt of Light" type="EtcItem"> <item id="9637" name="Bolt of Light" type="EtcItem">
<!-- This bolt, made of unknown material, can be used with an S-grade Crossbow. --> <!-- This bolt, made of unknown material, can be used with an S-grade Crossbow. -->
<set name="icon" val="icon.etc_shining_bolt_i00" /> <set name="icon" val="icon.etc_shining_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -879,9 +879,8 @@
<item id="18550" name="Orichalcum Arrow" type="EtcItem"> <item id="18550" name="Orichalcum Arrow" type="EtcItem">
<!-- Arrow made of Orichalcum. Used as arrows for R-grade bows. --> <!-- Arrow made of Orichalcum. Used as arrows for R-grade bows. -->
<set name="icon" val="icon.etc_oricalcum_quiver_i00" /> <set name="icon" val="icon.etc_oricalcum_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="12" /> <set name="price" val="12" />
@@ -607,9 +607,8 @@
<item id="19443" name="Orichalcum Bolt" type="EtcItem"> <item id="19443" name="Orichalcum Bolt" type="EtcItem">
<!-- Bolt made of Orichalcum. Used as bolts for R-grade crossbows. --> <!-- Bolt made of Orichalcum. Used as bolts for R-grade crossbows. -->
<set name="icon" val="icon.etc_oricalcum_bolt_i00" /> <set name="icon" val="icon.etc_oricalcum_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="price" val="12" /> <set name="price" val="12" />
@@ -1338,9 +1338,8 @@
<item id="22067" name="Bone Arrow" type="EtcItem"> <item id="22067" name="Bone Arrow" type="EtcItem">
<!-- Arrow made of bone that was sharpened at the tip. Can be used with a D-grade bow. It is very light. --> <!-- Arrow made of bone that was sharpened at the tip. Can be used with a D-grade bow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_bone_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_bone_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1355,9 +1354,8 @@
<item id="22068" name="Steel Arrow" type="EtcItem"> <item id="22068" name="Steel Arrow" type="EtcItem">
<!-- Powerful arrow made of steel. Can be used with a C-grade bow. It is very light. --> <!-- Powerful arrow made of steel. Can be used with a C-grade bow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_fine_steel_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_fine_steel_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1372,9 +1370,8 @@
<item id="22069" name="Silver Arrow" type="EtcItem"> <item id="22069" name="Silver Arrow" type="EtcItem">
<!-- Steel arrow plated with silver. Can be used with a B-grade bow. It is very light. --> <!-- Steel arrow plated with silver. Can be used with a B-grade bow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_silver_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_silver_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1389,9 +1386,8 @@
<item id="22070" name="Mithril Arrow" type="EtcItem"> <item id="22070" name="Mithril Arrow" type="EtcItem">
<!-- Steel arrow plated with mithril. Can be used with an A-grade bow. It is very light. --> <!-- Steel arrow plated with mithril. Can be used with an A-grade bow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_mithril_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_mithril_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1406,9 +1402,8 @@
<item id="22071" name="Arrow of Light" type="EtcItem"> <item id="22071" name="Arrow of Light" type="EtcItem">
<!-- The strongest arrow. Materials are unknown. It is very light. --> <!-- The strongest arrow. Materials are unknown. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_shining_arrow_i00" /> <set name="icon" val="br_cashtex.item.br_cash_shining_arrow_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -815,9 +815,8 @@
<item id="22144" name="Bone Bolt" type="EtcItem"> <item id="22144" name="Bone Bolt" type="EtcItem">
<!-- Bolt made of bone that was sharpened at the tip. Can be used with a D-grade Crossbow. It is very light. --> <!-- Bolt made of bone that was sharpened at the tip. Can be used with a D-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_bone_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_bone_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -832,9 +831,8 @@
<item id="22145" name="Steel Bolt" type="EtcItem"> <item id="22145" name="Steel Bolt" type="EtcItem">
<!-- Powerful bolt made of steel. Can used with a C-grade Crossbow. It is very light. --> <!-- Powerful bolt made of steel. Can used with a C-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_fine_steel_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_fine_steel_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -849,9 +847,8 @@
<item id="22146" name="Silver Bolt" type="EtcItem"> <item id="22146" name="Silver Bolt" type="EtcItem">
<!-- Steel bolt plated with silver. Can be used with a B-grade Crossbow. It is very light. --> <!-- Steel bolt plated with silver. Can be used with a B-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_silver_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_silver_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -866,9 +863,8 @@
<item id="22147" name="Mithril Bolt" type="EtcItem"> <item id="22147" name="Mithril Bolt" type="EtcItem">
<!-- Steel bolt plated with mithril. Can be used with an A-grade Crossbow. It is very light. --> <!-- Steel bolt plated with mithril. Can be used with an A-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_mithril_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_mithril_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -883,9 +879,8 @@
<item id="22148" name="Bolt of Light" type="EtcItem"> <item id="22148" name="Bolt of Light" type="EtcItem">
<!-- Bolt made of unknown materials. Can be used with an S-grade Crossbow. It is very light. --> <!-- Bolt made of unknown materials. Can be used with an S-grade Crossbow. It is very light. -->
<set name="icon" val="br_cashtex.item.br_cash_shining_bolt_i00" /> <set name="icon" val="br_cashtex.item.br_cash_shining_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="1" /> <set name="weight" val="1" />
@@ -1328,9 +1328,8 @@
</item> </item>
<item id="30375" name="Infinite Orichalcum Quiver" additionalName="Additional Hit" type="EtcItem"> <item id="30375" name="Infinite Orichalcum Quiver" additionalName="Additional Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1338,9 +1337,8 @@
</item> </item>
<item id="30376" name="Infinite Orichalcum Quiver" additionalName="Critical Hit" type="EtcItem"> <item id="30376" name="Infinite Orichalcum Quiver" additionalName="Critical Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1348,9 +1346,8 @@
</item> </item>
<item id="30377" name="Infinite Orichalcum Quiver" additionalName="Bleed Hit" type="EtcItem"> <item id="30377" name="Infinite Orichalcum Quiver" additionalName="Bleed Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1358,9 +1355,8 @@
</item> </item>
<item id="30378" name="Infinite Orichalcum Bolt Container" additionalName="Additional Hit" type="EtcItem"> <item id="30378" name="Infinite Orichalcum Bolt Container" additionalName="Additional Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1368,9 +1364,8 @@
</item> </item>
<item id="30379" name="Infinite Orichalcum Bolt Container" additionalName="Critical Hit" type="EtcItem"> <item id="30379" name="Infinite Orichalcum Bolt Container" additionalName="Critical Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -1378,9 +1373,8 @@
</item> </item>
<item id="30380" name="Infinite Orichalcum Bolt Container" additionalName="Bleed Hit" type="EtcItem"> <item id="30380" name="Infinite Orichalcum Bolt Container" additionalName="Bleed Hit" type="EtcItem">
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -922,9 +922,8 @@
<item id="32249" name="Infinite Wooden Quiver" type="EtcItem"> <item id="32249" name="Infinite Wooden Quiver" type="EtcItem">
<!-- Quiver containing arrows made of wood. Used with a No-grade bow. --> <!-- Quiver containing arrows made of wood. Used with a No-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1580" /> <set name="price" val="1580" />
@@ -934,9 +933,8 @@
<item id="32250" name="Infinite Bone Quiver" type="EtcItem"> <item id="32250" name="Infinite Bone Quiver" type="EtcItem">
<!-- Quiver containing arrows made of sharply ground bone. Used with a D-grade bow. --> <!-- Quiver containing arrows made of sharply ground bone. Used with a D-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="7320" /> <set name="price" val="7320" />
@@ -947,9 +945,8 @@
<item id="32251" name="Infinite Steel Quiver" type="EtcItem"> <item id="32251" name="Infinite Steel Quiver" type="EtcItem">
<!-- Quiver containing arrows made of steel. Used with a C-grade bow. --> <!-- Quiver containing arrows made of steel. Used with a C-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="11490" /> <set name="price" val="11490" />
@@ -960,9 +957,8 @@
<item id="32252" name="Infinite Silver Quiver" type="EtcItem"> <item id="32252" name="Infinite Silver Quiver" type="EtcItem">
<!-- Quiver containing steel arrows plated in silver. Used with a B-grade bow. --> <!-- Quiver containing steel arrows plated in silver. Used with a B-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="34630" /> <set name="price" val="34630" />
@@ -973,9 +969,8 @@
<item id="32253" name="Infinite Mithril Quiver" type="EtcItem"> <item id="32253" name="Infinite Mithril Quiver" type="EtcItem">
<!-- Quiver containing steel arrows plated in mithril. Used with an A-grade bow. --> <!-- Quiver containing steel arrows plated in mithril. Used with an A-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="364800" /> <set name="price" val="364800" />
@@ -986,9 +981,8 @@
<item id="32254" name="Infinite Quiver of Light" type="EtcItem"> <item id="32254" name="Infinite Quiver of Light" type="EtcItem">
<!-- This quiver contains arrows made of unknown material. Used with S-grade bows. --> <!-- This quiver contains arrows made of unknown material. Used with S-grade bows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1716000" /> <set name="price" val="1716000" />
@@ -999,9 +993,8 @@
<item id="32255" name="Infinite Orichalcum Quiver" type="EtcItem"> <item id="32255" name="Infinite Orichalcum Quiver" type="EtcItem">
<!-- Quiver containing arrows made of orichalcum. Used with an R-grade bow. --> <!-- Quiver containing arrows made of orichalcum. Used with an R-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="4528800" /> <set name="price" val="4528800" />
@@ -1012,9 +1005,8 @@
<item id="32256" name="Infinite Wooden Bolt Container" type="EtcItem"> <item id="32256" name="Infinite Wooden Bolt Container" type="EtcItem">
<!-- Container with bolts made of wood. Used with a No-grade Crossbow. --> <!-- Container with bolts made of wood. Used with a No-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1580" /> <set name="price" val="1580" />
@@ -1024,9 +1016,8 @@
<item id="32257" name="Infinite Bone Bolt Container" type="EtcItem"> <item id="32257" name="Infinite Bone Bolt Container" type="EtcItem">
<!-- Container with bolts made of sharply ground bone. Used with a D-grade Crossbow. --> <!-- Container with bolts made of sharply ground bone. Used with a D-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="7320" /> <set name="price" val="7320" />
@@ -1037,9 +1028,8 @@
<item id="32258" name="Infinite Steel Bolt Container" type="EtcItem"> <item id="32258" name="Infinite Steel Bolt Container" type="EtcItem">
<!-- Container with bolts made of steel. Used with a C-grade Crossbow. --> <!-- Container with bolts made of steel. Used with a C-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="11490" /> <set name="price" val="11490" />
@@ -1050,9 +1040,8 @@
<item id="32259" name="Infinite Silver Bolt Container" type="EtcItem"> <item id="32259" name="Infinite Silver Bolt Container" type="EtcItem">
<!-- Container with steel bolts plated in silver. Used with a B-grade Crossbow. --> <!-- Container with steel bolts plated in silver. Used with a B-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="34630" /> <set name="price" val="34630" />
@@ -1063,9 +1052,8 @@
<item id="32260" name="Infinite Mithril Bolt Container" type="EtcItem"> <item id="32260" name="Infinite Mithril Bolt Container" type="EtcItem">
<!-- A container of bolts coated by mithril. For A-grade bows. --> <!-- A container of bolts coated by mithril. For A-grade bows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="364800" /> <set name="price" val="364800" />
@@ -1076,9 +1064,8 @@
<item id="32261" name="Infinite Light Bolt Container" type="EtcItem"> <item id="32261" name="Infinite Light Bolt Container" type="EtcItem">
<!-- This container Has bolts made of unknown material. Used with S-grade crossbows. --> <!-- This container Has bolts made of unknown material. Used with S-grade crossbows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1716000" /> <set name="price" val="1716000" />
@@ -1089,9 +1076,8 @@
<item id="32262" name="Infinite Orichalcum Bolt Container" type="EtcItem"> <item id="32262" name="Infinite Orichalcum Bolt Container" type="EtcItem">
<!-- Container with bolts made of orichalcum. Used with an R-grade Crossbow. --> <!-- Container with bolts made of orichalcum. Used with an R-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="4528800" /> <set name="price" val="4528800" />
@@ -269,7 +269,7 @@
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="is_stackable" val="true" /> <set name="is_stackable" val="true" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
</item> </item>
<item id="45429" name="Orichalcum Bolt" additionalName="Event" type="EtcItem"> <item id="45429" name="Orichalcum Bolt" additionalName="Event" type="EtcItem">
@@ -281,7 +281,7 @@
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="is_stackable" val="true" /> <set name="is_stackable" val="true" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
</item> </item>
<item id="45430" name="Entrance Pass: Spezion (Epic)" type="EtcItem"> <item id="45430" name="Entrance Pass: Spezion (Epic)" type="EtcItem">
@@ -1560,9 +1560,8 @@
<!-- Enhanced Orichalcum arrow with +5% Atk. Spd. Used as arrows for R-grade bows. --> <!-- Enhanced Orichalcum arrow with +5% Atk. Spd. Used as arrows for R-grade bows. -->
<set name="icon" val="icon.etc_oricalcum_quiver_i00" /> <set name="icon" val="icon.etc_oricalcum_quiver_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1577,9 +1576,8 @@
<!-- Enhanced Orichalcum arrow with +5% P. Atk. Used as arrows for R-grade bows. --> <!-- Enhanced Orichalcum arrow with +5% P. Atk. Used as arrows for R-grade bows. -->
<set name="icon" val="icon.etc_oricalcum_quiver_i00" /> <set name="icon" val="icon.etc_oricalcum_quiver_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1594,9 +1592,8 @@
<!-- Enhanced Orichalcum arrow with Additional Hit. Used as arrows for R-grade bows. --> <!-- Enhanced Orichalcum arrow with Additional Hit. Used as arrows for R-grade bows. -->
<set name="icon" val="icon.etc_oricalcum_quiver_i00" /> <set name="icon" val="icon.etc_oricalcum_quiver_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1611,9 +1608,8 @@
<!-- Enhanced Orichalcum bolt with +5% Atk. Spd. Used as bolts for R-grade crossbows. --> <!-- Enhanced Orichalcum bolt with +5% Atk. Spd. Used as bolts for R-grade crossbows. -->
<set name="icon" val="icon.etc_oricalcum_bolt_i00" /> <set name="icon" val="icon.etc_oricalcum_bolt_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1628,9 +1624,8 @@
<!-- Enhanced Orichalcum bolt with +5% P. Atk. Used as bolts for R-grade crossbows. --> <!-- Enhanced Orichalcum bolt with +5% P. Atk. Used as bolts for R-grade crossbows. -->
<set name="icon" val="icon.etc_oricalcum_bolt_i00" /> <set name="icon" val="icon.etc_oricalcum_bolt_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -1645,9 +1640,8 @@
<!-- Allows to make an extra shot. Used as bolts for R-grade ?rossbows. --> <!-- Allows to make an extra shot. Used as bolts for R-grade ?rossbows. -->
<set name="icon" val="icon.etc_oricalcum_bolt_i00" /> <set name="icon" val="icon.etc_oricalcum_bolt_i00" />
<set name="price" val="100" /> <set name="price" val="100" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="is_tradable" val="false" /> <set name="is_tradable" val="false" />
@@ -450,9 +450,8 @@
<item id="80433" name="Infinite Orichalcum Quiver" type="EtcItem"> <item id="80433" name="Infinite Orichalcum Quiver" type="EtcItem">
<!-- Quiver containing arrows made of Orichalcum. Used with an R-grade Bow. --> <!-- Quiver containing arrows made of Orichalcum. Used with an R-grade Bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -463,9 +462,8 @@
<item id="80434" name="Infinite Orichalcum Bolt Container" type="EtcItem"> <item id="80434" name="Infinite Orichalcum Bolt Container" type="EtcItem">
<!-- Container with bolts made of Orichalcum. Used with an R-grade Crossbow. --> <!-- Container with bolts made of Orichalcum. Used with an R-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="crystal_type" val="R" /> <set name="crystal_type" val="R" />
@@ -47,11 +47,14 @@ import org.l2jmobius.gameserver.model.actor.instance.EventMonsterInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate; import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.Armor; import org.l2jmobius.gameserver.model.items.Armor;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.Weapon; import org.l2jmobius.gameserver.model.items.Weapon;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.skills.AmmunitionSkillList;
import org.l2jmobius.gameserver.util.DocumentItem; import org.l2jmobius.gameserver.util.DocumentItem;
import org.l2jmobius.gameserver.util.GMAudit; import org.l2jmobius.gameserver.util.GMAudit;
@@ -194,6 +197,15 @@ public class ItemTable
if (item instanceof EtcItem) if (item instanceof EtcItem)
{ {
_etcItems.put(item.getId(), (EtcItem) item); _etcItems.put(item.getId(), (EtcItem) item);
if ((item.getItemType() == EtcItemType.ARROW) || (item.getItemType() == EtcItemType.BOLT))
{
final List<ItemSkillHolder> skills = item.getAllSkills();
if (skills != null)
{
AmmunitionSkillList.add(skills);
}
}
} }
else if (item instanceof Armor) else if (item instanceof Armor)
{ {
@@ -1154,11 +1154,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Try to do what is expected by having more attack speed. // Try to do what is expected by having more attack speed.
// final int reuse = (int) (Formulas.calculateReuseTime(this, weaponItem) / (Math.max(1, _stat.getAttackSpeedMultiplier() - 1))); // final int reuse = (int) (Formulas.calculateReuseTime(this, weaponItem) / (Math.max(1, _stat.getAttackSpeedMultiplier() - 1)));
// Consume arrows // Consume ammunition.
final Inventory inventory = getInventory(); final Inventory inventory = getInventory();
if (inventory != null) if (inventory != null)
{ {
inventory.reduceArrowCount(crossbow ? EtcItemType.BOLT : EtcItemType.ARROW); inventory.reduceAmmunitionCount(crossbow ? EtcItemType.BOLT : EtcItemType.ARROW);
} }
// Check if the Creature is a PlayerInstance // Check if the Creature is a PlayerInstance
@@ -220,6 +220,7 @@ import org.l2jmobius.gameserver.model.holders.AutoPlaySettingsHolder;
import org.l2jmobius.gameserver.model.holders.AutoUseSettingsHolder; import org.l2jmobius.gameserver.model.holders.AutoUseSettingsHolder;
import org.l2jmobius.gameserver.model.holders.DamageTakenHolder; import org.l2jmobius.gameserver.model.holders.DamageTakenHolder;
import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.holders.MovieHolder; import org.l2jmobius.gameserver.model.holders.MovieHolder;
import org.l2jmobius.gameserver.model.holders.PlayerEventHolder; import org.l2jmobius.gameserver.model.holders.PlayerEventHolder;
import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder;
@@ -261,6 +262,7 @@ import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.siege.Fort; import org.l2jmobius.gameserver.model.siege.Fort;
import org.l2jmobius.gameserver.model.siege.Siege; import org.l2jmobius.gameserver.model.siege.Siege;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.AmmunitionSkillList;
import org.l2jmobius.gameserver.model.skills.BuffInfo; import org.l2jmobius.gameserver.model.skills.BuffInfo;
import org.l2jmobius.gameserver.model.skills.CommonSkill; import org.l2jmobius.gameserver.model.skills.CommonSkill;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
@@ -725,6 +727,8 @@ public class PlayerInstance extends Playable
private BroochJewel _activeRubyJewel = null; private BroochJewel _activeRubyJewel = null;
private BroochJewel _activeShappireJewel = null; private BroochJewel _activeShappireJewel = null;
private int _lastAmmunitionId = 0;
/** Event parameters */ /** Event parameters */
private PlayerEventHolder eventStatus = null; private PlayerEventHolder eventStatus = null;
@@ -853,7 +857,7 @@ public class PlayerInstance extends Playable
// Shared dualclass skills. // Shared dualclass skills.
private static final String KNOWN_DUAL_SKILLS_VAR = "KNOWN_DUAL_SKILLS"; private static final String KNOWN_DUAL_SKILLS_VAR = "KNOWN_DUAL_SKILLS";
private static final int[] DUAL_CLASS_SKILLS = new int[] private static final int[] DUAL_CLASS_SKILLS =
{ {
19222, // Dignity of the Exalted 19222, // Dignity of the Exalted
19223, // Belief of the Exalted 19223, // Belief of the Exalted
@@ -4439,20 +4443,6 @@ public class PlayerInstance extends Playable
else else
{ {
addItem("Pickup", target, null, true); addItem("Pickup", target, null, true);
// Auto-Equip arrows/bolts if player has a bow/crossbow and player picks up arrows/bolts.
final ItemInstance weapon = _inventory.getPaperdollItem(Inventory.PAPERDOLL_RHAND);
if (weapon != null)
{
final EtcItem etcItem = target.getEtcItem();
if (etcItem != null)
{
final EtcItemType itemType = etcItem.getItemType();
if (((weapon.getItemType() == WeaponType.BOW) && (itemType == EtcItemType.ARROW)) || (((weapon.getItemType() == WeaponType.CROSSBOW) || (weapon.getItemType() == WeaponType.TWOHANDCROSSBOW)) && (itemType == EtcItemType.BOLT)))
{
checkAndEquipAmmunition(itemType);
}
}
}
} }
} }
} }
@@ -5772,33 +5762,85 @@ public class PlayerInstance extends Playable
@Override @Override
protected boolean checkAndEquipAmmunition(EtcItemType type) protected boolean checkAndEquipAmmunition(EtcItemType type)
{ {
ItemInstance arrows = _inventory.getPaperdollItem(Inventory.PAPERDOLL_LHAND); ItemInstance ammunition = null;
if (arrows == null)
{
final Weapon weapon = getActiveWeaponItem(); final Weapon weapon = getActiveWeaponItem();
if (type == EtcItemType.ARROW) if (type == EtcItemType.ARROW)
{ {
arrows = _inventory.findArrowForBow(weapon); ammunition = _inventory.findArrowForBow(weapon);
} }
else if (type == EtcItemType.BOLT) else if (type == EtcItemType.BOLT)
{ {
arrows = _inventory.findBoltForCrossBow(weapon); ammunition = _inventory.findBoltForCrossBow(weapon);
} }
if (arrows != null)
if (ammunition != null)
{ {
// Equip arrows needed in left hand addAmmunitionSkills(ammunition);
_inventory.setPaperdollItem(Inventory.PAPERDOLL_LHAND, arrows);
sendItemList(); sendItemList();
return true; return true;
} }
}
else removeAmmunitionSkills();
{
return true;
}
return false; return false;
} }
private void addAmmunitionSkills(ItemInstance ammunition)
{
final int currentAmmunitionId = ammunition.getId();
if (_lastAmmunitionId == currentAmmunitionId)
{
return;
}
removeAmmunitionSkills();
_lastAmmunitionId = currentAmmunitionId;
final List<ItemSkillHolder> skills = ammunition.getItem().getAllSkills();
if (skills == null)
{
return;
}
boolean sendSkillList = false;
for (ItemSkillHolder holder : skills)
{
if (!isAffectedBySkill(holder))
{
final Skill skill = holder.getSkill();
if (skill.isPassive())
{
addSkill(skill);
sendSkillList = true;
}
}
}
if (sendSkillList)
{
sendSkillList();
}
}
public void removeAmmunitionSkills()
{
if (_lastAmmunitionId == 0)
{
return;
}
_lastAmmunitionId = 0;
boolean sendSkillList = false;
for (Integer skillId : AmmunitionSkillList.values())
{
if (removeSkill(skillId.intValue(), true) != null)
{
sendSkillList = true;
}
}
if (sendSkillList)
{
sendSkillList();
}
}
/** /**
* Disarm the player's weapon. * Disarm the player's weapon.
* @return {@code true} if the player was disarmed or doesn't have a weapon to disarm, {@code false} otherwise. * @return {@code true} if the player was disarmed or doesn't have a weapon to disarm, {@code false} otherwise.
@@ -53,14 +53,12 @@ import org.l2jmobius.gameserver.model.holders.AgathionSkillHolder;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder; import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceType; import org.l2jmobius.gameserver.model.items.appearance.AppearanceType;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.ArmorType; import org.l2jmobius.gameserver.model.items.type.ArmorType;
import org.l2jmobius.gameserver.model.items.type.EtcItemType; import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.items.type.ItemType;
import org.l2jmobius.gameserver.model.items.type.WeaponType; import org.l2jmobius.gameserver.model.items.type.WeaponType;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillConditionScope; import org.l2jmobius.gameserver.model.skills.SkillConditionScope;
@@ -231,61 +229,57 @@ public abstract class Inventory extends ItemContainer
@Override @Override
public void notifyUnequiped(int slot, ItemInstance item, Inventory inventory) public void notifyUnequiped(int slot, ItemInstance item, Inventory inventory)
{ {
if (slot != PAPERDOLL_RHAND) if ((slot != PAPERDOLL_RHAND) || !item.isWeapon())
{ {
return; return;
} }
if (item.getItemType() == WeaponType.BOW) switch (item.getWeaponItem().getItemType())
{ {
final ItemInstance arrow = inventory.getPaperdollItem(PAPERDOLL_LHAND); case BOW:
if (arrow != null) {
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (((leftHandItem != null) && ((leftHandItem.getItemType()) != ArmorType.SIGIL)))
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
} final PlayerInstance owner = inventory.getOwner().getActingPlayer();
else if ((item.getItemType() == WeaponType.CROSSBOW) || (item.getItemType() == WeaponType.TWOHANDCROSSBOW)) if (owner != null)
{ {
final ItemInstance bolts = inventory.getPaperdollItem(PAPERDOLL_LHAND); owner.removeAmmunitionSkills();
if (bolts != null) }
break;
}
case CROSSBOW:
case TWOHANDCROSSBOW:
{
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (((leftHandItem != null) && ((leftHandItem.getItemType()) != ArmorType.SIGIL)))
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
} final PlayerInstance owner = inventory.getOwner().getActingPlayer();
else if (item.getItemType() == WeaponType.FISHINGROD) if (owner != null)
{ {
final ItemInstance lure = inventory.getPaperdollItem(PAPERDOLL_LHAND); owner.removeAmmunitionSkills();
if (lure != null) }
break;
}
case FISHINGROD:
{
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (leftHandItem != null)
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
break;
}
} }
} }
@Override @Override
public void notifyEquiped(int slot, ItemInstance item, Inventory inventory) public void notifyEquiped(int slot, ItemInstance item, Inventory inventory)
{ {
if (slot != PAPERDOLL_RHAND)
{
return;
}
if (item.getItemType() == WeaponType.BOW)
{
final ItemInstance arrow = inventory.findArrowForBow(item.getItem());
if (arrow != null)
{
inventory.setPaperdollItem(PAPERDOLL_LHAND, arrow);
}
}
else if ((item.getItemType() == WeaponType.CROSSBOW) || (item.getItemType() == WeaponType.TWOHANDCROSSBOW))
{
final ItemInstance bolts = inventory.findBoltForCrossBow(item.getItem());
if (bolts != null)
{
inventory.setPaperdollItem(PAPERDOLL_LHAND, bolts);
}
}
} }
} }
@@ -1847,24 +1841,6 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
// Equip only identical grade arrows.
final EtcItem etcItem = item.getEtcItem();
if (etcItem != null)
{
final ItemInstance weapon = getPaperdollItem(Inventory.PAPERDOLL_RHAND);
if (weapon != null)
{
final EtcItemType itemType = etcItem.getItemType();
final ItemType weaponItemType = weapon.getItemType();
if ((((weaponItemType == WeaponType.BOW) && (itemType == EtcItemType.ARROW)) //
|| (((weaponItemType == WeaponType.CROSSBOW) || (weaponItemType == WeaponType.TWOHANDCROSSBOW)) && (itemType == EtcItemType.BOLT))) //
&& (weapon.getItem().getCrystalTypePlus() != item.getItem().getCrystalTypePlus()))
{
return;
}
}
}
final PlayerInstance player = (PlayerInstance) getOwner(); final PlayerInstance player = (PlayerInstance) getOwner();
if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !player.isHero() && item.isHeroItem()) if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !player.isHero() && item.isHeroItem())
{ {
@@ -1885,27 +1861,23 @@ public abstract class Inventory extends ItemContainer
} }
} }
// don't care about arrows, listener will unequip them (hopefully)
// handle full armor // handle full armor
// formal dress // formal dress
if (targetSlot == Item.SLOT_LR_HAND) if (targetSlot == Item.SLOT_LR_HAND)
{ {
setPaperdollItem(PAPERDOLL_LHAND, null); final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND);
if ((rh != null) && (!rh.isArmor() || (rh.getArmorItem().getItemType() != ArmorType.SIGIL)))
{
setPaperdollItem(PAPERDOLL_RHAND, null);
}
setPaperdollItem(PAPERDOLL_RHAND, item); setPaperdollItem(PAPERDOLL_RHAND, item);
} }
else if (targetSlot == Item.SLOT_L_HAND) else if (targetSlot == Item.SLOT_L_HAND)
{ {
final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND); final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND);
if (rh != null) if ((rh != null) && (rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE)))
{ {
if (item.getItemType() == ArmorType.SIGIL) if (!item.isArmor() || (item.getArmorItem().getItemType() != ArmorType.SIGIL))
{
if ((rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !(((rh.getItemType() == WeaponType.BOW) || (rh.getItemType() == WeaponType.POLE) || (rh.getItemType() == WeaponType.DUALFIST) || (rh.getItemType() == WeaponType.DUALBLUNT) || (rh.getItemType() == WeaponType.DUALDAGGER) || (rh.getItemType() == WeaponType.DUAL) || (rh.getItemType() == WeaponType.BLUNT) || (rh.getItemType() == WeaponType.SWORD) || (rh.getItemType() == WeaponType.CROSSBOW) || (rh.getItemType() == WeaponType.TWOHANDCROSSBOW)) || ((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE))))
{
setPaperdollItem(PAPERDOLL_RHAND, null);
}
}
else if ((rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !(((rh.getItemType() == WeaponType.BOW) && (item.getItemType() == EtcItemType.ARROW)) || (((rh.getItemType() == WeaponType.CROSSBOW) || (rh.getItemType() == WeaponType.TWOHANDCROSSBOW)) && (item.getItemType() == EtcItemType.BOLT)) || ((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE))))
{ {
setPaperdollItem(PAPERDOLL_RHAND, null); setPaperdollItem(PAPERDOLL_RHAND, null);
} }
@@ -2096,6 +2068,18 @@ public abstract class Inventory extends ItemContainer
return _totalWeight; return _totalWeight;
} }
/**
* Reduce the arrow number of the Creature.<br>
* <br>
* <b><u>Overridden in</u>:</b>
* <li>PlayerInstance</li><br>
* @param type
*/
public void reduceAmmunitionCount(EtcItemType type)
{
// Default is to do nothing.
}
/** /**
* Return the ItemInstance of the arrows needed for this bow. * Return the ItemInstance of the arrows needed for this bow.
* @param bow : Item designating the bow * @param bow : Item designating the bow
@@ -2462,18 +2446,6 @@ public abstract class Inventory extends ItemContainer
_blockedItemSlotsMask = itemSlotsMask; _blockedItemSlotsMask = itemSlotsMask;
} }
/**
* Reduce the arrow number of the Creature.<br>
* <br>
* <b><u>Overridden in</u>:</b>
* <li>PlayerInstance</li><br>
* @param type
*/
public void reduceArrowCount(EtcItemType type)
{
// default is to do nothing
}
/** /**
* Gets the items in paperdoll slots filtered by filter. * Gets the items in paperdoll slots filtered by filter.
* @param filters multiple filters * @param filters multiple filters
@@ -42,6 +42,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDe
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDrop; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDrop;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemTransfer; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemTransfer;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.Weapon;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType; import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.variables.ItemVariables; import org.l2jmobius.gameserver.model.variables.ItemVariables;
@@ -955,26 +956,52 @@ public class PlayerInventory extends Inventory
* @param type * @param type
*/ */
@Override @Override
public void reduceArrowCount(EtcItemType type) public void reduceAmmunitionCount(EtcItemType type)
{ {
if ((type != EtcItemType.ARROW) && (type != EtcItemType.BOLT)) if ((type != EtcItemType.ARROW) && (type != EtcItemType.BOLT))
{ {
LOGGER.log(Level.WARNING, type.toString(), " which is not arrow type passed to PlayerInstance.reduceArrowCount()"); LOGGER.log(Level.WARNING, type.toString(), " which is not ammo type.");
return; return;
} }
final ItemInstance arrows = getPaperdollItem(Inventory.PAPERDOLL_LHAND); final Weapon weapon = _owner.getActiveWeaponItem();
if ((arrows == null) || (arrows.getItemType() != type)) if (weapon == null)
{ {
return; return;
} }
if (arrows.getEtcItem().isInfinite()) // Null-safe due to type checks above ItemInstance ammunition = null;
switch (weapon.getItemType())
{
case BOW:
{
ammunition = findArrowForBow(weapon);
break;
}
case CROSSBOW:
case TWOHANDCROSSBOW:
{
ammunition = findBoltForCrossBow(weapon);
break;
}
default:
{
return;
}
}
if ((ammunition == null) || (ammunition.getItemType() != type))
{ {
return; return;
} }
updateItemCountNoDbUpdate(null, arrows, -1, _owner, null); if (ammunition.getEtcItem().isInfinite())
{
return;
}
// Reduce item count.
updateItemCountNoDbUpdate(null, ammunition, -1, _owner, null);
} }
/** /**
@@ -0,0 +1,44 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.skills;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
/**
* @author Mobius
*/
public class AmmunitionSkillList
{
private static final Set<Integer> SKILLS = ConcurrentHashMap.newKeySet();
public static void add(List<ItemSkillHolder> skills)
{
for (ItemSkillHolder skill : skills)
{
SKILLS.add(skill.getSkillId());
}
}
public static Set<Integer> values()
{
return SKILLS;
}
}
@@ -53,8 +53,10 @@ import org.l2jmobius.gameserver.model.clan.Clan;
import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder; import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder;
import org.l2jmobius.gameserver.model.holders.ClientHardwareInfoHolder; import org.l2jmobius.gameserver.model.holders.ClientHardwareInfoHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.quest.Quest; import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.residences.ClanHall; import org.l2jmobius.gameserver.model.residences.ClanHall;
import org.l2jmobius.gameserver.model.siege.Fort; import org.l2jmobius.gameserver.model.siege.Fort;
@@ -668,6 +670,13 @@ public class EnterWorld implements IClientIncomingPacket
player.getInventory().equipItemAndRecord(agathion); player.getInventory().equipItemAndRecord(agathion);
} }
// Old ammunition check.
final ItemInstance leftHandItem = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
if ((leftHandItem != null) && ((leftHandItem.getItemType() == EtcItemType.ARROW) || (leftHandItem.getItemType() == EtcItemType.BOLT)))
{
player.getInventory().unEquipItemInBodySlot(Inventory.PAPERDOLL_LHAND);
}
if (Config.ENABLE_ATTENDANCE_REWARDS) if (Config.ENABLE_ATTENDANCE_REWARDS)
{ {
ThreadPool.schedule(() -> ThreadPool.schedule(() ->
@@ -403,9 +403,8 @@
<item id="17" name="Wooden Arrow" type="EtcItem"> <item id="17" name="Wooden Arrow" type="EtcItem">
<!-- Arrow made of wood. It is an arrow used for a No-grade bow. --> <!-- Arrow made of wood. It is an arrow used for a No-grade bow. -->
<set name="icon" val="icon.etc_wooden_quiver_i00" /> <set name="icon" val="icon.etc_wooden_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="WOOD" /> <set name="material" val="WOOD" />
<set name="weight" val="6" /> <set name="weight" val="6" />
@@ -749,9 +749,8 @@
<item id="1341" name="Bone Arrow" type="EtcItem"> <item id="1341" name="Bone Arrow" type="EtcItem">
<!-- Arrow made from a piece of sharpened bone. It is used as an arrow for a D-grade bow. --> <!-- Arrow made from a piece of sharpened bone. It is used as an arrow for a D-grade bow. -->
<set name="icon" val="icon.etc_bone_quiver_i00" /> <set name="icon" val="icon.etc_bone_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="5" /> <set name="weight" val="5" />
@@ -764,9 +763,8 @@
<item id="1342" name="Steel Arrow" type="EtcItem"> <item id="1342" name="Steel Arrow" type="EtcItem">
<!-- Powerful arrow made of steel. It is used as an arrow for a C-grade bow. --> <!-- Powerful arrow made of steel. It is used as an arrow for a C-grade bow. -->
<set name="icon" val="icon.etc_fine_steel_quiver_i00" /> <set name="icon" val="icon.etc_fine_steel_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -779,9 +777,8 @@
<item id="1343" name="Silver Arrow" type="EtcItem"> <item id="1343" name="Silver Arrow" type="EtcItem">
<!-- Steel arrow with silver coating. For B-grade bows. --> <!-- Steel arrow with silver coating. For B-grade bows. -->
<set name="icon" val="icon.etc_silver_quiver_i00" /> <set name="icon" val="icon.etc_silver_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -794,9 +791,8 @@
<item id="1344" name="Mithril Arrow" type="EtcItem"> <item id="1344" name="Mithril Arrow" type="EtcItem">
<!-- Steel Arrow coated by mithril. For A-grade bows. --> <!-- Steel Arrow coated by mithril. For A-grade bows. -->
<set name="icon" val="icon.etc_mithril_quiver_i00" /> <set name="icon" val="icon.etc_mithril_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -809,9 +805,8 @@
<item id="1345" name="Arrow of Light" type="EtcItem"> <item id="1345" name="Arrow of Light" type="EtcItem">
<!-- Very hard arrow made of unknown material. For S-grade bows. --> <!-- Very hard arrow made of unknown material. For S-grade bows. -->
<set name="icon" val="icon.etc_shining_quiver_i00" /> <set name="icon" val="icon.etc_shining_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -3,9 +3,8 @@
<item id="9636" name="Mithril Bolt" type="EtcItem"> <item id="9636" name="Mithril Bolt" type="EtcItem">
<!-- A steel bolt coated by mithril. For A-grade crossbows. --> <!-- A steel bolt coated by mithril. For A-grade crossbows. -->
<set name="icon" val="icon.etc_mithril_bolt_i00" /> <set name="icon" val="icon.etc_mithril_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -3,9 +3,8 @@
<item id="32249" name="Infinite Wooden Quiver" type="EtcItem"> <item id="32249" name="Infinite Wooden Quiver" type="EtcItem">
<!-- Quiver containing arrows made of wood. Used with a No-grade bow. --> <!-- Quiver containing arrows made of wood. Used with a No-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1580" /> <set name="price" val="1580" />
@@ -15,9 +14,8 @@
<item id="32250" name="Infinite Bone Quiver" type="EtcItem"> <item id="32250" name="Infinite Bone Quiver" type="EtcItem">
<!-- Quiver containing arrows made of sharply ground bone. Used with a D-grade bow. --> <!-- Quiver containing arrows made of sharply ground bone. Used with a D-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="7320" /> <set name="price" val="7320" />
@@ -28,9 +26,8 @@
<item id="32251" name="Infinite Steel Quiver" type="EtcItem"> <item id="32251" name="Infinite Steel Quiver" type="EtcItem">
<!-- Quiver containing arrows made of steel. Used with a C-grade bow. --> <!-- Quiver containing arrows made of steel. Used with a C-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="11490" /> <set name="price" val="11490" />
@@ -41,9 +38,8 @@
<item id="32252" name="Infinite Silver Quiver" type="EtcItem"> <item id="32252" name="Infinite Silver Quiver" type="EtcItem">
<!-- Quiver containing steel arrows plated in silver. Used with a B-grade bow. --> <!-- Quiver containing steel arrows plated in silver. Used with a B-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="34630" /> <set name="price" val="34630" />
@@ -54,9 +50,8 @@
<item id="32253" name="Infinite Mithril Quiver" type="EtcItem"> <item id="32253" name="Infinite Mithril Quiver" type="EtcItem">
<!-- Quiver with arrows coated by mithril. Used with an A-grade bow. --> <!-- Quiver with arrows coated by mithril. Used with an A-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="364800" /> <set name="price" val="364800" />
@@ -67,9 +62,8 @@
<item id="32254" name="Infinite Quiver of Light" type="EtcItem"> <item id="32254" name="Infinite Quiver of Light" type="EtcItem">
<!-- This quiver contains arrows made of unknown material. Used with S-grade bows. --> <!-- This quiver contains arrows made of unknown material. Used with S-grade bows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1716000" /> <set name="price" val="1716000" />
@@ -79,9 +73,8 @@
</item> </item>
<item id="32255" name="Infinite Orichalcum Quiver" type="EtcItem"> <item id="32255" name="Infinite Orichalcum Quiver" type="EtcItem">
<!-- Quiver containing arrows made of orichalcum. Used with an R-grade bow. --> <!-- Quiver containing arrows made of orichalcum. Used with an R-grade bow. -->
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ORIHARUKON" /> <set name="material" val="ORIHARUKON" />
<set name="price" val="1716000" /> <set name="price" val="1716000" />
@@ -92,9 +85,8 @@
<item id="32256" name="Infinite Wooden Bolt Container" type="EtcItem"> <item id="32256" name="Infinite Wooden Bolt Container" type="EtcItem">
<!-- Container with bolts made of wood. Used with a No-grade Crossbow. --> <!-- Container with bolts made of wood. Used with a No-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1580" /> <set name="price" val="1580" />
@@ -104,9 +96,8 @@
<item id="32257" name="Infinite Bone Bolt Container" type="EtcItem"> <item id="32257" name="Infinite Bone Bolt Container" type="EtcItem">
<!-- Container with bolts made of sharply ground bone. Used with a D-grade Crossbow. --> <!-- Container with bolts made of sharply ground bone. Used with a D-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="7320" /> <set name="price" val="7320" />
@@ -117,9 +108,8 @@
<item id="32258" name="Infinite Steel Bolt Container" type="EtcItem"> <item id="32258" name="Infinite Steel Bolt Container" type="EtcItem">
<!-- Container with bolts made of steel. Used with a C-grade Crossbow. --> <!-- Container with bolts made of steel. Used with a C-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="11490" /> <set name="price" val="11490" />
@@ -130,9 +120,8 @@
<item id="32259" name="Infinite Silver Bolt Container" type="EtcItem"> <item id="32259" name="Infinite Silver Bolt Container" type="EtcItem">
<!-- Container with steel bolts plated in silver. Used with a B-grade Crossbow. --> <!-- Container with steel bolts plated in silver. Used with a B-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="34630" /> <set name="price" val="34630" />
@@ -143,9 +132,8 @@
<item id="32260" name="Infinite Mithril Bolt Container" type="EtcItem"> <item id="32260" name="Infinite Mithril Bolt Container" type="EtcItem">
<!-- A container of bolts coated by mithril. For A-grade bows. --> <!-- A container of bolts coated by mithril. For A-grade bows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="364800" /> <set name="price" val="364800" />
@@ -47,11 +47,14 @@ import org.l2jmobius.gameserver.model.actor.instance.EventMonsterInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate; import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.Armor; import org.l2jmobius.gameserver.model.items.Armor;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.Weapon; import org.l2jmobius.gameserver.model.items.Weapon;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.skills.AmmunitionSkillList;
import org.l2jmobius.gameserver.util.DocumentItem; import org.l2jmobius.gameserver.util.DocumentItem;
import org.l2jmobius.gameserver.util.GMAudit; import org.l2jmobius.gameserver.util.GMAudit;
@@ -194,6 +197,15 @@ public class ItemTable
if (item instanceof EtcItem) if (item instanceof EtcItem)
{ {
_etcItems.put(item.getId(), (EtcItem) item); _etcItems.put(item.getId(), (EtcItem) item);
if ((item.getItemType() == EtcItemType.ARROW) || (item.getItemType() == EtcItemType.BOLT))
{
final List<ItemSkillHolder> skills = item.getAllSkills();
if (skills != null)
{
AmmunitionSkillList.add(skills);
}
}
} }
else if (item instanceof Armor) else if (item instanceof Armor)
{ {
@@ -1158,11 +1158,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Try to do what is expected by having more attack speed. // Try to do what is expected by having more attack speed.
// final int reuse = (int) (Formulas.calculateReuseTime(this, weaponItem) / (Math.max(1, _stat.getAttackSpeedMultiplier() - 1))); // final int reuse = (int) (Formulas.calculateReuseTime(this, weaponItem) / (Math.max(1, _stat.getAttackSpeedMultiplier() - 1)));
// Consume arrows // Consume ammunition.
final Inventory inventory = getInventory(); final Inventory inventory = getInventory();
if (inventory != null) if (inventory != null)
{ {
inventory.reduceArrowCount(crossbow ? EtcItemType.BOLT : EtcItemType.ARROW); inventory.reduceAmmunitionCount(crossbow ? EtcItemType.BOLT : EtcItemType.ARROW);
} }
// Check if the Creature is a PlayerInstance // Check if the Creature is a PlayerInstance
@@ -225,6 +225,7 @@ import org.l2jmobius.gameserver.model.holders.AutoUseSettingsHolder;
import org.l2jmobius.gameserver.model.holders.DamageTakenHolder; import org.l2jmobius.gameserver.model.holders.DamageTakenHolder;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritDataHolder; import org.l2jmobius.gameserver.model.holders.ElementalSpiritDataHolder;
import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.holders.MovieHolder; import org.l2jmobius.gameserver.model.holders.MovieHolder;
import org.l2jmobius.gameserver.model.holders.PlayerEventHolder; import org.l2jmobius.gameserver.model.holders.PlayerEventHolder;
import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder;
@@ -266,6 +267,7 @@ import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.siege.Fort; import org.l2jmobius.gameserver.model.siege.Fort;
import org.l2jmobius.gameserver.model.siege.Siege; import org.l2jmobius.gameserver.model.siege.Siege;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.AmmunitionSkillList;
import org.l2jmobius.gameserver.model.skills.BuffInfo; import org.l2jmobius.gameserver.model.skills.BuffInfo;
import org.l2jmobius.gameserver.model.skills.CommonSkill; import org.l2jmobius.gameserver.model.skills.CommonSkill;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
@@ -744,6 +746,8 @@ public class PlayerInstance extends Playable
private BroochJewel _activeRubyJewel = null; private BroochJewel _activeRubyJewel = null;
private BroochJewel _activeShappireJewel = null; private BroochJewel _activeShappireJewel = null;
private int _lastAmmunitionId = 0;
/** Event parameters */ /** Event parameters */
private PlayerEventHolder eventStatus = null; private PlayerEventHolder eventStatus = null;
@@ -4461,20 +4465,6 @@ public class PlayerInstance extends Playable
else else
{ {
addItem("Pickup", target, null, true); addItem("Pickup", target, null, true);
// Auto-Equip arrows/bolts if player has a bow/crossbow and player picks up arrows/bolts.
final ItemInstance weapon = _inventory.getPaperdollItem(Inventory.PAPERDOLL_RHAND);
if (weapon != null)
{
final EtcItem etcItem = target.getEtcItem();
if (etcItem != null)
{
final EtcItemType itemType = etcItem.getItemType();
if (((weapon.getItemType() == WeaponType.BOW) && (itemType == EtcItemType.ARROW)) || (((weapon.getItemType() == WeaponType.CROSSBOW) || (weapon.getItemType() == WeaponType.TWOHANDCROSSBOW)) && (itemType == EtcItemType.BOLT)))
{
checkAndEquipAmmunition(itemType);
}
}
}
} }
} }
} }
@@ -5772,33 +5762,85 @@ public class PlayerInstance extends Playable
@Override @Override
protected boolean checkAndEquipAmmunition(EtcItemType type) protected boolean checkAndEquipAmmunition(EtcItemType type)
{ {
ItemInstance arrows = _inventory.getPaperdollItem(Inventory.PAPERDOLL_LHAND); ItemInstance ammunition = null;
if (arrows == null)
{
final Weapon weapon = getActiveWeaponItem(); final Weapon weapon = getActiveWeaponItem();
if (type == EtcItemType.ARROW) if (type == EtcItemType.ARROW)
{ {
arrows = _inventory.findArrowForBow(weapon); ammunition = _inventory.findArrowForBow(weapon);
} }
else if (type == EtcItemType.BOLT) else if (type == EtcItemType.BOLT)
{ {
arrows = _inventory.findBoltForCrossBow(weapon); ammunition = _inventory.findBoltForCrossBow(weapon);
} }
if (arrows != null)
if (ammunition != null)
{ {
// Equip arrows needed in left hand addAmmunitionSkills(ammunition);
_inventory.setPaperdollItem(Inventory.PAPERDOLL_LHAND, arrows);
sendItemList(); sendItemList();
return true; return true;
} }
}
else removeAmmunitionSkills();
{
return true;
}
return false; return false;
} }
private void addAmmunitionSkills(ItemInstance ammunition)
{
final int currentAmmunitionId = ammunition.getId();
if (_lastAmmunitionId == currentAmmunitionId)
{
return;
}
removeAmmunitionSkills();
_lastAmmunitionId = currentAmmunitionId;
final List<ItemSkillHolder> skills = ammunition.getItem().getAllSkills();
if (skills == null)
{
return;
}
boolean sendSkillList = false;
for (ItemSkillHolder holder : skills)
{
if (!isAffectedBySkill(holder))
{
final Skill skill = holder.getSkill();
if (skill.isPassive())
{
addSkill(skill);
sendSkillList = true;
}
}
}
if (sendSkillList)
{
sendSkillList();
}
}
public void removeAmmunitionSkills()
{
if (_lastAmmunitionId == 0)
{
return;
}
_lastAmmunitionId = 0;
boolean sendSkillList = false;
for (Integer skillId : AmmunitionSkillList.values())
{
if (removeSkill(skillId.intValue(), true) != null)
{
sendSkillList = true;
}
}
if (sendSkillList)
{
sendSkillList();
}
}
/** /**
* Disarm the player's weapon. * Disarm the player's weapon.
* @return {@code true} if the player was disarmed or doesn't have a weapon to disarm, {@code false} otherwise. * @return {@code true} if the player was disarmed or doesn't have a weapon to disarm, {@code false} otherwise.
@@ -53,13 +53,12 @@ import org.l2jmobius.gameserver.model.holders.AgathionSkillHolder;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder; import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceType; import org.l2jmobius.gameserver.model.items.appearance.AppearanceType;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.ArmorType;
import org.l2jmobius.gameserver.model.items.type.EtcItemType; import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.items.type.ItemType;
import org.l2jmobius.gameserver.model.items.type.WeaponType; import org.l2jmobius.gameserver.model.items.type.WeaponType;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillConditionScope; import org.l2jmobius.gameserver.model.skills.SkillConditionScope;
@@ -230,61 +229,57 @@ public abstract class Inventory extends ItemContainer
@Override @Override
public void notifyUnequiped(int slot, ItemInstance item, Inventory inventory) public void notifyUnequiped(int slot, ItemInstance item, Inventory inventory)
{ {
if (slot != PAPERDOLL_RHAND) if ((slot != PAPERDOLL_RHAND) || !item.isWeapon())
{ {
return; return;
} }
if (item.getItemType() == WeaponType.BOW) switch (item.getWeaponItem().getItemType())
{ {
final ItemInstance arrow = inventory.getPaperdollItem(PAPERDOLL_LHAND); case BOW:
if (arrow != null) {
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (((leftHandItem != null) && ((leftHandItem.getItemType()) != ArmorType.SIGIL)))
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
} final PlayerInstance owner = inventory.getOwner().getActingPlayer();
else if ((item.getItemType() == WeaponType.CROSSBOW) || (item.getItemType() == WeaponType.TWOHANDCROSSBOW)) if (owner != null)
{ {
final ItemInstance bolts = inventory.getPaperdollItem(PAPERDOLL_LHAND); owner.removeAmmunitionSkills();
if (bolts != null) }
break;
}
case CROSSBOW:
case TWOHANDCROSSBOW:
{
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (((leftHandItem != null) && ((leftHandItem.getItemType()) != ArmorType.SIGIL)))
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
} final PlayerInstance owner = inventory.getOwner().getActingPlayer();
else if (item.getItemType() == WeaponType.FISHINGROD) if (owner != null)
{ {
final ItemInstance lure = inventory.getPaperdollItem(PAPERDOLL_LHAND); owner.removeAmmunitionSkills();
if (lure != null) }
break;
}
case FISHINGROD:
{
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (leftHandItem != null)
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
break;
}
} }
} }
@Override @Override
public void notifyEquiped(int slot, ItemInstance item, Inventory inventory) public void notifyEquiped(int slot, ItemInstance item, Inventory inventory)
{ {
if (slot != PAPERDOLL_RHAND)
{
return;
}
if (item.getItemType() == WeaponType.BOW)
{
final ItemInstance arrow = inventory.findArrowForBow(item.getItem());
if (arrow != null)
{
inventory.setPaperdollItem(PAPERDOLL_LHAND, arrow);
}
}
else if ((item.getItemType() == WeaponType.CROSSBOW) || (item.getItemType() == WeaponType.TWOHANDCROSSBOW))
{
final ItemInstance bolts = inventory.findBoltForCrossBow(item.getItem());
if (bolts != null)
{
inventory.setPaperdollItem(PAPERDOLL_LHAND, bolts);
}
}
} }
} }
@@ -1846,24 +1841,6 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
// Equip only identical grade arrows.
final EtcItem etcItem = item.getEtcItem();
if (etcItem != null)
{
final ItemInstance weapon = getPaperdollItem(Inventory.PAPERDOLL_RHAND);
if (weapon != null)
{
final EtcItemType itemType = etcItem.getItemType();
final ItemType weaponItemType = weapon.getItemType();
if ((((weaponItemType == WeaponType.BOW) && (itemType == EtcItemType.ARROW)) //
|| (((weaponItemType == WeaponType.CROSSBOW) || (weaponItemType == WeaponType.TWOHANDCROSSBOW)) && (itemType == EtcItemType.BOLT))) //
&& (weapon.getItem().getCrystalTypePlus() != item.getItem().getCrystalTypePlus()))
{
return;
}
}
}
final PlayerInstance player = (PlayerInstance) getOwner(); final PlayerInstance player = (PlayerInstance) getOwner();
if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !player.isHero() && item.isHeroItem()) if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !player.isHero() && item.isHeroItem())
{ {
@@ -1884,21 +1861,27 @@ public abstract class Inventory extends ItemContainer
} }
} }
// don't care about arrows, listener will unequip them (hopefully)
// handle full armor // handle full armor
// formal dress // formal dress
if (targetSlot == Item.SLOT_LR_HAND) if (targetSlot == Item.SLOT_LR_HAND)
{ {
setPaperdollItem(PAPERDOLL_LHAND, null); final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND);
if ((rh != null) && (!rh.isArmor() || (rh.getArmorItem().getItemType() != ArmorType.SIGIL)))
{
setPaperdollItem(PAPERDOLL_RHAND, null);
}
setPaperdollItem(PAPERDOLL_RHAND, item); setPaperdollItem(PAPERDOLL_RHAND, item);
} }
else if (targetSlot == Item.SLOT_L_HAND) else if (targetSlot == Item.SLOT_L_HAND)
{ {
final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND); final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND);
if ((rh != null) && (rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !(((rh.getItemType() == WeaponType.BOW) && (item.getItemType() == EtcItemType.ARROW)) || (((rh.getItemType() == WeaponType.CROSSBOW) || (rh.getItemType() == WeaponType.TWOHANDCROSSBOW)) && (item.getItemType() == EtcItemType.BOLT)) || ((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE)))) if ((rh != null) && (rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE)))
{
if (!item.isArmor() || (item.getArmorItem().getItemType() != ArmorType.SIGIL))
{ {
setPaperdollItem(PAPERDOLL_RHAND, null); setPaperdollItem(PAPERDOLL_RHAND, null);
} }
}
setPaperdollItem(PAPERDOLL_LHAND, item); setPaperdollItem(PAPERDOLL_LHAND, item);
} }
else if (targetSlot == Item.SLOT_R_HAND) else if (targetSlot == Item.SLOT_R_HAND)
@@ -2085,6 +2068,18 @@ public abstract class Inventory extends ItemContainer
return _totalWeight; return _totalWeight;
} }
/**
* Reduce the arrow number of the Creature.<br>
* <br>
* <b><u>Overridden in</u>:</b>
* <li>PlayerInstance</li><br>
* @param type
*/
public void reduceAmmunitionCount(EtcItemType type)
{
// Default is to do nothing.
}
/** /**
* Return the ItemInstance of the arrows needed for this bow. * Return the ItemInstance of the arrows needed for this bow.
* @param bow : Item designating the bow * @param bow : Item designating the bow
@@ -2451,18 +2446,6 @@ public abstract class Inventory extends ItemContainer
_blockedItemSlotsMask = itemSlotsMask; _blockedItemSlotsMask = itemSlotsMask;
} }
/**
* Reduce the arrow number of the Creature.<br>
* <br>
* <b><u>Overridden in</u>:</b>
* <li>PlayerInstance</li><br>
* @param type
*/
public void reduceArrowCount(EtcItemType type)
{
// default is to do nothing
}
/** /**
* Gets the items in paperdoll slots filtered by filter. * Gets the items in paperdoll slots filtered by filter.
* @param filters multiple filters * @param filters multiple filters
@@ -42,6 +42,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDe
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDrop; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDrop;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemTransfer; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemTransfer;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.Weapon;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType; import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.variables.ItemVariables; import org.l2jmobius.gameserver.model.variables.ItemVariables;
@@ -962,26 +963,52 @@ public class PlayerInventory extends Inventory
* @param type * @param type
*/ */
@Override @Override
public void reduceArrowCount(EtcItemType type) public void reduceAmmunitionCount(EtcItemType type)
{ {
if ((type != EtcItemType.ARROW) && (type != EtcItemType.BOLT)) if ((type != EtcItemType.ARROW) && (type != EtcItemType.BOLT))
{ {
LOGGER.log(Level.WARNING, type.toString(), " which is not arrow type passed to PlayerInstance.reduceArrowCount()"); LOGGER.log(Level.WARNING, type.toString(), " which is not ammo type.");
return; return;
} }
final ItemInstance arrows = getPaperdollItem(Inventory.PAPERDOLL_LHAND); final Weapon weapon = _owner.getActiveWeaponItem();
if ((arrows == null) || (arrows.getItemType() != type)) if (weapon == null)
{ {
return; return;
} }
if (arrows.getEtcItem().isInfinite()) // Null-safe due to type checks above ItemInstance ammunition = null;
switch (weapon.getItemType())
{
case BOW:
{
ammunition = findArrowForBow(weapon);
break;
}
case CROSSBOW:
case TWOHANDCROSSBOW:
{
ammunition = findBoltForCrossBow(weapon);
break;
}
default:
{
return;
}
}
if ((ammunition == null) || (ammunition.getItemType() != type))
{ {
return; return;
} }
updateItemCountNoDbUpdate(null, arrows, -1, _owner, null); if (ammunition.getEtcItem().isInfinite())
{
return;
}
// Reduce item count.
updateItemCountNoDbUpdate(null, ammunition, -1, _owner, null);
} }
/** /**
@@ -0,0 +1,44 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.skills;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
/**
* @author Mobius
*/
public class AmmunitionSkillList
{
private static final Set<Integer> SKILLS = ConcurrentHashMap.newKeySet();
public static void add(List<ItemSkillHolder> skills)
{
for (ItemSkillHolder skill : skills)
{
SKILLS.add(skill.getSkillId());
}
}
public static Set<Integer> values()
{
return SKILLS;
}
}
@@ -52,8 +52,10 @@ import org.l2jmobius.gameserver.model.clan.Clan;
import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder; import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder;
import org.l2jmobius.gameserver.model.holders.ClientHardwareInfoHolder; import org.l2jmobius.gameserver.model.holders.ClientHardwareInfoHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.quest.Quest; import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.residences.ClanHall; import org.l2jmobius.gameserver.model.residences.ClanHall;
import org.l2jmobius.gameserver.model.siege.Fort; import org.l2jmobius.gameserver.model.siege.Fort;
@@ -678,6 +680,13 @@ public class EnterWorld implements IClientIncomingPacket
player.getInventory().equipItemAndRecord(agathion); player.getInventory().equipItemAndRecord(agathion);
} }
// Old ammunition check.
final ItemInstance leftHandItem = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
if ((leftHandItem != null) && ((leftHandItem.getItemType() == EtcItemType.ARROW) || (leftHandItem.getItemType() == EtcItemType.BOLT)))
{
player.getInventory().unEquipItemInBodySlot(Inventory.PAPERDOLL_LHAND);
}
if (Config.ENABLE_ATTENDANCE_REWARDS) if (Config.ENABLE_ATTENDANCE_REWARDS)
{ {
ThreadPool.schedule(() -> ThreadPool.schedule(() ->
@@ -403,9 +403,8 @@
<item id="17" name="Wooden Arrow" type="EtcItem"> <item id="17" name="Wooden Arrow" type="EtcItem">
<!-- Arrow made of wood. It is an arrow used for a No-grade bow. --> <!-- Arrow made of wood. It is an arrow used for a No-grade bow. -->
<set name="icon" val="icon.etc_wooden_quiver_i00" /> <set name="icon" val="icon.etc_wooden_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="WOOD" /> <set name="material" val="WOOD" />
<set name="weight" val="6" /> <set name="weight" val="6" />
@@ -749,9 +749,8 @@
<item id="1341" name="Bone Arrow" type="EtcItem"> <item id="1341" name="Bone Arrow" type="EtcItem">
<!-- Arrow made from a piece of sharpened bone. It is used as an arrow for a D-grade bow. --> <!-- Arrow made from a piece of sharpened bone. It is used as an arrow for a D-grade bow. -->
<set name="icon" val="icon.etc_bone_quiver_i00" /> <set name="icon" val="icon.etc_bone_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="BONE" /> <set name="material" val="BONE" />
<set name="weight" val="5" /> <set name="weight" val="5" />
@@ -764,9 +763,8 @@
<item id="1342" name="Steel Arrow" type="EtcItem"> <item id="1342" name="Steel Arrow" type="EtcItem">
<!-- Powerful arrow made of steel. It is used as an arrow for a C-grade bow. --> <!-- Powerful arrow made of steel. It is used as an arrow for a C-grade bow. -->
<set name="icon" val="icon.etc_fine_steel_quiver_i00" /> <set name="icon" val="icon.etc_fine_steel_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -779,9 +777,8 @@
<item id="1343" name="Silver Arrow" type="EtcItem"> <item id="1343" name="Silver Arrow" type="EtcItem">
<!-- Steel arrow with silver coating. For B-grade bows. --> <!-- Steel arrow with silver coating. For B-grade bows. -->
<set name="icon" val="icon.etc_silver_quiver_i00" /> <set name="icon" val="icon.etc_silver_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="SILVER" /> <set name="material" val="SILVER" />
<set name="weight" val="4" /> <set name="weight" val="4" />
@@ -794,9 +791,8 @@
<item id="1344" name="Mithril Arrow" type="EtcItem"> <item id="1344" name="Mithril Arrow" type="EtcItem">
<!-- Steel Arrow coated by mithril. For A-grade bows. --> <!-- Steel Arrow coated by mithril. For A-grade bows. -->
<set name="icon" val="icon.etc_mithril_quiver_i00" /> <set name="icon" val="icon.etc_mithril_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -809,9 +805,8 @@
<item id="1345" name="Arrow of Light" type="EtcItem"> <item id="1345" name="Arrow of Light" type="EtcItem">
<!-- Very hard arrow made of unknown material. For S-grade bows. --> <!-- Very hard arrow made of unknown material. For S-grade bows. -->
<set name="icon" val="icon.etc_shining_quiver_i00" /> <set name="icon" val="icon.etc_shining_quiver_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -3,9 +3,8 @@
<item id="9636" name="Mithril Bolt" type="EtcItem"> <item id="9636" name="Mithril Bolt" type="EtcItem">
<!-- A steel bolt coated by mithril. For A-grade crossbows. --> <!-- A steel bolt coated by mithril. For A-grade crossbows. -->
<set name="icon" val="icon.etc_mithril_bolt_i00" /> <set name="icon" val="icon.etc_mithril_bolt_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
<set name="weight" val="3" /> <set name="weight" val="3" />
@@ -3,9 +3,8 @@
<item id="32249" name="Infinite Wooden Quiver" type="EtcItem"> <item id="32249" name="Infinite Wooden Quiver" type="EtcItem">
<!-- Quiver containing arrows made of wood. Used with a No-grade bow. --> <!-- Quiver containing arrows made of wood. Used with a No-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1580" /> <set name="price" val="1580" />
@@ -15,9 +14,8 @@
<item id="32250" name="Infinite Bone Quiver" type="EtcItem"> <item id="32250" name="Infinite Bone Quiver" type="EtcItem">
<!-- Quiver containing arrows made of sharply ground bone. Used with a D-grade bow. --> <!-- Quiver containing arrows made of sharply ground bone. Used with a D-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="7320" /> <set name="price" val="7320" />
@@ -28,9 +26,8 @@
<item id="32251" name="Infinite Steel Quiver" type="EtcItem"> <item id="32251" name="Infinite Steel Quiver" type="EtcItem">
<!-- Quiver containing arrows made of steel. Used with a C-grade bow. --> <!-- Quiver containing arrows made of steel. Used with a C-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="11490" /> <set name="price" val="11490" />
@@ -41,9 +38,8 @@
<item id="32252" name="Infinite Silver Quiver" type="EtcItem"> <item id="32252" name="Infinite Silver Quiver" type="EtcItem">
<!-- Quiver containing steel arrows plated in silver. Used with a B-grade bow. --> <!-- Quiver containing steel arrows plated in silver. Used with a B-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="34630" /> <set name="price" val="34630" />
@@ -54,9 +50,8 @@
<item id="32253" name="Infinite Mithril Quiver" type="EtcItem"> <item id="32253" name="Infinite Mithril Quiver" type="EtcItem">
<!-- Quiver with arrows coated by mithril. Used with an A-grade bow. --> <!-- Quiver with arrows coated by mithril. Used with an A-grade bow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="364800" /> <set name="price" val="364800" />
@@ -67,9 +62,8 @@
<item id="32254" name="Infinite Quiver of Light" type="EtcItem"> <item id="32254" name="Infinite Quiver of Light" type="EtcItem">
<!-- This quiver contains arrows made of unknown material. Used with S-grade bows. --> <!-- This quiver contains arrows made of unknown material. Used with S-grade bows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_arrows_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_shining_arrows_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1716000" /> <set name="price" val="1716000" />
@@ -79,9 +73,8 @@
</item> </item>
<item id="32255" name="Infinite Orichalcum Quiver" type="EtcItem"> <item id="32255" name="Infinite Orichalcum Quiver" type="EtcItem">
<!-- Quiver containing arrows made of orichalcum. Used with an R-grade bow. --> <!-- Quiver containing arrows made of orichalcum. Used with an R-grade bow. -->
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ARROW" /> <set name="etcitem_type" val="ARROW" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ORIHARUKON" /> <set name="material" val="ORIHARUKON" />
<set name="price" val="1716000" /> <set name="price" val="1716000" />
@@ -92,9 +85,8 @@
<item id="32256" name="Infinite Wooden Bolt Container" type="EtcItem"> <item id="32256" name="Infinite Wooden Bolt Container" type="EtcItem">
<!-- Container with bolts made of wood. Used with a No-grade Crossbow. --> <!-- Container with bolts made of wood. Used with a No-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="1580" /> <set name="price" val="1580" />
@@ -104,9 +96,8 @@
<item id="32257" name="Infinite Bone Bolt Container" type="EtcItem"> <item id="32257" name="Infinite Bone Bolt Container" type="EtcItem">
<!-- Container with bolts made of sharply ground bone. Used with a D-grade Crossbow. --> <!-- Container with bolts made of sharply ground bone. Used with a D-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_bone_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="7320" /> <set name="price" val="7320" />
@@ -117,9 +108,8 @@
<item id="32258" name="Infinite Steel Bolt Container" type="EtcItem"> <item id="32258" name="Infinite Steel Bolt Container" type="EtcItem">
<!-- Container with bolts made of steel. Used with a C-grade Crossbow. --> <!-- Container with bolts made of steel. Used with a C-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_fine_steel_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="11490" /> <set name="price" val="11490" />
@@ -130,9 +120,8 @@
<item id="32259" name="Infinite Silver Bolt Container" type="EtcItem"> <item id="32259" name="Infinite Silver Bolt Container" type="EtcItem">
<!-- Container with steel bolts plated in silver. Used with a B-grade Crossbow. --> <!-- Container with steel bolts plated in silver. Used with a B-grade Crossbow. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_silver_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="34630" /> <set name="price" val="34630" />
@@ -143,9 +132,8 @@
<item id="32260" name="Infinite Mithril Bolt Container" type="EtcItem"> <item id="32260" name="Infinite Mithril Bolt Container" type="EtcItem">
<!-- A container of bolts coated by mithril. For A-grade bows. --> <!-- A container of bolts coated by mithril. For A-grade bows. -->
<set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" /> <set name="icon" val="br_cashtex.item.br_cash_quiver_of_mithril_bolts_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="BOLT" /> <set name="etcitem_type" val="BOLT" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="364800" /> <set name="price" val="364800" />
@@ -874,7 +874,7 @@
<set name="icon" val="icon.weapon_sobekk_hurricane_i00" /> <set name="icon" val="icon.weapon_sobekk_hurricane_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
<set name="weight" val="1330" /> <set name="weight" val="1330" />
@@ -1075,7 +1075,7 @@
<set name="icon" val="icon.shooter_none" /> <set name="icon" val="icon.shooter_none" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="STEEL" /> <set name="material" val="STEEL" />
<set name="weight" val="1870" /> <set name="weight" val="1870" />
@@ -1094,7 +1094,7 @@
<set name="icon" val="icon.shooter_d" /> <set name="icon" val="icon.shooter_d" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="D" /> <set name="crystal_type" val="D" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -1115,7 +1115,7 @@
<set name="icon" val="icon.shooter_b_low" /> <set name="icon" val="icon.shooter_b_low" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="C" /> <set name="crystal_type" val="C" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -1136,7 +1136,7 @@
<set name="icon" val="icon.weapon_scallop_jamadhr_i00" /> <set name="icon" val="icon.weapon_scallop_jamadhr_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="B" /> <set name="crystal_type" val="B" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -1157,7 +1157,7 @@
<set name="icon" val="icon.shooter_b_high" /> <set name="icon" val="icon.shooter_b_high" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="B" /> <set name="crystal_type" val="B" />
<set name="material" val="CHRYSOLITE" /> <set name="material" val="CHRYSOLITE" />
@@ -1178,7 +1178,7 @@
<set name="icon" val="icon.shooter_a_low" /> <set name="icon" val="icon.shooter_a_low" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="BLOOD_STEEL" /> <set name="material" val="BLOOD_STEEL" />
@@ -1199,7 +1199,7 @@
<set name="icon" val="icon.shooter_a_high" /> <set name="icon" val="icon.shooter_a_high" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
@@ -1220,7 +1220,7 @@
<set name="icon" val="icon.shooter_boss" /> <set name="icon" val="icon.shooter_boss" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
@@ -1241,7 +1241,7 @@
<set name="icon" val="icon.shooter_boss_anakim" /> <set name="icon" val="icon.shooter_boss_anakim" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
@@ -1261,7 +1261,7 @@
<set name="icon" val="icon.weapon_chakram_i00" /> <set name="icon" val="icon.weapon_chakram_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="B" /> <set name="crystal_type" val="B" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -1282,7 +1282,7 @@
<set name="icon" val="icon.weapon_bellion_cestus_i00" /> <set name="icon" val="icon.weapon_bellion_cestus_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
@@ -1302,9 +1302,8 @@
<item id="94891" name="No-grade Elemental Orb" additionalName="Sealed" type="EtcItem"> <item id="94891" name="No-grade Elemental Orb" additionalName="Sealed" type="EtcItem">
<!-- An orb infused with the elemental spirit power. <Required for using No-grade firearms.> --> <!-- An orb infused with the elemental spirit power. <Required for using No-grade firearms.> -->
<set name="icon" val="icon.orb_none" /> <set name="icon" val="icon.orb_none" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ELEMENTAL_ORB" /> <set name="etcitem_type" val="ELEMENTAL_ORB" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
<set name="price" val="100000" /> <set name="price" val="100000" />
@@ -1316,9 +1315,8 @@
<item id="94892" name="D-grade Elemental Orb" additionalName="Sealed" type="EtcItem"> <item id="94892" name="D-grade Elemental Orb" additionalName="Sealed" type="EtcItem">
<!-- An orb infused with the elemental spirit power. <Required for using D-grade firearms.> --> <!-- An orb infused with the elemental spirit power. <Required for using D-grade firearms.> -->
<set name="icon" val="icon.orb_d" /> <set name="icon" val="icon.orb_d" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ELEMENTAL_ORB" /> <set name="etcitem_type" val="ELEMENTAL_ORB" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="D" /> <set name="crystal_type" val="D" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
@@ -1331,9 +1329,8 @@
<item id="94893" name="C-grade Elemental Orb" additionalName="Sealed" type="EtcItem"> <item id="94893" name="C-grade Elemental Orb" additionalName="Sealed" type="EtcItem">
<!-- An orb infused with the elemental spirit power. <Required for using C-grade firearms.> --> <!-- An orb infused with the elemental spirit power. <Required for using C-grade firearms.> -->
<set name="icon" val="icon.orb_c" /> <set name="icon" val="icon.orb_c" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ELEMENTAL_ORB" /> <set name="etcitem_type" val="ELEMENTAL_ORB" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="C" /> <set name="crystal_type" val="C" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
@@ -1346,9 +1343,8 @@
<item id="94894" name="B-grade Elemental Orb" additionalName="Sealed" type="EtcItem"> <item id="94894" name="B-grade Elemental Orb" additionalName="Sealed" type="EtcItem">
<!-- An orb infused with the elemental spirit power. <Required for using B-grade firearms.> --> <!-- An orb infused with the elemental spirit power. <Required for using B-grade firearms.> -->
<set name="icon" val="icon.orb_b" /> <set name="icon" val="icon.orb_b" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ELEMENTAL_ORB" /> <set name="etcitem_type" val="ELEMENTAL_ORB" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="B" /> <set name="crystal_type" val="B" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
@@ -1361,9 +1357,8 @@
<item id="94895" name="A-grade Elemental Orb" additionalName="Sealed" type="EtcItem"> <item id="94895" name="A-grade Elemental Orb" additionalName="Sealed" type="EtcItem">
<!-- An orb infused with the elemental spirit power. <Required for using A-grade firearms.> --> <!-- An orb infused with the elemental spirit power. <Required for using A-grade firearms.> -->
<set name="icon" val="icon.orb_a" /> <set name="icon" val="icon.orb_a" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="NONE" />
<set name="etcitem_type" val="ELEMENTAL_ORB" /> <set name="etcitem_type" val="ELEMENTAL_ORB" />
<set name="bodypart" val="lhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="GOLD" /> <set name="material" val="GOLD" />
@@ -1392,7 +1387,7 @@
<set name="icon" val="icon.shooter_d" /> <set name="icon" val="icon.shooter_d" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="D" /> <set name="crystal_type" val="D" />
<set name="enchant_enabled" val="true" /> <set name="enchant_enabled" val="true" />
@@ -182,7 +182,7 @@
<set name="icon" val="icon.shooter_none" /> <set name="icon" val="icon.shooter_none" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="STEEL" /> <set name="material" val="STEEL" />
<set name="weight" val="1560" /> <set name="weight" val="1560" />
@@ -234,7 +234,7 @@
<set name="icon" val="icon.shooter_none" /> <set name="icon" val="icon.shooter_none" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="material" val="STEEL" /> <set name="material" val="STEEL" />
<set name="weight" val="1870" /> <set name="weight" val="1870" />
@@ -256,7 +256,7 @@
<set name="icon" val="icon.shooter_d" /> <set name="icon" val="icon.shooter_d" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="D" /> <set name="crystal_type" val="D" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -279,7 +279,7 @@
<set name="icon" val="icon.shooter_b_low" /> <set name="icon" val="icon.shooter_b_low" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="C" /> <set name="crystal_type" val="C" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -302,7 +302,7 @@
<set name="icon" val="icon.weapon_scallop_jamadhr_i00" /> <set name="icon" val="icon.weapon_scallop_jamadhr_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="B" /> <set name="crystal_type" val="B" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -326,7 +326,7 @@
<set name="icon" val="icon.shooter_b_high" /> <set name="icon" val="icon.shooter_b_high" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="B" /> <set name="crystal_type" val="B" />
<set name="material" val="CHRYSOLITE" /> <set name="material" val="CHRYSOLITE" />
@@ -350,7 +350,7 @@
<set name="icon" val="icon.shooter_a_low" /> <set name="icon" val="icon.shooter_a_low" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="BLOOD_STEEL" /> <set name="material" val="BLOOD_STEEL" />
@@ -374,7 +374,7 @@
<set name="icon" val="icon.shooter_a_high" /> <set name="icon" val="icon.shooter_a_high" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
@@ -398,7 +398,7 @@
<set name="icon" val="icon.shooter_boss" /> <set name="icon" val="icon.shooter_boss" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
@@ -422,7 +422,7 @@
<set name="icon" val="icon.shooter_boss_anakim" /> <set name="icon" val="icon.shooter_boss_anakim" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="ADAMANTAITE" /> <set name="material" val="ADAMANTAITE" />
@@ -446,7 +446,7 @@
<set name="icon" val="icon.weapon_chakram_i00" /> <set name="icon" val="icon.weapon_chakram_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="B" /> <set name="crystal_type" val="B" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -468,7 +468,7 @@
<set name="icon" val="icon.weapon_bellion_cestus_i00" /> <set name="icon" val="icon.weapon_bellion_cestus_i00" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="A" /> <set name="crystal_type" val="A" />
<set name="material" val="MITHRIL" /> <set name="material" val="MITHRIL" />
@@ -761,7 +761,7 @@
<set name="icon" val="icon.shooter_monster_low" /> <set name="icon" val="icon.shooter_monster_low" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="B" /> <set name="crystal_type" val="B" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -1097,7 +1097,7 @@
<set name="icon" val="icon.shooter_monster_low" /> <set name="icon" val="icon.shooter_monster_low" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="B" /> <set name="crystal_type" val="B" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -1212,7 +1212,7 @@
<set name="icon" val="icon.beam_shooter" /> <set name="icon" val="icon.beam_shooter" />
<set name="default_action" val="EQUIP" /> <set name="default_action" val="EQUIP" />
<set name="weapon_type" val="PISTOLS" /> <set name="weapon_type" val="PISTOLS" />
<set name="bodypart" val="rhand" /> <set name="bodypart" val="lrhand" />
<set name="immediate_effect" val="true" /> <set name="immediate_effect" val="true" />
<set name="crystal_type" val="D" /> <set name="crystal_type" val="D" />
<set name="material" val="FINE_STEEL" /> <set name="material" val="FINE_STEEL" />
@@ -47,11 +47,14 @@ import org.l2jmobius.gameserver.model.actor.instance.EventMonsterInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate; import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.Armor; import org.l2jmobius.gameserver.model.items.Armor;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.Weapon; import org.l2jmobius.gameserver.model.items.Weapon;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.skills.AmmunitionSkillList;
import org.l2jmobius.gameserver.util.DocumentItem; import org.l2jmobius.gameserver.util.DocumentItem;
import org.l2jmobius.gameserver.util.GMAudit; import org.l2jmobius.gameserver.util.GMAudit;
@@ -194,6 +197,15 @@ public class ItemTable
if (item instanceof EtcItem) if (item instanceof EtcItem)
{ {
_etcItems.put(item.getId(), (EtcItem) item); _etcItems.put(item.getId(), (EtcItem) item);
if ((item.getItemType() == EtcItemType.ARROW) || (item.getItemType() == EtcItemType.BOLT) || (item.getItemType() == EtcItemType.ELEMENTAL_ORB))
{
final List<ItemSkillHolder> skills = item.getAllSkills();
if (skills != null)
{
AmmunitionSkillList.add(skills);
}
}
} }
else if (item instanceof Armor) else if (item instanceof Armor)
{ {
@@ -1165,11 +1165,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Try to do what is expected by having more attack speed. // Try to do what is expected by having more attack speed.
// final int reuse = (int) (Formulas.calculateReuseTime(this, weaponItem) / (Math.max(1, _stat.getAttackSpeedMultiplier() - 1))); // final int reuse = (int) (Formulas.calculateReuseTime(this, weaponItem) / (Math.max(1, _stat.getAttackSpeedMultiplier() - 1)));
// Consume arrows // Consume ammunition.
final Inventory inventory = getInventory(); final Inventory inventory = getInventory();
if (inventory != null) if (inventory != null)
{ {
inventory.reduceArrowCount(crossbow ? EtcItemType.BOLT : EtcItemType.ARROW); inventory.reduceAmmunitionCount(crossbow ? EtcItemType.BOLT : EtcItemType.ARROW);
} }
// Check if the Creature is a PlayerInstance // Check if the Creature is a PlayerInstance
@@ -225,6 +225,7 @@ import org.l2jmobius.gameserver.model.holders.AutoUseSettingsHolder;
import org.l2jmobius.gameserver.model.holders.DamageTakenHolder; import org.l2jmobius.gameserver.model.holders.DamageTakenHolder;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritDataHolder; import org.l2jmobius.gameserver.model.holders.ElementalSpiritDataHolder;
import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.holders.MovieHolder; import org.l2jmobius.gameserver.model.holders.MovieHolder;
import org.l2jmobius.gameserver.model.holders.PlayerEventHolder; import org.l2jmobius.gameserver.model.holders.PlayerEventHolder;
import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder; import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder;
@@ -266,6 +267,7 @@ import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.siege.Fort; import org.l2jmobius.gameserver.model.siege.Fort;
import org.l2jmobius.gameserver.model.siege.Siege; import org.l2jmobius.gameserver.model.siege.Siege;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.AmmunitionSkillList;
import org.l2jmobius.gameserver.model.skills.BuffInfo; import org.l2jmobius.gameserver.model.skills.BuffInfo;
import org.l2jmobius.gameserver.model.skills.CommonSkill; import org.l2jmobius.gameserver.model.skills.CommonSkill;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
@@ -744,6 +746,8 @@ public class PlayerInstance extends Playable
private BroochJewel _activeRubyJewel = null; private BroochJewel _activeRubyJewel = null;
private BroochJewel _activeShappireJewel = null; private BroochJewel _activeShappireJewel = null;
private int _lastAmmunitionId = 0;
/** Event parameters */ /** Event parameters */
private PlayerEventHolder eventStatus = null; private PlayerEventHolder eventStatus = null;
@@ -4461,20 +4465,6 @@ public class PlayerInstance extends Playable
else else
{ {
addItem("Pickup", target, null, true); addItem("Pickup", target, null, true);
// Auto-Equip arrows/bolts if player has a bow/crossbow and player picks up arrows/bolts.
final ItemInstance weapon = _inventory.getPaperdollItem(Inventory.PAPERDOLL_RHAND);
if (weapon != null)
{
final EtcItem etcItem = target.getEtcItem();
if (etcItem != null)
{
final EtcItemType itemType = etcItem.getItemType();
if (((weapon.getItemType() == WeaponType.BOW) && (itemType == EtcItemType.ARROW)) || (((weapon.getItemType() == WeaponType.CROSSBOW) || (weapon.getItemType() == WeaponType.TWOHANDCROSSBOW)) && (itemType == EtcItemType.BOLT)))
{
checkAndEquipAmmunition(itemType);
}
}
}
} }
} }
} }
@@ -5772,37 +5762,89 @@ public class PlayerInstance extends Playable
@Override @Override
protected boolean checkAndEquipAmmunition(EtcItemType type) protected boolean checkAndEquipAmmunition(EtcItemType type)
{ {
ItemInstance arrows = _inventory.getPaperdollItem(Inventory.PAPERDOLL_LHAND); ItemInstance ammunition = null;
if (arrows == null)
{
final Weapon weapon = getActiveWeaponItem(); final Weapon weapon = getActiveWeaponItem();
if (type == EtcItemType.ARROW) if (type == EtcItemType.ARROW)
{ {
arrows = _inventory.findArrowForBow(weapon); ammunition = _inventory.findArrowForBow(weapon);
} }
else if (type == EtcItemType.BOLT) else if (type == EtcItemType.BOLT)
{ {
arrows = _inventory.findBoltForCrossBow(weapon); ammunition = _inventory.findBoltForCrossBow(weapon);
} }
else if (type == EtcItemType.ELEMENTAL_ORB) else if (type == EtcItemType.ELEMENTAL_ORB)
{ {
arrows = _inventory.findElementalOrbForPistols(weapon); ammunition = _inventory.findElementalOrbForPistols(weapon);
} }
if (arrows != null)
if (ammunition != null)
{ {
// Equip arrows needed in left hand addAmmunitionSkills(ammunition);
_inventory.setPaperdollItem(Inventory.PAPERDOLL_LHAND, arrows);
sendItemList(); sendItemList();
return true; return true;
} }
}
else removeAmmunitionSkills();
{
return true;
}
return false; return false;
} }
private void addAmmunitionSkills(ItemInstance ammunition)
{
final int currentAmmunitionId = ammunition.getId();
if (_lastAmmunitionId == currentAmmunitionId)
{
return;
}
removeAmmunitionSkills();
_lastAmmunitionId = currentAmmunitionId;
final List<ItemSkillHolder> skills = ammunition.getItem().getAllSkills();
if (skills == null)
{
return;
}
boolean sendSkillList = false;
for (ItemSkillHolder holder : skills)
{
if (!isAffectedBySkill(holder))
{
final Skill skill = holder.getSkill();
if (skill.isPassive())
{
addSkill(skill);
sendSkillList = true;
}
}
}
if (sendSkillList)
{
sendSkillList();
}
}
public void removeAmmunitionSkills()
{
if (_lastAmmunitionId == 0)
{
return;
}
_lastAmmunitionId = 0;
boolean sendSkillList = false;
for (Integer skillId : AmmunitionSkillList.values())
{
if (removeSkill(skillId.intValue(), true) != null)
{
sendSkillList = true;
}
}
if (sendSkillList)
{
sendSkillList();
}
}
/** /**
* Disarm the player's weapon. * Disarm the player's weapon.
* @return {@code true} if the player was disarmed or doesn't have a weapon to disarm, {@code false} otherwise. * @return {@code true} if the player was disarmed or doesn't have a weapon to disarm, {@code false} otherwise.
@@ -53,13 +53,12 @@ import org.l2jmobius.gameserver.model.holders.AgathionSkillHolder;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder; import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceType; import org.l2jmobius.gameserver.model.items.appearance.AppearanceType;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.ArmorType;
import org.l2jmobius.gameserver.model.items.type.EtcItemType; import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.items.type.ItemType;
import org.l2jmobius.gameserver.model.items.type.WeaponType; import org.l2jmobius.gameserver.model.items.type.WeaponType;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillConditionScope; import org.l2jmobius.gameserver.model.skills.SkillConditionScope;
@@ -230,61 +229,66 @@ public abstract class Inventory extends ItemContainer
@Override @Override
public void notifyUnequiped(int slot, ItemInstance item, Inventory inventory) public void notifyUnequiped(int slot, ItemInstance item, Inventory inventory)
{ {
if (slot != PAPERDOLL_RHAND) if ((slot != PAPERDOLL_RHAND) || !item.isWeapon())
{ {
return; return;
} }
if (item.getItemType() == WeaponType.BOW) switch (item.getWeaponItem().getItemType())
{ {
final ItemInstance arrow = inventory.getPaperdollItem(PAPERDOLL_LHAND); case BOW:
if (arrow != null) {
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (((leftHandItem != null) && ((leftHandItem.getItemType()) != ArmorType.SIGIL)))
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
} final PlayerInstance owner = inventory.getOwner().getActingPlayer();
else if ((item.getItemType() == WeaponType.CROSSBOW) || (item.getItemType() == WeaponType.TWOHANDCROSSBOW)) if (owner != null)
{ {
final ItemInstance bolts = inventory.getPaperdollItem(PAPERDOLL_LHAND); owner.removeAmmunitionSkills();
if (bolts != null) }
break;
}
case CROSSBOW:
case TWOHANDCROSSBOW:
{
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (((leftHandItem != null) && ((leftHandItem.getItemType()) != ArmorType.SIGIL)))
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
} final PlayerInstance owner = inventory.getOwner().getActingPlayer();
else if (item.getItemType() == WeaponType.FISHINGROD) if (owner != null)
{ {
final ItemInstance lure = inventory.getPaperdollItem(PAPERDOLL_LHAND); owner.removeAmmunitionSkills();
if (lure != null) }
break;
}
case PISTOLS:
{
final PlayerInstance owner = inventory.getOwner().getActingPlayer();
if (owner != null)
{
owner.removeAmmunitionSkills();
}
break;
}
case FISHINGROD:
{
final ItemInstance leftHandItem = inventory.getPaperdollItem(PAPERDOLL_LHAND);
if (leftHandItem != null)
{ {
inventory.setPaperdollItem(PAPERDOLL_LHAND, null); inventory.setPaperdollItem(PAPERDOLL_LHAND, null);
} }
break;
}
} }
} }
@Override @Override
public void notifyEquiped(int slot, ItemInstance item, Inventory inventory) public void notifyEquiped(int slot, ItemInstance item, Inventory inventory)
{ {
if (slot != PAPERDOLL_RHAND)
{
return;
}
if (item.getItemType() == WeaponType.BOW)
{
final ItemInstance arrow = inventory.findArrowForBow(item.getItem());
if (arrow != null)
{
inventory.setPaperdollItem(PAPERDOLL_LHAND, arrow);
}
}
else if ((item.getItemType() == WeaponType.CROSSBOW) || (item.getItemType() == WeaponType.TWOHANDCROSSBOW))
{
final ItemInstance bolts = inventory.findBoltForCrossBow(item.getItem());
if (bolts != null)
{
inventory.setPaperdollItem(PAPERDOLL_LHAND, bolts);
}
}
} }
} }
@@ -1846,24 +1850,6 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
// Equip only identical grade arrows.
final EtcItem etcItem = item.getEtcItem();
if (etcItem != null)
{
final ItemInstance weapon = getPaperdollItem(Inventory.PAPERDOLL_RHAND);
if (weapon != null)
{
final EtcItemType itemType = etcItem.getItemType();
final ItemType weaponItemType = weapon.getItemType();
if ((((weaponItemType == WeaponType.BOW) && (itemType == EtcItemType.ARROW)) //
|| (((weaponItemType == WeaponType.CROSSBOW) || (weaponItemType == WeaponType.TWOHANDCROSSBOW)) && (itemType == EtcItemType.BOLT))) //
&& (weapon.getItem().getCrystalTypePlus() != item.getItem().getCrystalTypePlus()))
{
return;
}
}
}
final PlayerInstance player = (PlayerInstance) getOwner(); final PlayerInstance player = (PlayerInstance) getOwner();
if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !player.isHero() && item.isHeroItem()) if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !player.isHero() && item.isHeroItem())
{ {
@@ -1884,21 +1870,27 @@ public abstract class Inventory extends ItemContainer
} }
} }
// don't care about arrows, listener will unequip them (hopefully)
// handle full armor // handle full armor
// formal dress // formal dress
if (targetSlot == Item.SLOT_LR_HAND) if (targetSlot == Item.SLOT_LR_HAND)
{ {
setPaperdollItem(PAPERDOLL_LHAND, null); final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND);
if ((rh != null) && (!rh.isArmor() || (rh.getArmorItem().getItemType() != ArmorType.SIGIL)))
{
setPaperdollItem(PAPERDOLL_RHAND, null);
}
setPaperdollItem(PAPERDOLL_RHAND, item); setPaperdollItem(PAPERDOLL_RHAND, item);
} }
else if (targetSlot == Item.SLOT_L_HAND) else if (targetSlot == Item.SLOT_L_HAND)
{ {
final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND); final ItemInstance rh = getPaperdollItem(PAPERDOLL_RHAND);
if ((rh != null) && (rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !(((rh.getItemType() == WeaponType.BOW) && (item.getItemType() == EtcItemType.ARROW)) || (((rh.getItemType() == WeaponType.CROSSBOW) || (rh.getItemType() == WeaponType.TWOHANDCROSSBOW)) && (item.getItemType() == EtcItemType.BOLT)) || ((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE)))) if ((rh != null) && (rh.getItem().getBodyPart() == Item.SLOT_LR_HAND) && !((rh.getItemType() == WeaponType.FISHINGROD) && (item.getItemType() == EtcItemType.LURE)))
{
if (!item.isArmor() || (item.getArmorItem().getItemType() != ArmorType.SIGIL))
{ {
setPaperdollItem(PAPERDOLL_RHAND, null); setPaperdollItem(PAPERDOLL_RHAND, null);
} }
}
setPaperdollItem(PAPERDOLL_LHAND, item); setPaperdollItem(PAPERDOLL_LHAND, item);
} }
else if (targetSlot == Item.SLOT_R_HAND) else if (targetSlot == Item.SLOT_R_HAND)
@@ -2085,6 +2077,18 @@ public abstract class Inventory extends ItemContainer
return _totalWeight; return _totalWeight;
} }
/**
* Reduce the arrow number of the Creature.<br>
* <br>
* <b><u>Overridden in</u>:</b>
* <li>PlayerInstance</li><br>
* @param type
*/
public void reduceAmmunitionCount(EtcItemType type)
{
// Default is to do nothing.
}
/** /**
* Return the ItemInstance of the arrows needed for this bow. * Return the ItemInstance of the arrows needed for this bow.
* @param bow : Item designating the bow * @param bow : Item designating the bow
@@ -2472,18 +2476,6 @@ public abstract class Inventory extends ItemContainer
_blockedItemSlotsMask = itemSlotsMask; _blockedItemSlotsMask = itemSlotsMask;
} }
/**
* Reduce the arrow number of the Creature.<br>
* <br>
* <b><u>Overridden in</u>:</b>
* <li>PlayerInstance</li><br>
* @param type
*/
public void reduceArrowCount(EtcItemType type)
{
// default is to do nothing
}
/** /**
* Gets the items in paperdoll slots filtered by filter. * Gets the items in paperdoll slots filtered by filter.
* @param filters multiple filters * @param filters multiple filters
@@ -42,6 +42,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDe
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDrop; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemDrop;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemTransfer; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemTransfer;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.Weapon;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType; import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.variables.ItemVariables; import org.l2jmobius.gameserver.model.variables.ItemVariables;
@@ -962,26 +963,52 @@ public class PlayerInventory extends Inventory
* @param type * @param type
*/ */
@Override @Override
public void reduceArrowCount(EtcItemType type) public void reduceAmmunitionCount(EtcItemType type)
{ {
if ((type != EtcItemType.ARROW) && (type != EtcItemType.BOLT)) if ((type != EtcItemType.ARROW) && (type != EtcItemType.BOLT))
{ {
LOGGER.log(Level.WARNING, type.toString(), " which is not arrow type passed to PlayerInstance.reduceArrowCount()"); LOGGER.log(Level.WARNING, type.toString(), " which is not ammo type.");
return; return;
} }
final ItemInstance arrows = getPaperdollItem(Inventory.PAPERDOLL_LHAND); final Weapon weapon = _owner.getActiveWeaponItem();
if ((arrows == null) || (arrows.getItemType() != type)) if (weapon == null)
{ {
return; return;
} }
if (arrows.getEtcItem().isInfinite()) // Null-safe due to type checks above ItemInstance ammunition = null;
switch (weapon.getItemType())
{
case BOW:
{
ammunition = findArrowForBow(weapon);
break;
}
case CROSSBOW:
case TWOHANDCROSSBOW:
{
ammunition = findBoltForCrossBow(weapon);
break;
}
default:
{
return;
}
}
if ((ammunition == null) || (ammunition.getItemType() != type))
{ {
return; return;
} }
updateItemCountNoDbUpdate(null, arrows, -1, _owner, null); if (ammunition.getEtcItem().isInfinite())
{
return;
}
// Reduce item count.
updateItemCountNoDbUpdate(null, ammunition, -1, _owner, null);
} }
/** /**
@@ -0,0 +1,44 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.skills;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
/**
* @author Mobius
*/
public class AmmunitionSkillList
{
private static final Set<Integer> SKILLS = ConcurrentHashMap.newKeySet();
public static void add(List<ItemSkillHolder> skills)
{
for (ItemSkillHolder skill : skills)
{
SKILLS.add(skill.getSkillId());
}
}
public static Set<Integer> values()
{
return SKILLS;
}
}
@@ -52,8 +52,10 @@ import org.l2jmobius.gameserver.model.clan.Clan;
import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder; import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder;
import org.l2jmobius.gameserver.model.holders.ClientHardwareInfoHolder; import org.l2jmobius.gameserver.model.holders.ClientHardwareInfoHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.items.type.EtcItemType;
import org.l2jmobius.gameserver.model.quest.Quest; import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.residences.ClanHall; import org.l2jmobius.gameserver.model.residences.ClanHall;
import org.l2jmobius.gameserver.model.siege.Fort; import org.l2jmobius.gameserver.model.siege.Fort;
@@ -678,6 +680,13 @@ public class EnterWorld implements IClientIncomingPacket
player.getInventory().equipItemAndRecord(agathion); player.getInventory().equipItemAndRecord(agathion);
} }
// Old ammunition check.
final ItemInstance leftHandItem = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
if ((leftHandItem != null) && ((leftHandItem.getItemType() == EtcItemType.ARROW) || (leftHandItem.getItemType() == EtcItemType.BOLT) || (leftHandItem.getItemType() == EtcItemType.ELEMENTAL_ORB)))
{
player.getInventory().unEquipItemInBodySlot(Inventory.PAPERDOLL_LHAND);
}
if (Config.ENABLE_ATTENDANCE_REWARDS) if (Config.ENABLE_ATTENDANCE_REWARDS)
{ {
ThreadPool.schedule(() -> ThreadPool.schedule(() ->