https://wiki.melvoridle.com/api.php?action=feedcontributions&user=Jetbent&feedformat=atom
Melvor Idle - User contributions [en]
2024-03-29T09:48:36Z
User contributions
MediaWiki 1.39.3
https://wiki.melvoridle.com/index.php?title=Damage_Reduction&diff=49220
Damage Reduction
2021-12-23T03:10:38Z
<p>Jetbent: </p>
<hr />
<div>{{V|1.0}}<br />
<br />
'''{{PAGENAME}}''' is a stat that does exactly what it suggests: It reduces the amount of damage taken by a player or monster. Unlike other combat numbers that are complex calculations, a player's Damage Reduction is determined by simply adding together all Damage Reduction bonuses the player has, whether from equipment or something else like a Damage Reduction Potion or Leonardo (pet).svg Leonardo.<br />
<br />
Many monsters have Damage Reduction modifiers that affect their defensive stats. <br />
<br />
==Mechanics==<br />
Whenever a player or monster with Damage Reduction greater than 0% would receive damage, instead the damage the damage they take is equal to:<br />
<br />
Damage Taken=Base Damage∗(1−Damage Reduction)<br />
<br />
Note that the Combat Triangle will affect how much damage reduction the player has if they are using a different style from the monster.<br />
<br />
==Damage Reduction Modifiers==<br />
<br />
{{#invoke:ModifierTables|getModifierTable|DamageReduction|Damage Reduction}}<br />
<br />
==Melee Damage Reduction Equipment==<br />
TO BE CREATED<br />
<br />
==Ranged Damage Reduction Equipment==<br />
TO BE CREATED<br />
<br />
==Mage Damage Reduction Equipment==<br />
TO BE CREATED<br />
<br />
==Monsters with Damage Reduction==<br />
TO BE CREATED</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Damage_Reduction&diff=49219
Damage Reduction
2021-12-23T03:09:20Z
<p>Jetbent: /* Modifiers */</p>
<hr />
<div>{{V|1.0}}<br />
<br />
'''{{PAGENAME}}''' is a stat that does exactly what it suggests: It reduces the amount of damage taken by a player or monster. Unlike other combat numbers that are complex calculations, a player's Damage Reduction is determined by simply adding together all Damage Reduction bonuses the player has, whether from equipment or something else like a Damage Reduction Potion or Leonardo (pet).svg Leonardo.<br />
<br />
Many monsters have Damage Reduction modifiers that affect their defensive stats. <br />
<br />
==Mechanics==<br />
Whenever a player or monster with Damage Reduction greater than 0% would receive damage, instead the damage the damage they take is equal to:<br />
<br />
Damage Taken=Base Damage∗(1−Damage Reduction)<br />
<br />
Note that the Combat Triangle will affect how much damage reduction the player has if they are using a different style from the monster.<br />
<br />
==Damage Reduction Modifiers==<br />
<br />
{{#invoke:ModifierTables|getModifierTable|DamageReduction|Damage Reduction}}<br />
<br />
==Monsters with Damage Reduction==<br />
TO BE CREATED</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Damage_Reduction&diff=49218
Damage Reduction
2021-12-23T01:08:08Z
<p>Jetbent: Created Damage Reduction page</p>
<hr />
<div>{{V|1.0}}<br />
<br />
'''{{PAGENAME}}''' is a stat that does exactly what it suggests: It reduces the amount of damage taken by a player or monster. Unlike other combat numbers that are complex calculations, a player's Damage Reduction is determined by simply adding together all Damage Reduction bonuses the player has, whether from equipment or something else like a Damage Reduction Potion or Leonardo (pet).svg Leonardo.<br />
<br />
Many monsters have Damage Reduction modifiers that affect their defensive stats. <br />
<br />
==Mechanics==<br />
Whenever a player or monster with Damage Reduction greater than 0% would receive damage, instead the damage the damage they take is equal to:<br />
<br />
Damage Taken=Base Damage∗(1−Damage Reduction)<br />
<br />
Note that the Combat Triangle will affect how much damage reduction the player has if they are using a different style from the monster.<br />
<br />
==Modifiers==<br />
{{ModifierTable|DamageReduction}}<br />
<br />
==Monsters with Damage Reduction==<br />
TO BE CREATED</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Ranged&diff=49214
Ranged
2021-12-22T23:41:41Z
<p>Jetbent: /* Ammo Preservation */</p>
<hr />
<div>{{V|0.20}}<br />
<br />
[[File:Ranged (skill).svg|thumb|right|Ranged]]<br />
<br />
'''{{PAGENAME}}''' affects how good the player is with ranged {{Icon|Combat}}. It determines what ranged armour and weapons the player can use. The Ranged skill also increases the maximum hit and accuracy rating of ranged weapons.<br />
<br />
Players using Ranged will gain [[Combat Triangle]] bonuses against monsters that use {{Skill|Magic}} and penalties against monsters that use {{Icon|Melee}}.<br />
<br />
==Combat Styles==<br />
There are three Ranged combat styles: Accurate, Rapid, and Longranged.<br />
<br />
When using the Rapid or Accurate styles, 0.4 Ranged experience is earned per point of damage dealt. When using the Longranged style, 0.2 Ranged experience and 0.2 Defence experience is earned per point of damage instead.<br />
<br />
In addition to affecting what experience is earned, each Ranged combat style has a special bonus:<br />
<br />
* When using the Accurate style, the player's [[Combat#Ranged Accuracy Rating|Ranged Accuracy Rating]] is slightly increased. Details can be found on the [[Combat#Ranged Accuracy Rating|Combat]] page.<br />
* When using the Rapid style, the player attacks 0.4s faster.<br />
* The Longranged style does not provide any bonus, although in earlier versions it provided a slight increase to the player's Melee Evasion Rating.<br />
<br />
==Experience Boosts==<br />
<br />
Ranged experience earned can be increased by 4% by equipping the {{ItemIcon|Gold Emerald Ring}}, which is multiplicative with the 1% increase from {{PetIcon|Pyro}} and 5% from {{ItemIcon|Firemaking Skillcape}} for a maximum increase of 10%.<br />
<br />
== Material Unlocks ==<br />
Each bow, crossbow, javelin, throwing knife, arrow, bolt and armour material requires a certain Ranged level to be equipped. Below are some tables detailing which Ranged level is required for which material. <br />
=== Bows ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
!Weapon Type<br />
|-<br />
|1<br />
|Normal<br />
|{{ItemIcon|Normal Shortbow|Shortbow}}, {{ItemIcon|Normal Longbow|Longbow}}<br />
|-<br />
|5<br />
|Oak<br />
|{{ItemIcon|Oak Shortbow|Shortbow}}, {{ItemIcon|Oak Longbow|Longbow}}<br />
|-<br />
|20<br />
|Willow<br />
|{{ItemIcon|Willow Shortbow|Shortbow}}, {{ItemIcon|Willow Longbow|Longbow}}<br />
|-<br />
|30<br />
|Maple<br />
|{{ItemIcon|Maple Shortbow|Shortbow}}, {{ItemIcon|Maple Longbow|Longbow}}<br />
|-<br />
|rowspan="2" |40<br />
|Yew<br />
|{{ItemIcon|Yew Shortbow|Shortbow}}, {{ItemIcon|Yew Longbow|Longbow}}<br />
|-<br />
|Ice<br />
|{{ItemIcon|Ice Shortbow|Shortbow}}, {{ItemIcon|Ice Longbow|Longbow}}<br />
|-<br />
|rowspan="2" |50<br />
|Magic<br />
|{{ItemIcon|Magic Shortbow|Shortbow}}, {{ItemIcon|Magic Longbow|Longbow}}<br />
|-<br />
|Desert<br />
|{{ItemIcon|Desert Shortbow|Shortbow}}<br />
|-<br />
|60<br />
|Redwood<br />
|{{ItemIcon|Redwood Shortbow|Shortbow}}, {{ItemIcon|Redwood Longbow|Longbow}}<br />
|-<br />
|70<br />
|Ancient<br />
|{{ItemIcon|Ancient Longbow|Longbow}}<br />
|-<br />
|80<br />
|<br />
|{{ItemIcon|Stormsnap}}<br />
|}<br />
<br />
=== Arrows ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="3" |1<br />
|{{ItemIcon|Bronze Arrows|Bronze}}<br />
|-<br />
|{{ItemIcon|Iron Arrows|Iron}}<br />
|-<br />
|{{ItemIcon|Ice Arrows|Ice}}<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Arrows|Steel}}<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Arrows|Mithril}}<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Arrows|Adamant}}<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Arrows|Rune}}<br />
|-<br />
|60<br />
|{{ItemIcon|Dragon Arrows|Dragon}}<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Arrows|Ancient}}<br />
|}<br />
<br />
===Crossbows===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|{{ItemIcon|Bronze Crossbow|Bronze}}<br />
|-<br />
|{{ItemIcon|Iron Crossbow|Iron}}<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Crossbow|Steel}}<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Crossbow|Mithril}}<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Crossbow|Adamant}}<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Crossbow|Rune}}<br />
|-<br />
|rowspan="3" |60<br />
|{{ItemIcon|Dragon Crossbow|Dragon}}<br />
|-<br />
|{{ItemIcon|Confetti Crossbow}}<br />
|-<br />
|{{ItemIcon|Slayer's Crossbow}}<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Crossbow|Ancient}}<br />
|-<br />
|90<br />
|{{ItemIcon|Shockwave}}<br />
|}<br />
<br />
=== Crossbow Bolts ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|1<br />
|{{ItemIcon|Topaz Bolts|Topaz}}<br />
|-<br />
|20<br />
|{{ItemIcon|Sapphire Bolts|Sapphire}}<br />
|-<br />
|40<br />
|{{ItemIcon|Ruby Bolts|Ruby}}<br />
|-<br />
|60<br />
|{{ItemIcon|Emerald Bolts|Emerald}}<br />
|-<br />
|80<br />
|{{ItemIcon|Diamond Bolts|Diamond}}<br />
|-<br />
|90<br />
|{{ItemIcon|Jadestone Bolts|Jadestone}}<br />
|}<br />
<br />
=== Javelins/Throwing Knives ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|{{ItemIcon|Bronze Javelin|notext=true}} {{ItemIcon|Bronze Throwing Knife|notext=true}} Bronze<br />
|-<br />
|{{ItemIcon|Iron Javelin|notext=true}} {{ItemIcon|Iron Throwing Knife|notext=true}} Iron<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Javelin|notext=true}} {{ItemIcon|Steel Throwing Knife|notext=true}} Steel<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Javelin|notext=true}} {{ItemIcon|Mithril Throwing Knife|notext=true}} Mithril<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Javelin|notext=true}} {{ItemIcon|Adamant Throwing Knife|notext=true}} Adamant<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Javelin|notext=true}} {{ItemIcon|Rune Throwing Knife|notext=true}} Rune<br />
|-<br />
|60<br />
|{{ItemIcon|Dragon Javelin|notext=true}} {{ItemIcon|Dragon Throwing Knife|notext=true}} Dragon<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Javelin|notext=true}} {{ItemIcon|Ancient Throwing Knife|notext=true}} Ancient<br />
|}<br />
<br />
=== Armour ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|Leather<br />
|-<br />
|Slayer (Basic)<br />
|-<br />
|10<br />
|Hard Leather<br />
|-<br />
|30<br />
|Slayer (Strong)<br />
|-<br />
|rowspan="3" |40<br />
|Green D-Hide<br />
|-<br />
|Ranger<br />
|-<br />
|Ice<br />
|-<br />
|50<br />
|Blue D-Hide<br />
|-<br />
|rowspan="2" |60<br />
|Red D-Hide<br />
|-<br />
|Slayer (Elite)<br />
|-<br />
|70<br />
|Black D-Hide<br />
|-<br />
|rowspan="2" |80<br />
|Ancient<br />
|-<br />
|Slayer (Master)<br />
|-<br />
|85<br />
|{{ZoneIcon|Air God Dungeon|Aeris}}<br />
|}<br />
<br />
== Skillcape ==<br />
<br />
The [[Skillcapes|skillcape]] can be purchased from the store for {{GP|1000000}} after the player reaches {{SkillReq|{{PAGENAME}}|99}}.<br />
{{SkillcapeInfo}}<br />
<br />
== Pet ==<br />
The [[Pets|pet]] can be unlocked by doing any action that grants Ranged experience.<br />
{{PetSkillInfo}}<br />
<br />
==Ammo Preservation==<br />
Ammo Preservation reduces the likelihood of ammunition being consumed while using ranged attacks.<br />
<br />
{{ModifierTable|AmmoPreservation}}<br />
<br />
== Ranged Weapon Stats ==<br />
<br />
=== Bows ===<br />
{{BowsTable}}<br />
<br />
=== Arrows ===<br />
{{ArrowsTable}}<br />
<br />
=== Crossbows ===<br />
<br />
{{CrossbowsTable}}<br />
<br />
=== Crossbow Bolts ===<br />
<br />
{{BoltsTable}}<br />
<br />
=== Javelins ===<br />
<br />
{{JavelinsTable}}<br />
<br />
=== Throwing Knives ===<br />
<br />
{{ThrowingKnivesTable}}<br />
<br />
== Ranged Armour Stats ==<br />
<br />
=== Helmets ===<br />
<br />
{{RangedHelmetTable}}<br />
<br />
=== Bodies ===<br />
<br />
{{RangedPlatebodyTable}}<br />
<br />
=== Legs ===<br />
<br />
{{RangedPlatelegsTable}}<br />
<br />
=== Boots ===<br />
{{RangedBootsTable}}<br />
<br />
=== Gloves ===<br />
<br />
{{RangedGlovesTable}}<br />
<br />
=== Shields ===<br />
{{RangedShieldsTable}}<br />
<br />
=== Capes ===<br />
{{RangedCapesTable}}<br />
<br />
[[Category:Skills]]<br />
{{Menu}}</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Ranged&diff=49213
Ranged
2021-12-22T23:18:17Z
<p>Jetbent: Replaced manual ammo preservation table with ModifierTable generator and moved to bottom of page.</p>
<hr />
<div>{{V|0.20}}<br />
<br />
[[File:Ranged (skill).svg|thumb|right|Ranged]]<br />
<br />
'''{{PAGENAME}}''' affects how good the player is with ranged {{Icon|Combat}}. It determines what ranged armour and weapons the player can use. The Ranged skill also increases the maximum hit and accuracy rating of ranged weapons.<br />
<br />
Players using Ranged will gain [[Combat Triangle]] bonuses against monsters that use {{Skill|Magic}} and penalties against monsters that use {{Icon|Melee}}.<br />
<br />
==Combat Styles==<br />
There are three Ranged combat styles: Accurate, Rapid, and Longranged.<br />
<br />
When using the Rapid or Accurate styles, 0.4 Ranged experience is earned per point of damage dealt. When using the Longranged style, 0.2 Ranged experience and 0.2 Defence experience is earned per point of damage instead.<br />
<br />
In addition to affecting what experience is earned, each Ranged combat style has a special bonus:<br />
<br />
* When using the Accurate style, the player's [[Combat#Ranged Accuracy Rating|Ranged Accuracy Rating]] is slightly increased. Details can be found on the [[Combat#Ranged Accuracy Rating|Combat]] page.<br />
* When using the Rapid style, the player attacks 0.4s faster.<br />
* The Longranged style does not provide any bonus, although in earlier versions it provided a slight increase to the player's Melee Evasion Rating.<br />
<br />
==Experience Boosts==<br />
<br />
Ranged experience earned can be increased by 4% by equipping the {{ItemIcon|Gold Emerald Ring}}, which is multiplicative with the 1% increase from {{PetIcon|Pyro}} and 5% from {{ItemIcon|Firemaking Skillcape}} for a maximum increase of 10%.<br />
<br />
== Material Unlocks ==<br />
Each bow, crossbow, javelin, throwing knife, arrow, bolt and armour material requires a certain Ranged level to be equipped. Below are some tables detailing which Ranged level is required for which material. <br />
=== Bows ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
!Weapon Type<br />
|-<br />
|1<br />
|Normal<br />
|{{ItemIcon|Normal Shortbow|Shortbow}}, {{ItemIcon|Normal Longbow|Longbow}}<br />
|-<br />
|5<br />
|Oak<br />
|{{ItemIcon|Oak Shortbow|Shortbow}}, {{ItemIcon|Oak Longbow|Longbow}}<br />
|-<br />
|20<br />
|Willow<br />
|{{ItemIcon|Willow Shortbow|Shortbow}}, {{ItemIcon|Willow Longbow|Longbow}}<br />
|-<br />
|30<br />
|Maple<br />
|{{ItemIcon|Maple Shortbow|Shortbow}}, {{ItemIcon|Maple Longbow|Longbow}}<br />
|-<br />
|rowspan="2" |40<br />
|Yew<br />
|{{ItemIcon|Yew Shortbow|Shortbow}}, {{ItemIcon|Yew Longbow|Longbow}}<br />
|-<br />
|Ice<br />
|{{ItemIcon|Ice Shortbow|Shortbow}}, {{ItemIcon|Ice Longbow|Longbow}}<br />
|-<br />
|rowspan="2" |50<br />
|Magic<br />
|{{ItemIcon|Magic Shortbow|Shortbow}}, {{ItemIcon|Magic Longbow|Longbow}}<br />
|-<br />
|Desert<br />
|{{ItemIcon|Desert Shortbow|Shortbow}}<br />
|-<br />
|60<br />
|Redwood<br />
|{{ItemIcon|Redwood Shortbow|Shortbow}}, {{ItemIcon|Redwood Longbow|Longbow}}<br />
|-<br />
|70<br />
|Ancient<br />
|{{ItemIcon|Ancient Longbow|Longbow}}<br />
|-<br />
|80<br />
|<br />
|{{ItemIcon|Stormsnap}}<br />
|}<br />
<br />
=== Arrows ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="3" |1<br />
|{{ItemIcon|Bronze Arrows|Bronze}}<br />
|-<br />
|{{ItemIcon|Iron Arrows|Iron}}<br />
|-<br />
|{{ItemIcon|Ice Arrows|Ice}}<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Arrows|Steel}}<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Arrows|Mithril}}<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Arrows|Adamant}}<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Arrows|Rune}}<br />
|-<br />
|60<br />
|{{ItemIcon|Dragon Arrows|Dragon}}<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Arrows|Ancient}}<br />
|}<br />
<br />
===Crossbows===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|{{ItemIcon|Bronze Crossbow|Bronze}}<br />
|-<br />
|{{ItemIcon|Iron Crossbow|Iron}}<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Crossbow|Steel}}<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Crossbow|Mithril}}<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Crossbow|Adamant}}<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Crossbow|Rune}}<br />
|-<br />
|rowspan="3" |60<br />
|{{ItemIcon|Dragon Crossbow|Dragon}}<br />
|-<br />
|{{ItemIcon|Confetti Crossbow}}<br />
|-<br />
|{{ItemIcon|Slayer's Crossbow}}<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Crossbow|Ancient}}<br />
|-<br />
|90<br />
|{{ItemIcon|Shockwave}}<br />
|}<br />
<br />
=== Crossbow Bolts ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|1<br />
|{{ItemIcon|Topaz Bolts|Topaz}}<br />
|-<br />
|20<br />
|{{ItemIcon|Sapphire Bolts|Sapphire}}<br />
|-<br />
|40<br />
|{{ItemIcon|Ruby Bolts|Ruby}}<br />
|-<br />
|60<br />
|{{ItemIcon|Emerald Bolts|Emerald}}<br />
|-<br />
|80<br />
|{{ItemIcon|Diamond Bolts|Diamond}}<br />
|-<br />
|90<br />
|{{ItemIcon|Jadestone Bolts|Jadestone}}<br />
|}<br />
<br />
=== Javelins/Throwing Knives ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|{{ItemIcon|Bronze Javelin|notext=true}} {{ItemIcon|Bronze Throwing Knife|notext=true}} Bronze<br />
|-<br />
|{{ItemIcon|Iron Javelin|notext=true}} {{ItemIcon|Iron Throwing Knife|notext=true}} Iron<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Javelin|notext=true}} {{ItemIcon|Steel Throwing Knife|notext=true}} Steel<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Javelin|notext=true}} {{ItemIcon|Mithril Throwing Knife|notext=true}} Mithril<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Javelin|notext=true}} {{ItemIcon|Adamant Throwing Knife|notext=true}} Adamant<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Javelin|notext=true}} {{ItemIcon|Rune Throwing Knife|notext=true}} Rune<br />
|-<br />
|60<br />
|{{ItemIcon|Dragon Javelin|notext=true}} {{ItemIcon|Dragon Throwing Knife|notext=true}} Dragon<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Javelin|notext=true}} {{ItemIcon|Ancient Throwing Knife|notext=true}} Ancient<br />
|}<br />
<br />
=== Armour ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|Leather<br />
|-<br />
|Slayer (Basic)<br />
|-<br />
|10<br />
|Hard Leather<br />
|-<br />
|30<br />
|Slayer (Strong)<br />
|-<br />
|rowspan="3" |40<br />
|Green D-Hide<br />
|-<br />
|Ranger<br />
|-<br />
|Ice<br />
|-<br />
|50<br />
|Blue D-Hide<br />
|-<br />
|rowspan="2" |60<br />
|Red D-Hide<br />
|-<br />
|Slayer (Elite)<br />
|-<br />
|70<br />
|Black D-Hide<br />
|-<br />
|rowspan="2" |80<br />
|Ancient<br />
|-<br />
|Slayer (Master)<br />
|-<br />
|85<br />
|{{ZoneIcon|Air God Dungeon|Aeris}}<br />
|}<br />
<br />
== Skillcape ==<br />
<br />
The [[Skillcapes|skillcape]] can be purchased from the store for {{GP|1000000}} after the player reaches {{SkillReq|{{PAGENAME}}|99}}.<br />
{{SkillcapeInfo}}<br />
<br />
== Pet ==<br />
The [[Pets|pet]] can be unlocked by doing any action that grants Ranged experience.<br />
{{PetSkillInfo}}<br />
<br />
==Ammo Preservation==<br />
Ammo Preservation reduces the likelihood of ammunition being consumed while using ranged attacks.<br />
<br />
{{ModifierTable|AmmoPreservation}}<br />
<br />
The maximum Ammo Preservation bonus a player can have is 70% by equipping the Ranged Skillcape (+50%), Silver Emerald Necklace (+5%), Ranger Hat (+5%), and Ranger Boots (+5%) along with unlocking Marahute (+5%).<br />
<br />
== Ranged Weapon Stats ==<br />
<br />
=== Bows ===<br />
{{BowsTable}}<br />
<br />
=== Arrows ===<br />
{{ArrowsTable}}<br />
<br />
=== Crossbows ===<br />
<br />
{{CrossbowsTable}}<br />
<br />
=== Crossbow Bolts ===<br />
<br />
{{BoltsTable}}<br />
<br />
=== Javelins ===<br />
<br />
{{JavelinsTable}}<br />
<br />
=== Throwing Knives ===<br />
<br />
{{ThrowingKnivesTable}}<br />
<br />
== Ranged Armour Stats ==<br />
<br />
=== Helmets ===<br />
<br />
{{RangedHelmetTable}}<br />
<br />
=== Bodies ===<br />
<br />
{{RangedPlatebodyTable}}<br />
<br />
=== Legs ===<br />
<br />
{{RangedPlatelegsTable}}<br />
<br />
=== Boots ===<br />
{{RangedBootsTable}}<br />
<br />
=== Gloves ===<br />
<br />
{{RangedGlovesTable}}<br />
<br />
=== Shields ===<br />
{{RangedShieldsTable}}<br />
<br />
=== Capes ===<br />
{{RangedCapesTable}}<br />
<br />
[[Category:Skills]]<br />
{{Menu}}</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Ranged&diff=49212
Ranged
2021-12-22T23:03:01Z
<p>Jetbent: /* Ammo Preservation */ Cleaned up verbiage</p>
<hr />
<div>{{V|0.20}}<br />
<br />
[[File:Ranged (skill).svg|thumb|right|Ranged]]<br />
<br />
'''{{PAGENAME}}''' affects how good the player is with ranged {{Icon|Combat}}. It determines what ranged armour and weapons the player can use. The Ranged skill also increases the maximum hit and accuracy rating of ranged weapons.<br />
<br />
Players using Ranged will gain [[Combat Triangle]] bonuses against monsters that use {{Skill|Magic}} and penalties against monsters that use {{Icon|Melee}}.<br />
<br />
==Combat Styles==<br />
There are three Ranged combat styles: Accurate, Rapid, and Longranged.<br />
<br />
When using the Rapid or Accurate styles, 0.4 Ranged experience is earned per point of damage dealt. When using the Longranged style, 0.2 Ranged experience and 0.2 Defence experience is earned per point of damage instead.<br />
<br />
In addition to affecting what experience is earned, each Ranged combat style has a special bonus:<br />
<br />
* When using the Accurate style, the player's [[Combat#Ranged Accuracy Rating|Ranged Accuracy Rating]] is slightly increased. Details can be found on the [[Combat#Ranged Accuracy Rating|Combat]] page.<br />
* When using the Rapid style, the player attacks 0.4s faster.<br />
* The Longranged style does not provide any bonus, although in earlier versions it provided a slight increase to the player's Melee Evasion Rating.<br />
<br />
==Ammo Preservation==<br />
Ammo Preservation reduces the likelihood of ammunition being consumed while using ranged attacks.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Item !! Passive Bonus<br />
|-<br />
| {{ItemIcon|Ranged Skillcape}} || +50% Ammo Preservation<br />
|-<br />
| {{ItemIcon|Cape of Ranged Preservation}} || +20% Ammo Preservation<br />
|-<br />
| {{ItemIcon|Ranger Hat}} || +5% Ammo Preservation<br />
|-<br />
| {{ItemIcon|Ranger Boots}} || +5% Ammo Preservation<br />
|-<br />
| {{ItemIcon|Silver Emerald Necklace}} || +5% Ammo Preservation<br />
|-<br />
| {{PetIcon|Marahute}} || +5% Ammo Preservation<br />
|}<br />
<br />
The maximum Ammo Preservation bonus a player can have is 70% by equipping the Ranged Skillcape (+50%), Silver Emerald Necklace (+5%), Ranger Hat (+5%), and Ranger Boots (+5%) along with unlocking Marahute (+5%).<br />
<br />
==Experience Boosts==<br />
<br />
Ranged experience earned can be increased by 4% by equipping the {{ItemIcon|Gold Emerald Ring}}, which is multiplicative with the 1% increase from {{PetIcon|Pyro}} and 5% from {{ItemIcon|Firemaking Skillcape}} for a maximum increase of 10%.<br />
<br />
== Material Unlocks ==<br />
Each bow, crossbow, javelin, throwing knife, arrow, bolt and armour material requires a certain Ranged level to be equipped. Below are some tables detailing which Ranged level is required for which material. <br />
=== Bows ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
!Weapon Type<br />
|-<br />
|1<br />
|Normal<br />
|{{ItemIcon|Normal Shortbow|Shortbow}}, {{ItemIcon|Normal Longbow|Longbow}}<br />
|-<br />
|5<br />
|Oak<br />
|{{ItemIcon|Oak Shortbow|Shortbow}}, {{ItemIcon|Oak Longbow|Longbow}}<br />
|-<br />
|20<br />
|Willow<br />
|{{ItemIcon|Willow Shortbow|Shortbow}}, {{ItemIcon|Willow Longbow|Longbow}}<br />
|-<br />
|30<br />
|Maple<br />
|{{ItemIcon|Maple Shortbow|Shortbow}}, {{ItemIcon|Maple Longbow|Longbow}}<br />
|-<br />
|rowspan="2" |40<br />
|Yew<br />
|{{ItemIcon|Yew Shortbow|Shortbow}}, {{ItemIcon|Yew Longbow|Longbow}}<br />
|-<br />
|Ice<br />
|{{ItemIcon|Ice Shortbow|Shortbow}}, {{ItemIcon|Ice Longbow|Longbow}}<br />
|-<br />
|rowspan="2" |50<br />
|Magic<br />
|{{ItemIcon|Magic Shortbow|Shortbow}}, {{ItemIcon|Magic Longbow|Longbow}}<br />
|-<br />
|Desert<br />
|{{ItemIcon|Desert Shortbow|Shortbow}}<br />
|-<br />
|60<br />
|Redwood<br />
|{{ItemIcon|Redwood Shortbow|Shortbow}}, {{ItemIcon|Redwood Longbow|Longbow}}<br />
|-<br />
|70<br />
|Ancient<br />
|{{ItemIcon|Ancient Longbow|Longbow}}<br />
|-<br />
|80<br />
|<br />
|{{ItemIcon|Stormsnap}}<br />
|}<br />
<br />
=== Arrows ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="3" |1<br />
|{{ItemIcon|Bronze Arrows|Bronze}}<br />
|-<br />
|{{ItemIcon|Iron Arrows|Iron}}<br />
|-<br />
|{{ItemIcon|Ice Arrows|Ice}}<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Arrows|Steel}}<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Arrows|Mithril}}<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Arrows|Adamant}}<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Arrows|Rune}}<br />
|-<br />
|60<br />
|{{ItemIcon|Dragon Arrows|Dragon}}<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Arrows|Ancient}}<br />
|}<br />
<br />
===Crossbows===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|{{ItemIcon|Bronze Crossbow|Bronze}}<br />
|-<br />
|{{ItemIcon|Iron Crossbow|Iron}}<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Crossbow|Steel}}<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Crossbow|Mithril}}<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Crossbow|Adamant}}<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Crossbow|Rune}}<br />
|-<br />
|rowspan="3" |60<br />
|{{ItemIcon|Dragon Crossbow|Dragon}}<br />
|-<br />
|{{ItemIcon|Confetti Crossbow}}<br />
|-<br />
|{{ItemIcon|Slayer's Crossbow}}<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Crossbow|Ancient}}<br />
|-<br />
|90<br />
|{{ItemIcon|Shockwave}}<br />
|}<br />
<br />
=== Crossbow Bolts ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|1<br />
|{{ItemIcon|Topaz Bolts|Topaz}}<br />
|-<br />
|20<br />
|{{ItemIcon|Sapphire Bolts|Sapphire}}<br />
|-<br />
|40<br />
|{{ItemIcon|Ruby Bolts|Ruby}}<br />
|-<br />
|60<br />
|{{ItemIcon|Emerald Bolts|Emerald}}<br />
|-<br />
|80<br />
|{{ItemIcon|Diamond Bolts|Diamond}}<br />
|-<br />
|90<br />
|{{ItemIcon|Jadestone Bolts|Jadestone}}<br />
|}<br />
<br />
=== Javelins/Throwing Knives ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|{{ItemIcon|Bronze Javelin|notext=true}} {{ItemIcon|Bronze Throwing Knife|notext=true}} Bronze<br />
|-<br />
|{{ItemIcon|Iron Javelin|notext=true}} {{ItemIcon|Iron Throwing Knife|notext=true}} Iron<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Javelin|notext=true}} {{ItemIcon|Steel Throwing Knife|notext=true}} Steel<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Javelin|notext=true}} {{ItemIcon|Mithril Throwing Knife|notext=true}} Mithril<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Javelin|notext=true}} {{ItemIcon|Adamant Throwing Knife|notext=true}} Adamant<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Javelin|notext=true}} {{ItemIcon|Rune Throwing Knife|notext=true}} Rune<br />
|-<br />
|60<br />
|{{ItemIcon|Dragon Javelin|notext=true}} {{ItemIcon|Dragon Throwing Knife|notext=true}} Dragon<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Javelin|notext=true}} {{ItemIcon|Ancient Throwing Knife|notext=true}} Ancient<br />
|}<br />
<br />
=== Armour ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|Leather<br />
|-<br />
|Slayer (Basic)<br />
|-<br />
|10<br />
|Hard Leather<br />
|-<br />
|30<br />
|Slayer (Strong)<br />
|-<br />
|rowspan="3" |40<br />
|Green D-Hide<br />
|-<br />
|Ranger<br />
|-<br />
|Ice<br />
|-<br />
|50<br />
|Blue D-Hide<br />
|-<br />
|rowspan="2" |60<br />
|Red D-Hide<br />
|-<br />
|Slayer (Elite)<br />
|-<br />
|70<br />
|Black D-Hide<br />
|-<br />
|rowspan="2" |80<br />
|Ancient<br />
|-<br />
|Slayer (Master)<br />
|-<br />
|85<br />
|{{ZoneIcon|Air God Dungeon|Aeris}}<br />
|}<br />
<br />
== Skillcape ==<br />
<br />
The [[Skillcapes|skillcape]] can be purchased from the store for {{GP|1000000}} after the player reaches {{SkillReq|{{PAGENAME}}|99}}.<br />
{{SkillcapeInfo}}<br />
<br />
== Pet ==<br />
The [[Pets|pet]] can be unlocked by doing any action that grants Ranged experience.<br />
{{PetSkillInfo}}<br />
<br />
== Ranged Weapon Stats ==<br />
<br />
=== Bows ===<br />
{{BowsTable}}<br />
<br />
=== Arrows ===<br />
{{ArrowsTable}}<br />
<br />
=== Crossbows ===<br />
<br />
{{CrossbowsTable}}<br />
<br />
=== Crossbow Bolts ===<br />
<br />
{{BoltsTable}}<br />
<br />
=== Javelins ===<br />
<br />
{{JavelinsTable}}<br />
<br />
=== Throwing Knives ===<br />
<br />
{{ThrowingKnivesTable}}<br />
<br />
== Ranged Armour Stats ==<br />
<br />
=== Helmets ===<br />
<br />
{{RangedHelmetTable}}<br />
<br />
=== Bodies ===<br />
<br />
{{RangedPlatebodyTable}}<br />
<br />
=== Legs ===<br />
<br />
{{RangedPlatelegsTable}}<br />
<br />
=== Boots ===<br />
{{RangedBootsTable}}<br />
<br />
=== Gloves ===<br />
<br />
{{RangedGlovesTable}}<br />
<br />
=== Shields ===<br />
{{RangedShieldsTable}}<br />
<br />
=== Capes ===<br />
{{RangedCapesTable}}<br />
<br />
[[Category:Skills]]<br />
{{Menu}}</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Ranged&diff=49211
Ranged
2021-12-22T23:01:54Z
<p>Jetbent: Added section on Ammo Preservation and removed duplicative information about the ranged skillcape.</p>
<hr />
<div>{{V|0.20}}<br />
<br />
[[File:Ranged (skill).svg|thumb|right|Ranged]]<br />
<br />
'''{{PAGENAME}}''' affects how good the player is with ranged {{Icon|Combat}}. It determines what ranged armour and weapons the player can use. The Ranged skill also increases the maximum hit and accuracy rating of ranged weapons.<br />
<br />
Players using Ranged will gain [[Combat Triangle]] bonuses against monsters that use {{Skill|Magic}} and penalties against monsters that use {{Icon|Melee}}.<br />
<br />
==Combat Styles==<br />
There are three Ranged combat styles: Accurate, Rapid, and Longranged.<br />
<br />
When using the Rapid or Accurate styles, 0.4 Ranged experience is earned per point of damage dealt. When using the Longranged style, 0.2 Ranged experience and 0.2 Defence experience is earned per point of damage instead.<br />
<br />
In addition to affecting what experience is earned, each Ranged combat style has a special bonus:<br />
<br />
* When using the Accurate style, the player's [[Combat#Ranged Accuracy Rating|Ranged Accuracy Rating]] is slightly increased. Details can be found on the [[Combat#Ranged Accuracy Rating|Combat]] page.<br />
* When using the Rapid style, the player attacks 0.4s faster.<br />
* The Longranged style does not provide any bonus, although in earlier versions it provided a slight increase to the player's Melee Evasion Rating.<br />
<br />
==Ammo Preservation==<br />
Ammo Preservation reduces the likelihood of ammunition being consumed while used ranged attacks. The following provide ammo preservation bonuses.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Item !! Passive Bonus<br />
|-<br />
| {{ItemIcon|Ranged Skillcape}} || +50% Ammo Preservation<br />
|-<br />
| {{ItemIcon|Cape of Ranged Preservation}} || +20% Ammo Preservation<br />
|-<br />
| {{ItemIcon|Ranger Hat}} || +5% Ammo Preservation<br />
|-<br />
| {{ItemIcon|Ranger Boots}} || +5% Ammo Preservation<br />
|-<br />
| {{ItemIcon|Silver Emerald Necklace}} || +5% Ammo Preservation<br />
|-<br />
| {{PetIcon|Marahute}} || +5% Ammo Preservation<br />
|}<br />
<br />
The maximum Ammo Preservation bonus a player can have is 70% by equipping the Ranged Skillcape, Silver Emerald Necklace, Ranger Hat, and Ranger Boots along with unlocking Marahute. <br />
<br />
==Experience Boosts==<br />
<br />
Ranged experience earned can be increased by 4% by equipping the {{ItemIcon|Gold Emerald Ring}}, which is multiplicative with the 1% increase from {{PetIcon|Pyro}} and 5% from {{ItemIcon|Firemaking Skillcape}} for a maximum increase of 10%.<br />
<br />
== Material Unlocks ==<br />
Each bow, crossbow, javelin, throwing knife, arrow, bolt and armour material requires a certain Ranged level to be equipped. Below are some tables detailing which Ranged level is required for which material. <br />
=== Bows ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
!Weapon Type<br />
|-<br />
|1<br />
|Normal<br />
|{{ItemIcon|Normal Shortbow|Shortbow}}, {{ItemIcon|Normal Longbow|Longbow}}<br />
|-<br />
|5<br />
|Oak<br />
|{{ItemIcon|Oak Shortbow|Shortbow}}, {{ItemIcon|Oak Longbow|Longbow}}<br />
|-<br />
|20<br />
|Willow<br />
|{{ItemIcon|Willow Shortbow|Shortbow}}, {{ItemIcon|Willow Longbow|Longbow}}<br />
|-<br />
|30<br />
|Maple<br />
|{{ItemIcon|Maple Shortbow|Shortbow}}, {{ItemIcon|Maple Longbow|Longbow}}<br />
|-<br />
|rowspan="2" |40<br />
|Yew<br />
|{{ItemIcon|Yew Shortbow|Shortbow}}, {{ItemIcon|Yew Longbow|Longbow}}<br />
|-<br />
|Ice<br />
|{{ItemIcon|Ice Shortbow|Shortbow}}, {{ItemIcon|Ice Longbow|Longbow}}<br />
|-<br />
|rowspan="2" |50<br />
|Magic<br />
|{{ItemIcon|Magic Shortbow|Shortbow}}, {{ItemIcon|Magic Longbow|Longbow}}<br />
|-<br />
|Desert<br />
|{{ItemIcon|Desert Shortbow|Shortbow}}<br />
|-<br />
|60<br />
|Redwood<br />
|{{ItemIcon|Redwood Shortbow|Shortbow}}, {{ItemIcon|Redwood Longbow|Longbow}}<br />
|-<br />
|70<br />
|Ancient<br />
|{{ItemIcon|Ancient Longbow|Longbow}}<br />
|-<br />
|80<br />
|<br />
|{{ItemIcon|Stormsnap}}<br />
|}<br />
<br />
=== Arrows ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="3" |1<br />
|{{ItemIcon|Bronze Arrows|Bronze}}<br />
|-<br />
|{{ItemIcon|Iron Arrows|Iron}}<br />
|-<br />
|{{ItemIcon|Ice Arrows|Ice}}<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Arrows|Steel}}<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Arrows|Mithril}}<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Arrows|Adamant}}<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Arrows|Rune}}<br />
|-<br />
|60<br />
|{{ItemIcon|Dragon Arrows|Dragon}}<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Arrows|Ancient}}<br />
|}<br />
<br />
===Crossbows===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|{{ItemIcon|Bronze Crossbow|Bronze}}<br />
|-<br />
|{{ItemIcon|Iron Crossbow|Iron}}<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Crossbow|Steel}}<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Crossbow|Mithril}}<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Crossbow|Adamant}}<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Crossbow|Rune}}<br />
|-<br />
|rowspan="3" |60<br />
|{{ItemIcon|Dragon Crossbow|Dragon}}<br />
|-<br />
|{{ItemIcon|Confetti Crossbow}}<br />
|-<br />
|{{ItemIcon|Slayer's Crossbow}}<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Crossbow|Ancient}}<br />
|-<br />
|90<br />
|{{ItemIcon|Shockwave}}<br />
|}<br />
<br />
=== Crossbow Bolts ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|1<br />
|{{ItemIcon|Topaz Bolts|Topaz}}<br />
|-<br />
|20<br />
|{{ItemIcon|Sapphire Bolts|Sapphire}}<br />
|-<br />
|40<br />
|{{ItemIcon|Ruby Bolts|Ruby}}<br />
|-<br />
|60<br />
|{{ItemIcon|Emerald Bolts|Emerald}}<br />
|-<br />
|80<br />
|{{ItemIcon|Diamond Bolts|Diamond}}<br />
|-<br />
|90<br />
|{{ItemIcon|Jadestone Bolts|Jadestone}}<br />
|}<br />
<br />
=== Javelins/Throwing Knives ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|{{ItemIcon|Bronze Javelin|notext=true}} {{ItemIcon|Bronze Throwing Knife|notext=true}} Bronze<br />
|-<br />
|{{ItemIcon|Iron Javelin|notext=true}} {{ItemIcon|Iron Throwing Knife|notext=true}} Iron<br />
|-<br />
|5<br />
|{{ItemIcon|Steel Javelin|notext=true}} {{ItemIcon|Steel Throwing Knife|notext=true}} Steel<br />
|-<br />
|20<br />
|{{ItemIcon|Mithril Javelin|notext=true}} {{ItemIcon|Mithril Throwing Knife|notext=true}} Mithril<br />
|-<br />
|30<br />
|{{ItemIcon|Adamant Javelin|notext=true}} {{ItemIcon|Adamant Throwing Knife|notext=true}} Adamant<br />
|-<br />
|40<br />
|{{ItemIcon|Rune Javelin|notext=true}} {{ItemIcon|Rune Throwing Knife|notext=true}} Rune<br />
|-<br />
|60<br />
|{{ItemIcon|Dragon Javelin|notext=true}} {{ItemIcon|Dragon Throwing Knife|notext=true}} Dragon<br />
|-<br />
|70<br />
|{{ItemIcon|Ancient Javelin|notext=true}} {{ItemIcon|Ancient Throwing Knife|notext=true}} Ancient<br />
|}<br />
<br />
=== Armour ===<br />
{| class="wikitable"<br />
!{{Skill|{{PAGENAME}}|notext=true}} Level<br />
!Material<br />
|-<br />
|rowspan="2" |1<br />
|Leather<br />
|-<br />
|Slayer (Basic)<br />
|-<br />
|10<br />
|Hard Leather<br />
|-<br />
|30<br />
|Slayer (Strong)<br />
|-<br />
|rowspan="3" |40<br />
|Green D-Hide<br />
|-<br />
|Ranger<br />
|-<br />
|Ice<br />
|-<br />
|50<br />
|Blue D-Hide<br />
|-<br />
|rowspan="2" |60<br />
|Red D-Hide<br />
|-<br />
|Slayer (Elite)<br />
|-<br />
|70<br />
|Black D-Hide<br />
|-<br />
|rowspan="2" |80<br />
|Ancient<br />
|-<br />
|Slayer (Master)<br />
|-<br />
|85<br />
|{{ZoneIcon|Air God Dungeon|Aeris}}<br />
|}<br />
<br />
== Skillcape ==<br />
<br />
The [[Skillcapes|skillcape]] can be purchased from the store for {{GP|1000000}} after the player reaches {{SkillReq|{{PAGENAME}}|99}}.<br />
{{SkillcapeInfo}}<br />
<br />
== Pet ==<br />
The [[Pets|pet]] can be unlocked by doing any action that grants Ranged experience.<br />
{{PetSkillInfo}}<br />
<br />
== Ranged Weapon Stats ==<br />
<br />
=== Bows ===<br />
{{BowsTable}}<br />
<br />
=== Arrows ===<br />
{{ArrowsTable}}<br />
<br />
=== Crossbows ===<br />
<br />
{{CrossbowsTable}}<br />
<br />
=== Crossbow Bolts ===<br />
<br />
{{BoltsTable}}<br />
<br />
=== Javelins ===<br />
<br />
{{JavelinsTable}}<br />
<br />
=== Throwing Knives ===<br />
<br />
{{ThrowingKnivesTable}}<br />
<br />
== Ranged Armour Stats ==<br />
<br />
=== Helmets ===<br />
<br />
{{RangedHelmetTable}}<br />
<br />
=== Bodies ===<br />
<br />
{{RangedPlatebodyTable}}<br />
<br />
=== Legs ===<br />
<br />
{{RangedPlatelegsTable}}<br />
<br />
=== Boots ===<br />
{{RangedBootsTable}}<br />
<br />
=== Gloves ===<br />
<br />
{{RangedGlovesTable}}<br />
<br />
=== Shields ===<br />
{{RangedShieldsTable}}<br />
<br />
=== Capes ===<br />
{{RangedCapesTable}}<br />
<br />
[[Category:Skills]]<br />
{{Menu}}</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Agility&diff=48134
Agility
2021-11-27T19:16:26Z
<p>Jetbent: /* Obstacles */ Added disclaimer for base rate columns time, xp/s, gp/s, and cost</p>
<hr />
<div>{{V|0.20}}<br />
[[File:Agility (skill).svg|thumb|right|Agility]]<br />
{{Otheruses|the {{PAGENAME}} skill|a guide to leveling the skill|{{PAGENAME}}/Training}}<br />
<br />
'''{{PAGENAME}}''' is a skill that provides global bonuses to other aspects of the game.<br />
<br />
== Obstacles ==<br />
Obstacles are part of your Agility course and each provide different global bonuses, and completion rewards. '''In order to receive an obstacle's bonuses, all earlier obstacle course slots must contain an obstacle.''' Thus the entire course can be disabled temporarily by destroying just the first obstacle, providing a way to toggle off all Agility bonuses and penalties if desired without requiring the player to rebuild the entire course later.<br />
<br />
When running the course, the player will always start at the first obstacle and then continue until they either complete all obstacles or reach an empty obstacle slot, at which point they will automatically start the course again. Each time an obstacle is completed, the player will receive XP, Mastery XP, and GP. There is no bonus for completing a full lap, although later obstacles tend to provide better rates for both GP and XP than earlier ones.<br />
<br />
Each time an obstacle is constructed, the cost to construct the same obstacle again is reduced by 4%. This bonus can stack up to 10 times for a total of a 40% reduction in cost. This can be combined with the [[Agility#Mastery Unlocks|Mastery Unlocks]] and {{ItemIcon|Agility Skillcape}} to further reduce the cost to build or rebuild an obstacle.<br />
<br />
'''Disclaimer: Time, XP/s, GP/s, and Cost columns show the base rates and don't account for bonuses or modifiers.'''<br />
<br />
{{AgilityObstacleTable}}<br />
<br />
== Passive Pillars ==<br />
Passive pillars provide global bonuses and can be purchased upon reaching {{SkillReq|{{PAGENAME}}|99}}. In order to receive the bonuses from their Passive Pillar, the player must also have an obstacle built in each of the 10 obstacle slots.<br />
<br />
{{AgilityPillarTable}}<br />
== Mastery Unlocks ==<br />
=== Obstacle Mastery Unlocks ===<br />
{{MasteryUnlocks}}<br />
<br />
=== Mastery Pool Checkpoints ===<br />
{{MasteryCheckpoints}}<br />
<br />
== Skillcape ==<br />
The [[Skillcapes|skillcape]] can be purchased from the store for {{GP|1000000}} after the player reaches {{SkillReq|{{PAGENAME}}|99}}.<br />
{{SkillcapeInfo}}<br />
<br />
== Pet ==<br />
The [[Pets|pet]] can be unlocked by completing any Agility obstacle.<br />
{{PetSkillInfo}}<br />
<br />
== Potion ==<br />
The [[Performance Enhancing Potion]] can be used to decrease the interval of Agility obstacles.<br />
{{PotionTable|Performance Enhancing Potion}}<br />
==Skill Boosts==<br />
This table lists most sources of {{PAGENAME}}-specific modifier boosts. For a list of boosts that apply to all skills, see the [[Skill Boosts]] page. This list does not contain boosts provided from {{Icon|Mastery}} rewards.<br />
{{ModifierTable|increasedSkillXP,decreasedSkillIntervalPercent,increasedSkillPreservationChance,decreasedSkillInterval,increasedChanceToDoubleItemsSkill,increasedChanceAdditionalSkillResource,increasedMasteryXP,increasedGPFromAgility,decreasedAgilityObstacleCost|{{PAGENAME}} Boosts|false|skill={{PAGENAME}}}}<br />
[[Category:Skills]]<br />
{{Menu}}</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Module:Skills/Agility&diff=48133
Module:Skills/Agility
2021-11-27T19:11:57Z
<p>Jetbent: </p>
<hr />
<div>local p = {}<br />
<br />
local SkillData = mw.loadData('Module:Skills/data')<br />
<br />
local Constants = require('Module:Constants')<br />
local Shared = require('Module:Shared')<br />
local Items = require('Module:Items')<br />
local Icons = require('Module:Icons')<br />
<br />
function p.getObstacleByID(obstID)<br />
local result = Shared.clone(SkillData.Agility.Obstacles[obstID + 1])<br />
return result<br />
end<br />
<br />
function p.getObstacle(name)<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if obst.name == name then<br />
local result = Shared.clone(obst)<br />
result.id = i - 1<br />
return result<br />
end<br />
end<br />
return nil<br />
end<br />
<br />
function p.getObstacles(checkFunc)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if checkFunc(obst) then<br />
local newObst = Shared.clone(obst)<br />
newObst.id = i - 1<br />
table.insert(result, newObst)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getPillars(checkFunc)<br />
local result = {}<br />
for i, pillar in ipairs(SkillData.Agility.Pillars) do<br />
if checkFunc(pillar) then<br />
local newPillar = Shared.clone(pillar)<br />
newPillar.id = i - 1<br />
table.insert(result, newPillar)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getObstacleCourseTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Slot!!Name!!XP!!GP!!Time!!XP/s!!GP/s'--!!XP/s!!GP/s (left comment here for posterity)<br />
result = result..'!!Bonuses!!Requirements!!Cost'<br />
<br />
local catLog = {}<br />
local Obstacles = Shared.clone(SkillData.Agility.Obstacles)<br />
table.sort(Obstacles, function(a, b) return (a.category == b.category and a.id < b.id) or a.category < b.category end)<br />
<br />
local catCounts = {}<br />
for i, obst in ipairs(Obstacles) do<br />
if catCounts[obst.category] == nil then<br />
catCounts[obst.category] = 1<br />
else<br />
catCounts[obst.category] = catCounts[obst.category] + 1<br />
end<br />
end<br />
<br />
for i, obst in ipairs(Obstacles) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'<br />
if catLog[obst.category] == nil then<br />
local rowspan = catCounts[obst.category]<br />
result = result..'rowspan="'..rowspan..'" style="border:1px solid black"|'..(obst.category + 1)..'||'<br />
catLog[obst.category] = true<br />
end<br />
result = result..obst.name<br />
<br />
--After the name & category, doing XP, GP, Time, and rates<br />
local XP = obst.completionBonuses.xp<br />
local GP = obst.completionBonuses.gp<br />
local Time = obst.interval / 1000<br />
result = result..'||'..XP..'||data-sort-value="'..GP..'"|'..Icons.GP(GP)<br />
result = result..'||data-sort-value="'..Time..'"|'..Shared.timeString(Time, true)<br />
-- Readded XP/Time and GP/Time (previously commented out)<br />
result = result..'||'..Shared.round(XP / Time, 2, 2)<br />
result = result..'||data-sort-value="'..GP/Time..'"|'..Icons.GP(Shared.round(GP/Time, 2, 2))<br />
<br />
local bonuses = {}<br />
--After that, adding the bonuses<br />
for bonusName, bonusValue in pairs(obst.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Grabbing requirements to create<br />
result = result..'||'<br />
if obst.category > 0 then<br />
result = result..Icons._SkillReq('Agility', obst.category * 10)<br />
end<br />
if obst.requirements ~= nil and obst.requirements.skillLevel ~= nil then<br />
for j, skillReq in ipairs(obst.requirements.skillLevel) do<br />
result = result..'<br/>'..Icons._SkillReq(Constants.getSkillName(skillReq[1]), skillReq[2])<br />
end<br />
end<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if obst.cost.gp > 0 then table.insert(costs, Icons.GP(obst.cost.gp)) end<br />
if obst.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(obst.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(obst.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..obst.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getPassivePillarTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Name!!Bonuses!!Cost'<br />
<br />
for i, pill in ipairs(SkillData.Agility.Pillars) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'..pill.name<br />
<br />
--After that, adding the bonuses<br />
local bonuses = {}<br />
for bonusName, bonusValue in pairs(pill.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if pill.cost.gp > 0 then table.insert(costs, Icons.GP(pill.cost.gp)) end<br />
if pill.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(pill.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(pill.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..pill.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getObstaclesForItem(itemID)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
for i, obst in ipairs(SkillData.Agility.Pillars) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
return result<br />
end<br />
<br />
return p</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Module:Skills/Agility&diff=48132
Module:Skills/Agility
2021-11-27T19:09:54Z
<p>Jetbent: Undo revision 48129 by Jetbent (talk)</p>
<hr />
<div>local p = {}<br />
<br />
local SkillData = mw.loadData('Module:Skills/data')<br />
<br />
local Constants = require('Module:Constants')<br />
local Shared = require('Module:Shared')<br />
local Items = require('Module:Items')<br />
local Icons = require('Module:Icons')<br />
<br />
function p.getObstacleByID(obstID)<br />
local result = Shared.clone(SkillData.Agility.Obstacles[obstID + 1])<br />
return result<br />
end<br />
<br />
function p.getObstacle(name)<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if obst.name == name then<br />
local result = Shared.clone(obst)<br />
result.id = i - 1<br />
return result<br />
end<br />
end<br />
return nil<br />
end<br />
<br />
function p.getObstacles(checkFunc)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if checkFunc(obst) then<br />
local newObst = Shared.clone(obst)<br />
newObst.id = i - 1<br />
table.insert(result, newObst)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getPillars(checkFunc)<br />
local result = {}<br />
for i, pillar in ipairs(SkillData.Agility.Pillars) do<br />
if checkFunc(pillar) then<br />
local newPillar = Shared.clone(pillar)<br />
newPillar.id = i - 1<br />
table.insert(result, newPillar)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getObstacleCourseTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Slot!!Name!!XP!!GP!!Time'--!!XP/s!!GP/s<br />
result = result..'!!Bonuses!!Requirements!!Cost'<br />
<br />
local catLog = {}<br />
local Obstacles = Shared.clone(SkillData.Agility.Obstacles)<br />
table.sort(Obstacles, function(a, b) return (a.category == b.category and a.id < b.id) or a.category < b.category end)<br />
<br />
local catCounts = {}<br />
for i, obst in ipairs(Obstacles) do<br />
if catCounts[obst.category] == nil then<br />
catCounts[obst.category] = 1<br />
else<br />
catCounts[obst.category] = catCounts[obst.category] + 1<br />
end<br />
end<br />
<br />
for i, obst in ipairs(Obstacles) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'<br />
if catLog[obst.category] == nil then<br />
local rowspan = catCounts[obst.category]<br />
result = result..'rowspan="'..rowspan..'" style="border:1px solid black"|'..(obst.category + 1)..'||'<br />
catLog[obst.category] = true<br />
end<br />
result = result..obst.name<br />
<br />
--After the name & category, doing XP, GP, Time, and rates<br />
local XP = obst.completionBonuses.xp<br />
local GP = obst.completionBonuses.gp<br />
local Time = obst.interval / 1000<br />
result = result..'||'..XP..'||data-sort-value="'..GP..'"|'..Icons.GP(GP)<br />
result = result..'||data-sort-value="'..Time..'"|'..Shared.timeString(Time, true)<br />
--result = result..'||'..Shared.round(XP / Time, 2, 2)<br />
--result = result..'||data-sort-value="'..GP/Time..'"|'..Icons.GP(Shared.round(GP/Time, 2, 2))<br />
<br />
local bonuses = {}<br />
--After that, adding the bonuses<br />
for bonusName, bonusValue in pairs(obst.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Grabbing requirements to create<br />
result = result..'||'<br />
if obst.category > 0 then<br />
result = result..Icons._SkillReq('Agility', obst.category * 10)<br />
end<br />
if obst.requirements ~= nil and obst.requirements.skillLevel ~= nil then<br />
for j, skillReq in ipairs(obst.requirements.skillLevel) do<br />
result = result..'<br/>'..Icons._SkillReq(Constants.getSkillName(skillReq[1]), skillReq[2])<br />
end<br />
end<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if obst.cost.gp > 0 then table.insert(costs, Icons.GP(obst.cost.gp)) end<br />
if obst.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(obst.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(obst.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..obst.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getPassivePillarTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Name!!Bonuses!!Cost'<br />
<br />
for i, pill in ipairs(SkillData.Agility.Pillars) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'..pill.name<br />
<br />
--After that, adding the bonuses<br />
local bonuses = {}<br />
for bonusName, bonusValue in pairs(pill.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if pill.cost.gp > 0 then table.insert(costs, Icons.GP(pill.cost.gp)) end<br />
if pill.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(pill.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(pill.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..pill.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getObstaclesForItem(itemID)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
for i, obst in ipairs(SkillData.Agility.Pillars) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
return result<br />
end<br />
<br />
return p</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Module:Skills/Agility&diff=48131
Module:Skills/Agility
2021-11-27T19:09:44Z
<p>Jetbent: Undo revision 48130 by Jetbent (talk)</p>
<hr />
<div>local p = {}<br />
<br />
local SkillData = mw.loadData('Module:Skills/data')<br />
<br />
local Constants = require('Module:Constants')<br />
local Shared = require('Module:Shared')<br />
local Items = require('Module:Items')<br />
local Icons = require('Module:Icons')<br />
<br />
function p.getObstacleByID(obstID)<br />
local result = Shared.clone(SkillData.Agility.Obstacles[obstID + 1])<br />
return result<br />
end<br />
<br />
function p.getObstacle(name)<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if obst.name == name then<br />
local result = Shared.clone(obst)<br />
result.id = i - 1<br />
return result<br />
end<br />
end<br />
return nil<br />
end<br />
<br />
function p.getObstacles(checkFunc)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if checkFunc(obst) then<br />
local newObst = Shared.clone(obst)<br />
newObst.id = i - 1<br />
table.insert(result, newObst)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getPillars(checkFunc)<br />
local result = {}<br />
for i, pillar in ipairs(SkillData.Agility.Pillars) do<br />
if checkFunc(pillar) then<br />
local newPillar = Shared.clone(pillar)<br />
newPillar.id = i - 1<br />
table.insert(result, newPillar)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getObstacleCourseTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Slot!!Name!!XP!!GP!!Time!!XP/s!!GP/s'--!!XP/s!!GP/s<br />
result = result..'!!Bonuses!!Requirements!!Cost'<br />
<br />
local catLog = {}<br />
local Obstacles = Shared.clone(SkillData.Agility.Obstacles)<br />
table.sort(Obstacles, function(a, b) return (a.category == b.category and a.id < b.id) or a.category < b.category end)<br />
<br />
local catCounts = {}<br />
for i, obst in ipairs(Obstacles) do<br />
if catCounts[obst.category] == nil then<br />
catCounts[obst.category] = 1<br />
else<br />
catCounts[obst.category] = catCounts[obst.category] + 1<br />
end<br />
end<br />
<br />
for i, obst in ipairs(Obstacles) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'<br />
if catLog[obst.category] == nil then<br />
local rowspan = catCounts[obst.category]<br />
result = result..'rowspan="'..rowspan..'" style="border:1px solid black"|'..(obst.category + 1)..'||'<br />
catLog[obst.category] = true<br />
end<br />
result = result..obst.name<br />
<br />
--After the name & category, doing XP, GP, Time, and rates<br />
local XP = obst.completionBonuses.xp<br />
local GP = obst.completionBonuses.gp<br />
local Time = obst.interval / 1000<br />
result = result..'||'..XP..'||data-sort-value="'..GP..'"|'..Icons.GP(GP)<br />
result = result..'||data-sort-value="'..Time..'"|'..Shared.timeString(Time, true)<br />
--result = result..'||'..Shared.round(XP / Time, 2, 2)<br />
--result = result..'||data-sort-value="'..GP/Time..'"|'..Icons.GP(Shared.round(GP/Time, 2, 2))<br />
<br />
local bonuses = {}<br />
--After that, adding the bonuses<br />
for bonusName, bonusValue in pairs(obst.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Grabbing requirements to create<br />
result = result..'||'<br />
if obst.category > 0 then<br />
result = result..Icons._SkillReq('Agility', obst.category * 10)<br />
end<br />
if obst.requirements ~= nil and obst.requirements.skillLevel ~= nil then<br />
for j, skillReq in ipairs(obst.requirements.skillLevel) do<br />
result = result..'<br/>'..Icons._SkillReq(Constants.getSkillName(skillReq[1]), skillReq[2])<br />
end<br />
end<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if obst.cost.gp > 0 then table.insert(costs, Icons.GP(obst.cost.gp)) end<br />
if obst.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(obst.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(obst.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..obst.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getPassivePillarTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Name!!Bonuses!!Cost'<br />
<br />
for i, pill in ipairs(SkillData.Agility.Pillars) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'..pill.name<br />
<br />
--After that, adding the bonuses<br />
local bonuses = {}<br />
for bonusName, bonusValue in pairs(pill.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if pill.cost.gp > 0 then table.insert(costs, Icons.GP(pill.cost.gp)) end<br />
if pill.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(pill.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(pill.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..pill.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getObstaclesForItem(itemID)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
for i, obst in ipairs(SkillData.Agility.Pillars) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
return result<br />
end<br />
<br />
return p</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Module:Skills/Agility&diff=48130
Module:Skills/Agility
2021-11-27T19:09:16Z
<p>Jetbent: </p>
<hr />
<div>local p = {}<br />
<br />
local SkillData = mw.loadData('Module:Skills/data')<br />
<br />
local Constants = require('Module:Constants')<br />
local Shared = require('Module:Shared')<br />
local Items = require('Module:Items')<br />
local Icons = require('Module:Icons')<br />
<br />
function p.getObstacleByID(obstID)<br />
local result = Shared.clone(SkillData.Agility.Obstacles[obstID + 1])<br />
return result<br />
end<br />
<br />
function p.getObstacle(name)<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if obst.name == name then<br />
local result = Shared.clone(obst)<br />
result.id = i - 1<br />
return result<br />
end<br />
end<br />
return nil<br />
end<br />
<br />
function p.getObstacles(checkFunc)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if checkFunc(obst) then<br />
local newObst = Shared.clone(obst)<br />
newObst.id = i - 1<br />
table.insert(result, newObst)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getPillars(checkFunc)<br />
local result = {}<br />
for i, pillar in ipairs(SkillData.Agility.Pillars) do<br />
if checkFunc(pillar) then<br />
local newPillar = Shared.clone(pillar)<br />
newPillar.id = i - 1<br />
table.insert(result, newPillar)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getObstacleCourseTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Slot!!Name!!XP!!GP!!Time'--!!XP/s!!GP/s<br />
result = result..'!!Bonuses!!Requirements!!Cost'<br />
<br />
local catLog = {}<br />
local Obstacles = Shared.clone(SkillData.Agility.Obstacles)<br />
table.sort(Obstacles, function(a, b) return (a.category == b.category and a.id < b.id) or a.category < b.category end)<br />
<br />
local catCounts = {}<br />
for i, obst in ipairs(Obstacles) do<br />
if catCounts[obst.category] == nil then<br />
catCounts[obst.category] = 1<br />
else<br />
catCounts[obst.category] = catCounts[obst.category] + 1<br />
end<br />
end<br />
<br />
for i, obst in ipairs(Obstacles) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'<br />
if catLog[obst.category] == nil then<br />
local rowspan = catCounts[obst.category]<br />
result = result..'rowspan="'..rowspan..'" style="border:1px solid black"|'..(obst.category + 1)..'||'<br />
catLog[obst.category] = true<br />
end<br />
result = result..obst.name<br />
<br />
--After the name & category, doing XP, GP, Time, and rates<br />
local XP = obst.completionBonuses.xp<br />
local GP = obst.completionBonuses.gp<br />
local Time = obst.interval / 1000<br />
result = result..'||'..XP..'||data-sort-value="'..GP..'"|'..Icons.GP(GP)<br />
result = result..'||data-sort-value="'..Time..'"|'..Shared.timeString(Time, true)<br />
--result = result..'||'..Shared.round(XP / Time, 2, 2)<br />
--result = result..'||data-sort-value="'..GP/Time..'"|'..Icons.GP(Shared.round(GP/Time, 2, 2))<br />
<br />
local bonuses = {}<br />
--After that, adding the bonuses<br />
for bonusName, bonusValue in pairs(obst.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Grabbing requirements to create<br />
result = result..'||'<br />
if obst.category > 0 then<br />
result = result..Icons._SkillReq('Agility', obst.category * 10)<br />
end<br />
if obst.requirements ~= nil and obst.requirements.skillLevel ~= nil then<br />
for j, skillReq in ipairs(obst.requirements.skillLevel) do<br />
result = result..'<br/>'..Icons._SkillReq(Constants.getSkillName(skillReq[1]), skillReq[2])<br />
end<br />
end<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if obst.cost.gp > 0 then table.insert(costs, Icons.GP(obst.cost.gp)) end<br />
if obst.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(obst.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(obst.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..obst.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getPassivePillarTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Name!!Bonuses!!Cost'<br />
<br />
for i, pill in ipairs(SkillData.Agility.Pillars) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'..pill.name<br />
<br />
--After that, adding the bonuses<br />
local bonuses = {}<br />
for bonusName, bonusValue in pairs(pill.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if pill.cost.gp > 0 then table.insert(costs, Icons.GP(pill.cost.gp)) end<br />
if pill.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(pill.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(pill.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..pill.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getObstaclesForItem(itemID)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
for i, obst in ipairs(SkillData.Agility.Pillars) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
return result<br />
end<br />
<br />
return p</div>
Jetbent
https://wiki.melvoridle.com/index.php?title=Module:Skills/Agility&diff=48129
Module:Skills/Agility
2021-11-27T19:08:34Z
<p>Jetbent: Added XP/s and GP/s back into the agility table (adding disclaimer on agility table page to indicate these exclude modifiers/bonuses)</p>
<hr />
<div>local p = {}<br />
<br />
local SkillData = mw.loadData('Module:Skills/data')<br />
<br />
local Constants = require('Module:Constants')<br />
local Shared = require('Module:Shared')<br />
local Items = require('Module:Items')<br />
local Icons = require('Module:Icons')<br />
<br />
function p.getObstacleByID(obstID)<br />
local result = Shared.clone(SkillData.Agility.Obstacles[obstID + 1])<br />
return result<br />
end<br />
<br />
function p.getObstacle(name)<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if obst.name == name then<br />
local result = Shared.clone(obst)<br />
result.id = i - 1<br />
return result<br />
end<br />
end<br />
return nil<br />
end<br />
<br />
function p.getObstacles(checkFunc)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
if checkFunc(obst) then<br />
local newObst = Shared.clone(obst)<br />
newObst.id = i - 1<br />
table.insert(result, newObst)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getPillars(checkFunc)<br />
local result = {}<br />
for i, pillar in ipairs(SkillData.Agility.Pillars) do<br />
if checkFunc(pillar) then<br />
local newPillar = Shared.clone(pillar)<br />
newPillar.id = i - 1<br />
table.insert(result, newPillar)<br />
end<br />
end<br />
return result<br />
end<br />
<br />
function p.getObstacleCourseTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Slot!!Name!!XP!!GP!!Time!!XP/s!!GP/s'--!!XP/s!!GP/s<br />
result = result..'!!Bonuses!!Requirements!!Cost'<br />
<br />
local catLog = {}<br />
local Obstacles = Shared.clone(SkillData.Agility.Obstacles)<br />
table.sort(Obstacles, function(a, b) return (a.category == b.category and a.id < b.id) or a.category < b.category end)<br />
<br />
local catCounts = {}<br />
for i, obst in ipairs(Obstacles) do<br />
if catCounts[obst.category] == nil then<br />
catCounts[obst.category] = 1<br />
else<br />
catCounts[obst.category] = catCounts[obst.category] + 1<br />
end<br />
end<br />
<br />
for i, obst in ipairs(Obstacles) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'<br />
if catLog[obst.category] == nil then<br />
local rowspan = catCounts[obst.category]<br />
result = result..'rowspan="'..rowspan..'" style="border:1px solid black"|'..(obst.category + 1)..'||'<br />
catLog[obst.category] = true<br />
end<br />
result = result..obst.name<br />
<br />
--After the name & category, doing XP, GP, Time, and rates<br />
local XP = obst.completionBonuses.xp<br />
local GP = obst.completionBonuses.gp<br />
local Time = obst.interval / 1000<br />
result = result..'||'..XP..'||data-sort-value="'..GP..'"|'..Icons.GP(GP)<br />
result = result..'||data-sort-value="'..Time..'"|'..Shared.timeString(Time, true)<br />
--result = result..'||'..Shared.round(XP / Time, 2, 2)<br />
--result = result..'||data-sort-value="'..GP/Time..'"|'..Icons.GP(Shared.round(GP/Time, 2, 2))<br />
<br />
local bonuses = {}<br />
--After that, adding the bonuses<br />
for bonusName, bonusValue in pairs(obst.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Grabbing requirements to create<br />
result = result..'||'<br />
if obst.category > 0 then<br />
result = result..Icons._SkillReq('Agility', obst.category * 10)<br />
end<br />
if obst.requirements ~= nil and obst.requirements.skillLevel ~= nil then<br />
for j, skillReq in ipairs(obst.requirements.skillLevel) do<br />
result = result..'<br/>'..Icons._SkillReq(Constants.getSkillName(skillReq[1]), skillReq[2])<br />
end<br />
end<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if obst.cost.gp > 0 then table.insert(costs, Icons.GP(obst.cost.gp)) end<br />
if obst.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(obst.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(obst.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..obst.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getPassivePillarTable(frame)<br />
local result = ''<br />
<br />
result = '{| class="wikitable sortable stickyHeader"'<br />
result = result..'\r\n|- class="headerRow-0"'<br />
result = result..'\r\n!Name!!Bonuses!!Cost'<br />
<br />
for i, pill in ipairs(SkillData.Agility.Pillars) do<br />
result = result..'\r\n|-'<br />
result = result..'\r\n|'..pill.name<br />
<br />
--After that, adding the bonuses<br />
local bonuses = {}<br />
for bonusName, bonusValue in pairs(pill.modifiers) do<br />
table.insert(bonuses, Constants._getModifierText(bonusName, bonusValue))<br />
end<br />
if Shared.tableCount(bonuses) == 0 then<br />
table.insert(bonuses, '<span style="color:red">None :(</span>')<br />
end<br />
result = result..'||'..table.concat(bonuses, '<br/>')<br />
<br />
--Finally, the cost<br />
local costs = {}<br />
if pill.cost.gp > 0 then table.insert(costs, Icons.GP(pill.cost.gp)) end<br />
if pill.cost.slayerCoins > 0 then table.insert(costs, Icons.SC(pill.cost.slayerCoins)) end<br />
for j, itemCost in ipairs(pill.cost.items) do<br />
local item = Items.getItemByID(itemCost[1])<br />
table.insert(costs, Icons.Icon({item.name, type='item', qty = itemCost[2], notext=true}))<br />
end<br />
result = result..'|| data-sort-value="'..pill.cost.gp..'"|'..table.concat(costs, '<br/>')<br />
end<br />
<br />
result = result..'\r\n|}'<br />
<br />
return result<br />
end<br />
<br />
function p.getObstaclesForItem(itemID)<br />
local result = {}<br />
for i, obst in ipairs(SkillData.Agility.Obstacles) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
for i, obst in ipairs(SkillData.Agility.Pillars) do<br />
for j, costLine in ipairs(obst.cost.items) do<br />
if costLine[1] == itemID then<br />
table.insert(result, obst)<br />
end<br />
end<br />
end<br />
<br />
return result<br />
end<br />
<br />
return p</div>
Jetbent