From 661aa22e417b8376e9b9d62a4b33d0b248a1a6a2 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 27 Oct 2024 20:16:48 -0600 Subject: [PATCH 01/81] Disable Random events --- Server/src/main/core/game/system/timer/impl/AntiMacro.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/core/game/system/timer/impl/AntiMacro.kt b/Server/src/main/core/game/system/timer/impl/AntiMacro.kt index 4f9ba872a..ab3c18394 100644 --- a/Server/src/main/core/game/system/timer/impl/AntiMacro.kt +++ b/Server/src/main/core/game/system/timer/impl/AntiMacro.kt @@ -16,7 +16,7 @@ import core.tools.colorize import org.json.simple.JSONObject class AntiMacro : PersistTimer(0, "antimacro", isAuto = true), Commands { - var paused = false + var paused = true var nextRandom: RandomEvents? = null override fun run(entity: Entity): Boolean { From af47ae42c17a795c73b0c12bf3f71bd4901c51d6 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 27 Oct 2024 20:22:13 -0600 Subject: [PATCH 02/81] Disabled logout timer --- Server/src/main/core/net/packet/PacketProcessor.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/core/net/packet/PacketProcessor.kt b/Server/src/main/core/net/packet/PacketProcessor.kt index ca967213c..51e4324e9 100644 --- a/Server/src/main/core/net/packet/PacketProcessor.kt +++ b/Server/src/main/core/net/packet/PacketProcessor.kt @@ -307,8 +307,8 @@ object PacketProcessor { pkt.player.interfaceManager.switchWindowMode(pkt.windowMode) } is Packet.TrackingAfkTimeout -> { - if (pkt.player.details.rights != Rights.ADMINISTRATOR) - pkt.player.packetDispatch.sendLogout() + //if (pkt.player.details.rights != Rights.ADMINISTRATOR) + //pkt.player.packetDispatch.sendLogout() } is Packet.TrackingCameraPos -> { //TODO Refactor the player monitor to be actually useful and log this From ab78bce7699097c75707e4976664745094e7959e Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 27 Oct 2024 20:24:20 -0600 Subject: [PATCH 03/81] Extend grave timers --- .../node/entity/combat/graves/GraveType.kt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Server/src/main/core/game/node/entity/combat/graves/GraveType.kt b/Server/src/main/core/game/node/entity/combat/graves/GraveType.kt index 7d4f7bc5b..f36c3ad1d 100644 --- a/Server/src/main/core/game/node/entity/combat/graves/GraveType.kt +++ b/Server/src/main/core/game/node/entity/combat/graves/GraveType.kt @@ -3,19 +3,19 @@ package core.game.node.entity.combat.graves import org.rs09.consts.NPCs enum class GraveType(val npcId: Int, val cost: Int, val durationMinutes: Int, val isMembers: Boolean, val requiredQuest: String = "", val text: String) { - MEM_PLAQUE(NPCs.GRAVE_MARKER_6565, 0, 2, false, text = "In memory of @name,
who died here."), - FLAG(NPCs.GRAVE_MARKER_6568, 50, 2, false, text = MEM_PLAQUE.text), - SMALL_GS(NPCs.GRAVESTONE_6571, 500, 2, false, text = "In loving memory of our dear friend @name,
who died in this place @mins ago."), - ORNATE_GS(NPCs.GRAVESTONE_6574, 5000, 3, false, text = SMALL_GS.text), - FONT_OF_LIFE(NPCs.GRAVESTONE_6577, 50000, 4, true, text = "In your travels,
pause awhile to remember @name,
who passed away at this spot."), - STELE(NPCs.STELE_6580, 50000, 4, true, text = FONT_OF_LIFE.text), - SARA_SYMBOL(NPCs.SARADOMIN_SYMBOL_6583, 50000, 4, true, text = "@name,
an enlightened servant of Saradomin,
perished in this place."), - ZAM_SYMBOL(NPCs.ZAMORAK_SYMBOL_6586, 50000, 4, true, text = "@name,
a most bloodthirsty follower of Zamorak,
perished in this place."), - GUTH_SYMBOL(NPCs.GUTHIX_SYMBOL_6589, 50000, 4, true, text = "@name,
who walked with the Balance of Guthix,
perished in this place."), - BAND_SYMBOL(NPCs.BANDOS_SYMBOL_6592, 50000, 4, true, requiredQuest = "Land of the Goblins", text = "@name,
a vicious warrior dedicated to Bandos,
perished in this place. "), - ARMA_SYMBOL(NPCs.ARMADYL_SYMBOL_6595, 50000, 4, true, requiredQuest = "Temple of Ikov", text = "@name,
a follower of the Law of Armadyl,
perished in this place."), - ZARO_SYMBOL(NPCs.MEMORIAL_STONE_6598, 50000, 4, true, requiredQuest = "Desert Treasure", text = "@name,
servant of the Unknown Power,
perished in this place."), - ANGEL_DEATH(NPCs.MEMORIAL_STONE_6601, 500000, 5, true, text = "Ye frail mortals who gaze upon this sight,
forget not the fate of @name, once mighty, now
surrendered to the inescapable grasp of destiny.
Requiescat in pace."); + MEM_PLAQUE(NPCs.GRAVE_MARKER_6565, 0, 5, false, text = "In memory of @name,
who died here."), + FLAG(NPCs.GRAVE_MARKER_6568, 50, 10, false, text = MEM_PLAQUE.text), + SMALL_GS(NPCs.GRAVESTONE_6571, 500, 15, false, text = "In loving memory of our dear friend @name,
who died in this place @mins ago."), + ORNATE_GS(NPCs.GRAVESTONE_6574, 5000, 30, false, text = SMALL_GS.text), + FONT_OF_LIFE(NPCs.GRAVESTONE_6577, 50000, 45, true, text = "In your travels,
pause awhile to remember @name,
who passed away at this spot."), + STELE(NPCs.STELE_6580, 50000, 45, true, text = FONT_OF_LIFE.text), + SARA_SYMBOL(NPCs.SARADOMIN_SYMBOL_6583, 50000, 45, true, text = "@name,
an enlightened servant of Saradomin,
perished in this place."), + ZAM_SYMBOL(NPCs.ZAMORAK_SYMBOL_6586, 50000, 45, true, text = "@name,
a most bloodthirsty follower of Zamorak,
perished in this place."), + GUTH_SYMBOL(NPCs.GUTHIX_SYMBOL_6589, 50000, 45, true, text = "@name,
who walked with the Balance of Guthix,
perished in this place."), + BAND_SYMBOL(NPCs.BANDOS_SYMBOL_6592, 50000, 45, true, requiredQuest = "Land of the Goblins", text = "@name,
a vicious warrior dedicated to Bandos,
perished in this place. "), + ARMA_SYMBOL(NPCs.ARMADYL_SYMBOL_6595, 50000, 45, true, requiredQuest = "Temple of Ikov", text = "@name,
a follower of the Law of Armadyl,
perished in this place."), + ZARO_SYMBOL(NPCs.MEMORIAL_STONE_6598, 50000, 45, true, requiredQuest = "Desert Treasure", text = "@name,
servant of the Unknown Power,
perished in this place."), + ANGEL_DEATH(NPCs.MEMORIAL_STONE_6601, 500000, 60, true, text = "Ye frail mortals who gaze upon this sight,
forget not the fate of @name, once mighty, now
surrendered to the inescapable grasp of destiny.
Requiescat in pace."); companion object { val ids = values().fold(ArrayList()) {list, type -> From ea980fe909a10906d00aa8e9f8cf3e4b83f3c450 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 27 Oct 2024 20:41:11 -0600 Subject: [PATCH 04/81] Updating Smithing levels Each item's smithing level requirement has been lowered to match the level required to smith that bar. Adamant and Rune are lowered to 60 and 70 respectively. --- .../content/global/skill/smithing/Bars.java | 304 +++++++++--------- 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/Server/src/main/content/global/skill/smithing/Bars.java b/Server/src/main/content/global/skill/smithing/Bars.java index 7514693fe..0c8c36181 100644 --- a/Server/src/main/content/global/skill/smithing/Bars.java +++ b/Server/src/main/content/global/skill/smithing/Bars.java @@ -26,122 +26,122 @@ public enum Bars { /** * Bronze Mace */ - BRONZE_MACE(BarType.BRONZE, SmithingType.TYPE_MACE, 1422, 2), + BRONZE_MACE(BarType.BRONZE, SmithingType.TYPE_MACE, 1422, 1), /** * Bronze Medium helm */ - BRONZE_MED_HELM(BarType.BRONZE, SmithingType.TYPE_MEDIUM_HELM, 1139, 3), + BRONZE_MED_HELM(BarType.BRONZE, SmithingType.TYPE_MEDIUM_HELM, 1139, 1), /** * Bronze Crossbow Bolt */ - BRONZE_CROSSBOW_BOLT(BarType.BRONZE, SmithingType.TYPE_CROSSBOW_BOLT, 9375, 3), + BRONZE_CROSSBOW_BOLT(BarType.BRONZE, SmithingType.TYPE_CROSSBOW_BOLT, 9375, 1), /** * Bronze Sword */ - BRONZE_SWORD(BarType.BRONZE, SmithingType.TYPE_SWORD, 1277, 4), + BRONZE_SWORD(BarType.BRONZE, SmithingType.TYPE_SWORD, 1277, 1), /** * Bronze Dart Tips */ - BRONZE_DART_TIPS(BarType.BRONZE, SmithingType.TYPE_DART_TIP, 819, 4), + BRONZE_DART_TIPS(BarType.BRONZE, SmithingType.TYPE_DART_TIP, 819, 1), /** * Bronze Nails */ - BRONZE_NAILS(BarType.BRONZE, SmithingType.TYPE_NAIL, 4819, 4), + BRONZE_NAILS(BarType.BRONZE, SmithingType.TYPE_NAIL, 4819, 1), /** * Bronze Wire */ - BRONZE_WIRE(BarType.BRONZE, SmithingType.TYPE_WIRE, 1794, 4), + BRONZE_WIRE(BarType.BRONZE, SmithingType.TYPE_WIRE, 1794, 1), /** * Bronze Arrow Tips */ - BRONZE_ARROW_TIPS(BarType.BRONZE, SmithingType.TYPE_ARROW_TIP, 39, 5), + BRONZE_ARROW_TIPS(BarType.BRONZE, SmithingType.TYPE_ARROW_TIP, 39, 1), /** * Bronze Scimitar */ - BRONZE_SCIMITAR(BarType.BRONZE, SmithingType.TYPE_SCIMITAR, 1321, 5), + BRONZE_SCIMITAR(BarType.BRONZE, SmithingType.TYPE_SCIMITAR, 1321, 1), /** * Bronze Crossbow Limbs */ - BRONZE_CROSSBOW_LIMBS(BarType.BRONZE, SmithingType.TYPE_CROSSBOW_LIMB, 9420, 6), + BRONZE_CROSSBOW_LIMBS(BarType.BRONZE, SmithingType.TYPE_CROSSBOW_LIMB, 9420, 1), /** * Bronze longsword */ - BRONZE_LONGSWORD(BarType.BRONZE, SmithingType.TYPE_LONGSWORD, 1291, 6), + BRONZE_LONGSWORD(BarType.BRONZE, SmithingType.TYPE_LONGSWORD, 1291, 1), /** * Bronze ThrowingKnife */ - BRONZE_THROWINGKNFIE(BarType.BRONZE, SmithingType.TYPE_THROWING_KNIFE, 864, 7), + BRONZE_THROWINGKNFIE(BarType.BRONZE, SmithingType.TYPE_THROWING_KNIFE, 864, 1), /** * Bronze Full helmet */ - BRONZE_FULL_HELM(BarType.BRONZE, SmithingType.TYPE_FULL_HELM, 1155, 7), + BRONZE_FULL_HELM(BarType.BRONZE, SmithingType.TYPE_FULL_HELM, 1155, 1), /** * Bronze Square Shield */ - BRONZE_SQUARE_SHIELD(BarType.BRONZE, SmithingType.TYPE_SQUARE_SHIELD, 1173, 8), + BRONZE_SQUARE_SHIELD(BarType.BRONZE, SmithingType.TYPE_SQUARE_SHIELD, 1173, 1), /** * Bronze Warhammer */ - BRONZE_WAR_HAMMER(BarType.BRONZE, SmithingType.TYPE_WARHAMMER, 1337, 9), + BRONZE_WAR_HAMMER(BarType.BRONZE, SmithingType.TYPE_WARHAMMER, 1337, 1), /** * Bronze BattleAxe */ - BRONZE_BATTLEAXE(BarType.BRONZE, SmithingType.TYPE_BATTLE_AXE, 1375, 10), + BRONZE_BATTLEAXE(BarType.BRONZE, SmithingType.TYPE_BATTLE_AXE, 1375, 1), /** * Bronze ChainBody */ - BRONZE_CHAINBODY(BarType.BRONZE, SmithingType.TYPE_CHAINBODY, 1103, 11), + BRONZE_CHAINBODY(BarType.BRONZE, SmithingType.TYPE_CHAINBODY, 1103, 1), /** * Bronze KitShield */ - BRONZE_KITESHIELD(BarType.BRONZE, SmithingType.TYPE_KITE_SHIELD, 1189, 12), + BRONZE_KITESHIELD(BarType.BRONZE, SmithingType.TYPE_KITE_SHIELD, 1189, 1), /** * Bronze Claws */ - BRONZE_CLAWS(BarType.BRONZE, SmithingType.TYPE_CLAWS, 3095, 13), + BRONZE_CLAWS(BarType.BRONZE, SmithingType.TYPE_CLAWS, 3095, 1), /** * Bronze 2h */ - BRONZE_TWO_HANDED(BarType.BRONZE, SmithingType.TYPE_TWO_HAND_SWORD, 1307, 14), + BRONZE_TWO_HANDED(BarType.BRONZE, SmithingType.TYPE_TWO_HAND_SWORD, 1307, 1), /** * Bronze PlateSkirt */ - BRONZE_PLATE_SKIRT(BarType.BRONZE, SmithingType.TYPE_PLATE_SKIRT, 1087, 16), + BRONZE_PLATE_SKIRT(BarType.BRONZE, SmithingType.TYPE_PLATE_SKIRT, 1087, 1), /** * Bronze PlateLegs */ - BRONZE_PLATELEGS(BarType.BRONZE, SmithingType.TYPE_PLATELEG, 1075, 16), + BRONZE_PLATELEGS(BarType.BRONZE, SmithingType.TYPE_PLATELEG, 1075, 1), /** * Bronze PlateBody */ - BRONZE_PLATEBODY(BarType.BRONZE, SmithingType.TYPE_PLATEBODY, 1117, 18), + BRONZE_PLATEBODY(BarType.BRONZE, SmithingType.TYPE_PLATEBODY, 1117, 1), /** * Bronze Pickaxe */ - BRONZE_PICKAXE(BarType.BRONZE, SmithingType.TYPE_PICKAXE, 1265, 5), + BRONZE_PICKAXE(BarType.BRONZE, SmithingType.TYPE_PICKAXE, 1265, 1), /** * Iron Dagger @@ -151,131 +151,131 @@ public enum Bars { /** * Iron Hatchet */ - IRON_AXE(BarType.IRON, SmithingType.TYPE_AXE, 1349, 16), + IRON_AXE(BarType.IRON, SmithingType.TYPE_AXE, 1349, 15), /** * Iron Mace */ - IRON_MACE(BarType.IRON, SmithingType.TYPE_MACE, 1420, 17), + IRON_MACE(BarType.IRON, SmithingType.TYPE_MACE, 1420, 15), /** * Iron Med Helm */ - IRON_MED_HELM(BarType.IRON, SmithingType.TYPE_MEDIUM_HELM, 1137, 18), + IRON_MED_HELM(BarType.IRON, SmithingType.TYPE_MEDIUM_HELM, 1137, 15), /** * Iron Bolt */ - IRON_BOLT(BarType.IRON, SmithingType.TYPE_CROSSBOW_BOLT, 9377, 18), + IRON_BOLT(BarType.IRON, SmithingType.TYPE_CROSSBOW_BOLT, 9377, 15), /** * Iron Sword */ - IRON_SWORD(BarType.IRON, SmithingType.TYPE_SWORD, 1279, 19), + IRON_SWORD(BarType.IRON, SmithingType.TYPE_SWORD, 1279, 15), /** * Iron Dart Tips */ - IRON_DART_TIPS(BarType.IRON, SmithingType.TYPE_DART_TIP, 820, 19), + IRON_DART_TIPS(BarType.IRON, SmithingType.TYPE_DART_TIP, 820, 15), /** * Iron Nails */ - IRON_NAILS(BarType.IRON, SmithingType.TYPE_NAIL, 4820, 19), + IRON_NAILS(BarType.IRON, SmithingType.TYPE_NAIL, 4820, 15), /** * Iron Split */ - IRON_SPIT(BarType.IRON, SmithingType.TYPE_SPIT_IRON, 7225, 16), + IRON_SPIT(BarType.IRON, SmithingType.TYPE_SPIT_IRON, 7225, 15), /** * Iron Arrow Tips */ - IRON_ARROW_TIPS(BarType.IRON, SmithingType.TYPE_ARROW_TIP, 40, 20), + IRON_ARROW_TIPS(BarType.IRON, SmithingType.TYPE_ARROW_TIP, 40, 15), /** * Iron Scimitar */ - IRON_SCIMITAR(BarType.IRON, SmithingType.TYPE_SCIMITAR, 1323, 20), + IRON_SCIMITAR(BarType.IRON, SmithingType.TYPE_SCIMITAR, 1323, 15), /** * Iron Crossbow Limbs */ - IRON_CROSSBOW_LimbS(BarType.IRON, SmithingType.TYPE_CROSSBOW_LIMB, 9423, 23), + IRON_CROSSBOW_LimbS(BarType.IRON, SmithingType.TYPE_CROSSBOW_LIMB, 9423, 15), /** * Iron LongSword */ - IRON_LONGSWORD(BarType.IRON, SmithingType.TYPE_LONGSWORD, 1293, 21), + IRON_LONGSWORD(BarType.IRON, SmithingType.TYPE_LONGSWORD, 1293, 15), /** * Iron Knife */ - IRON_KNIFE(BarType.IRON, SmithingType.TYPE_THROWING_KNIFE, 863, 22), + IRON_KNIFE(BarType.IRON, SmithingType.TYPE_THROWING_KNIFE, 863, 15), /** * Iron Full Helm */ - IRON_FULL_HELM(BarType.IRON, SmithingType.TYPE_FULL_HELM, 1153, 22), + IRON_FULL_HELM(BarType.IRON, SmithingType.TYPE_FULL_HELM, 1153, 15), /** * Iron Square Shield */ - IRON_SQUARE_SHIELD(BarType.IRON, SmithingType.TYPE_SQUARE_SHIELD, 1175, 23), + IRON_SQUARE_SHIELD(BarType.IRON, SmithingType.TYPE_SQUARE_SHIELD, 1175, 15), /** * Oil Lantern Frame */ - OIL_LANTERN_FRAME(BarType.IRON, SmithingType.TYPE_OIL_LANTERN, 4540, 26), + OIL_LANTERN_FRAME(BarType.IRON, SmithingType.TYPE_OIL_LANTERN, 4540, 15), /** * Iron WarHammer */ - IRON_WARHAMMER(BarType.IRON, SmithingType.TYPE_WARHAMMER, 1335, 24), + IRON_WARHAMMER(BarType.IRON, SmithingType.TYPE_WARHAMMER, 1335, 15), /** * Iron Battleaxe */ - IRON_BATTLEAXE(BarType.IRON, SmithingType.TYPE_BATTLE_AXE, 1363, 25), + IRON_BATTLEAXE(BarType.IRON, SmithingType.TYPE_BATTLE_AXE, 1363, 15), /** * Iron ChainBody */ - IRON_CHAINBODY(BarType.IRON, SmithingType.TYPE_CHAINBODY, 1101, 26), + IRON_CHAINBODY(BarType.IRON, SmithingType.TYPE_CHAINBODY, 1101, 15), /** * Iron Kite Shield */ - IRON_KITE_SHIELD(BarType.IRON, SmithingType.TYPE_KITE_SHIELD, 1191, 27), + IRON_KITE_SHIELD(BarType.IRON, SmithingType.TYPE_KITE_SHIELD, 1191, 15), /** * Iron Claws */ - IRON_CLAWS(BarType.IRON, SmithingType.TYPE_CLAWS, 3096, 28), + IRON_CLAWS(BarType.IRON, SmithingType.TYPE_CLAWS, 3096, 15), /** * Iron 2H */ - IRON_TWO_HANDED_SWORD(BarType.IRON, SmithingType.TYPE_TWO_HAND_SWORD, 1309, 29), + IRON_TWO_HANDED_SWORD(BarType.IRON, SmithingType.TYPE_TWO_HAND_SWORD, 1309, 15), /** * Iron PlateSkirt */ - IRON_PLATESKIRT(BarType.IRON, SmithingType.TYPE_PLATE_SKIRT, 1081, 31), + IRON_PLATESKIRT(BarType.IRON, SmithingType.TYPE_PLATE_SKIRT, 1081, 15), /** * Iron PlateLegs */ - IRON_PLATELEGS(BarType.IRON, SmithingType.TYPE_PLATELEG, 1067, 31), + IRON_PLATELEGS(BarType.IRON, SmithingType.TYPE_PLATELEG, 1067, 15), /** * Iron PlateBody */ - IRON_PLATEBODY(BarType.IRON, SmithingType.TYPE_PLATEBODY, 1115, 33), + IRON_PLATEBODY(BarType.IRON, SmithingType.TYPE_PLATEBODY, 1115, 15), /** * Iron PickAxe */ - IRON_PICKAXE(BarType.IRON, SmithingType.TYPE_PICKAXE, 1267, 20), + IRON_PICKAXE(BarType.IRON, SmithingType.TYPE_PICKAXE, 1267, 15), /** * Steel Dagger @@ -285,132 +285,132 @@ public enum Bars { /** * Steel Axe */ - STEEL_AXE(BarType.STEEL, SmithingType.TYPE_AXE, 1353, 31), + STEEL_AXE(BarType.STEEL, SmithingType.TYPE_AXE, 1353, 30), /** * Steel Mace */ - STEEL_MACE(BarType.STEEL, SmithingType.TYPE_MACE, 1424, 32), + STEEL_MACE(BarType.STEEL, SmithingType.TYPE_MACE, 1424, 30), /** * Steel Medium Helm */ - STEEL_MED_HELM(BarType.STEEL, SmithingType.TYPE_MEDIUM_HELM, 1141, 33), + STEEL_MED_HELM(BarType.STEEL, SmithingType.TYPE_MEDIUM_HELM, 1141, 30), /** * Steel CrossBow bolts */ - STEEL_CROSSBOW_BOLT(BarType.STEEL, SmithingType.TYPE_CROSSBOW_BOLT, 9378, 33), + STEEL_CROSSBOW_BOLT(BarType.STEEL, SmithingType.TYPE_CROSSBOW_BOLT, 9378, 30), /** * Steel Sword */ - STEEL_SWORD(BarType.STEEL, SmithingType.TYPE_SWORD, 1281, 34), + STEEL_SWORD(BarType.STEEL, SmithingType.TYPE_SWORD, 1281, 30), /** * Steel Dart Tips */ - STEEL_DART_TIPS(BarType.STEEL, SmithingType.TYPE_DART_TIP, 821, 34), + STEEL_DART_TIPS(BarType.STEEL, SmithingType.TYPE_DART_TIP, 821, 30), /** * Steel Nails */ - STEEL_NAILS(BarType.STEEL, SmithingType.TYPE_NAIL, 1539, 34), + STEEL_NAILS(BarType.STEEL, SmithingType.TYPE_NAIL, 1539, 30), /** * Steel ArrowTips */ - STEEL_ARROW_TIPS(BarType.STEEL, SmithingType.TYPE_ARROW_TIP, 41, 35), + STEEL_ARROW_TIPS(BarType.STEEL, SmithingType.TYPE_ARROW_TIP, 41, 30), /** * Steel Scimitar */ - STEEL_SCIMITAR(BarType.STEEL, SmithingType.TYPE_SCIMITAR, 1325, 35), + STEEL_SCIMITAR(BarType.STEEL, SmithingType.TYPE_SCIMITAR, 1325, 30), /** * Steel Crossbow Limbs */ - STEEL_CROSSBOW_LIMBS(BarType.STEEL, SmithingType.TYPE_CROSSBOW_LIMB, 9425, 36), + STEEL_CROSSBOW_LIMBS(BarType.STEEL, SmithingType.TYPE_CROSSBOW_LIMB, 9425, 30), /** * Steel LongSword */ - STEEL_LONGSWORD(BarType.STEEL, SmithingType.TYPE_LONGSWORD, 1295, 36), + STEEL_LONGSWORD(BarType.STEEL, SmithingType.TYPE_LONGSWORD, 1295, 30), /** * Steel Knife */ - STEEL_THROWING_KNIFE(BarType.STEEL, SmithingType.TYPE_THROWING_KNIFE, 865, 37), + STEEL_THROWING_KNIFE(BarType.STEEL, SmithingType.TYPE_THROWING_KNIFE, 865, 30), /** * Steel Full Helm */ - STEEL_FULL_HELM(BarType.STEEL, SmithingType.TYPE_FULL_HELM, 1157, 37), + STEEL_FULL_HELM(BarType.STEEL, SmithingType.TYPE_FULL_HELM, 1157, 30), /** * Steel Studs */ - STEEL_STUDS(BarType.STEEL, SmithingType.TYPE_STUDS, 2370, 36), + STEEL_STUDS(BarType.STEEL, SmithingType.TYPE_STUDS, 2370, 30), /** * Steel Square Shield */ - STEEL_SQUARE_SHIELD(BarType.STEEL, SmithingType.TYPE_SQUARE_SHIELD, 1177, 38), + STEEL_SQUARE_SHIELD(BarType.STEEL, SmithingType.TYPE_SQUARE_SHIELD, 1177, 30), /** * Steel Lantern */ - STEEL_BULLSEYE(BarType.STEEL, SmithingType.TYPE_BULLSEYE, 4544, 49), + STEEL_BULLSEYE(BarType.STEEL, SmithingType.TYPE_BULLSEYE, 4544, 30), /** * Steel WarHammer */ - STEEL_WARHAMMER(BarType.STEEL, SmithingType.TYPE_WARHAMMER, 1339, 39), + STEEL_WARHAMMER(BarType.STEEL, SmithingType.TYPE_WARHAMMER, 1339, 30), /** * Steel battle axe */ - STEEL_BATTLE_AXE(BarType.STEEL, SmithingType.TYPE_BATTLE_AXE, 1365, 40), + STEEL_BATTLE_AXE(BarType.STEEL, SmithingType.TYPE_BATTLE_AXE, 1365, 30), /** * Steel ChainBody */ - STEEL_CHAINBODY(BarType.STEEL, SmithingType.TYPE_CHAINBODY, 1105, 41), + STEEL_CHAINBODY(BarType.STEEL, SmithingType.TYPE_CHAINBODY, 1105, 30), /** * Steel Kite Shield */ - STEEL_KITE_SHIELD(BarType.STEEL, SmithingType.TYPE_KITE_SHIELD, 1193, 42), + STEEL_KITE_SHIELD(BarType.STEEL, SmithingType.TYPE_KITE_SHIELD, 1193, 30), /** * Steel Claws */ - STEEL_CLAWS(BarType.STEEL, SmithingType.TYPE_CLAWS, 3097, 43), + STEEL_CLAWS(BarType.STEEL, SmithingType.TYPE_CLAWS, 3097, 30), /** * Steel 2h */ - STEEL_TWO_HANDED_SWORD(BarType.STEEL, SmithingType.TYPE_TWO_HAND_SWORD, 1311, 44), + STEEL_TWO_HANDED_SWORD(BarType.STEEL, SmithingType.TYPE_TWO_HAND_SWORD, 1311, 30), /** * Steel plate skirt */ - STEEL_PLATE_SKIRT(BarType.STEEL, SmithingType.TYPE_PLATE_SKIRT, 1083, 46), + STEEL_PLATE_SKIRT(BarType.STEEL, SmithingType.TYPE_PLATE_SKIRT, 1083, 30), /** * Steel platelegs */ - STEEL_PLATELEGS(BarType.STEEL, SmithingType.TYPE_PLATELEG, 1069, 46), + STEEL_PLATELEGS(BarType.STEEL, SmithingType.TYPE_PLATELEG, 1069, 30), /** * Steel platebody */ - STEEL_PLATEBODY(BarType.STEEL, SmithingType.TYPE_PLATEBODY, 1119, 48), + STEEL_PLATEBODY(BarType.STEEL, SmithingType.TYPE_PLATEBODY, 1119, 30), /** * Steel pickaxe */ - STEEL_PICKAXE(BarType.STEEL, SmithingType.TYPE_PICKAXE, 1269, 35), + STEEL_PICKAXE(BarType.STEEL, SmithingType.TYPE_PICKAXE, 1269, 30), /** * Mithril Dagger @@ -420,377 +420,377 @@ public enum Bars { /** * Mithril Hatchet */ - MITHRIL_HATCHET(BarType.MITHRIL, SmithingType.TYPE_AXE, 1355, 51), + MITHRIL_HATCHET(BarType.MITHRIL, SmithingType.TYPE_AXE, 1355, 50), /** * Mithril Mace */ - MITHRIL_MACE(BarType.MITHRIL, SmithingType.TYPE_MACE, 1428, 52), + MITHRIL_MACE(BarType.MITHRIL, SmithingType.TYPE_MACE, 1428, 50), /** * Mithril Med Helm */ - MITHRIL_MED_HELM(BarType.MITHRIL, SmithingType.TYPE_MEDIUM_HELM, 1143, 53), + MITHRIL_MED_HELM(BarType.MITHRIL, SmithingType.TYPE_MEDIUM_HELM, 1143, 50), /** * Mithril Crossbow Bolt */ - MITHRIL_CROSSBOW_BOLT(BarType.MITHRIL, SmithingType.TYPE_CROSSBOW_BOLT, 9379, 53), + MITHRIL_CROSSBOW_BOLT(BarType.MITHRIL, SmithingType.TYPE_CROSSBOW_BOLT, 9379, 50), /** * Mithril Sword */ - MITHRIL_SWORD(BarType.MITHRIL, SmithingType.TYPE_SWORD, 1285, 54), + MITHRIL_SWORD(BarType.MITHRIL, SmithingType.TYPE_SWORD, 1285, 50), /** * Mithril Dart Tips */ - MITHRIL_DART_TIPS(BarType.MITHRIL, SmithingType.TYPE_DART_TIP, 822, 54), + MITHRIL_DART_TIPS(BarType.MITHRIL, SmithingType.TYPE_DART_TIP, 822, 50), /** * Mithril Nails */ - MITHRIL_NAILS(BarType.MITHRIL, SmithingType.TYPE_NAIL, 4822, 54), + MITHRIL_NAILS(BarType.MITHRIL, SmithingType.TYPE_NAIL, 4822, 50), /** * Mithril Arrow Tips */ - MITHRIL_ARROW_TIPS(BarType.MITHRIL, SmithingType.TYPE_ARROW_TIP, 42, 55), + MITHRIL_ARROW_TIPS(BarType.MITHRIL, SmithingType.TYPE_ARROW_TIP, 42, 50), /** * Mithril Scimitar */ - MITHRIL_SCIMITAR(BarType.MITHRIL, SmithingType.TYPE_SCIMITAR, 1329, 55), + MITHRIL_SCIMITAR(BarType.MITHRIL, SmithingType.TYPE_SCIMITAR, 1329, 50), /** * Mithril Crossbow Limbs */ - MITHRIL_CROSSBOW_LIMBS(BarType.MITHRIL, SmithingType.TYPE_CROSSBOW_LIMB, 9427, 56), + MITHRIL_CROSSBOW_LIMBS(BarType.MITHRIL, SmithingType.TYPE_CROSSBOW_LIMB, 9427, 50), /** * Mithril LongSword */ - MITHRIL_LONGSWORD(BarType.MITHRIL, SmithingType.TYPE_LONGSWORD, 1299, 56), + MITHRIL_LONGSWORD(BarType.MITHRIL, SmithingType.TYPE_LONGSWORD, 1299, 50), /** * Mithril Knife */ - MITHRIL_KNIFE(BarType.MITHRIL, SmithingType.TYPE_THROWING_KNIFE, 866, 57), + MITHRIL_KNIFE(BarType.MITHRIL, SmithingType.TYPE_THROWING_KNIFE, 866, 50), /** * Mithril Full Helm */ - MITHRIL_FULL_HELM(BarType.MITHRIL, SmithingType.TYPE_FULL_HELM, 1159, 57), + MITHRIL_FULL_HELM(BarType.MITHRIL, SmithingType.TYPE_FULL_HELM, 1159, 50), /** * Mithril SquareShield */ - MITHRIL_SQUARE_SHIELD(BarType.MITHRIL, SmithingType.TYPE_SQUARE_SHIELD, 1181, 58), + MITHRIL_SQUARE_SHIELD(BarType.MITHRIL, SmithingType.TYPE_SQUARE_SHIELD, 1181, 50), /** * Mithril Grapple Tips */ - MITHRIL_GRAPPLE_TIPS(BarType.MITHRIL, SmithingType.TYPE_GRAPPLE_TIP, 9416, 59), + MITHRIL_GRAPPLE_TIPS(BarType.MITHRIL, SmithingType.TYPE_GRAPPLE_TIP, 9416, 50), /** * Mithril Warhammer */ - MITHRIL_WARHAMMER(BarType.MITHRIL, SmithingType.TYPE_WARHAMMER, 1343, 59), + MITHRIL_WARHAMMER(BarType.MITHRIL, SmithingType.TYPE_WARHAMMER, 1343, 50), /** * Mithril BattleAxe */ - MITHRIL_BATTLEAXE(BarType.MITHRIL, SmithingType.TYPE_BATTLE_AXE, 1369, 60), + MITHRIL_BATTLEAXE(BarType.MITHRIL, SmithingType.TYPE_BATTLE_AXE, 1369, 50), /** * Mithril ChainBody */ - MITHRIL_CHAINBODY(BarType.MITHRIL, SmithingType.TYPE_CHAINBODY, 1109, 61), + MITHRIL_CHAINBODY(BarType.MITHRIL, SmithingType.TYPE_CHAINBODY, 1109, 50), /** * Mithril KiteShield */ - MITHRIL_KITE_SHIELD(BarType.MITHRIL, SmithingType.TYPE_KITE_SHIELD, 1197, 62), + MITHRIL_KITE_SHIELD(BarType.MITHRIL, SmithingType.TYPE_KITE_SHIELD, 1197, 50), /** * Mithril Claws */ - MITHRIL_CLAWS(BarType.MITHRIL, SmithingType.TYPE_CLAWS, 3099, 63), + MITHRIL_CLAWS(BarType.MITHRIL, SmithingType.TYPE_CLAWS, 3099, 50), /** * Mithril 2H */ - MITHRIL_TWO_HANDED_SWORD(BarType.MITHRIL, SmithingType.TYPE_TWO_HAND_SWORD, 1315, 64), + MITHRIL_TWO_HANDED_SWORD(BarType.MITHRIL, SmithingType.TYPE_TWO_HAND_SWORD, 1315, 50), /** * Mithril PlateSkirt */ - MITHRIL_PLATESKIRT(BarType.MITHRIL, SmithingType.TYPE_PLATE_SKIRT, 1085, 66), + MITHRIL_PLATESKIRT(BarType.MITHRIL, SmithingType.TYPE_PLATE_SKIRT, 1085, 50), /** * Mithril PlateLegs */ - MITHRIL_PLATELEGS(BarType.MITHRIL, SmithingType.TYPE_PLATELEG, 1071, 66), + MITHRIL_PLATELEGS(BarType.MITHRIL, SmithingType.TYPE_PLATELEG, 1071, 50), /** * Mithril PlateBody */ - MITHRIL_PLATEBODY(BarType.MITHRIL, SmithingType.TYPE_PLATEBODY, 1121, 68), + MITHRIL_PLATEBODY(BarType.MITHRIL, SmithingType.TYPE_PLATEBODY, 1121, 50), /** * Mithril PickAxe */ - MITHRIL_PICKAXE(BarType.MITHRIL, SmithingType.TYPE_PICKAXE, 1273, 55), + MITHRIL_PICKAXE(BarType.MITHRIL, SmithingType.TYPE_PICKAXE, 1273, 50), /** * Adamant Dagger */ - ADAMANT_DAGGER(BarType.ADAMANT, SmithingType.TYPE_DAGGER, 1211, 70), + ADAMANT_DAGGER(BarType.ADAMANT, SmithingType.TYPE_DAGGER, 1211, 60), /** * Adamant Hatchet */ - ADAMANT_AXE(BarType.ADAMANT, SmithingType.TYPE_AXE, 1357, 71), + ADAMANT_AXE(BarType.ADAMANT, SmithingType.TYPE_AXE, 1357, 60), /** * Adamant Mace */ - ADAMANT_MACE(BarType.ADAMANT, SmithingType.TYPE_MACE, 1430, 72), + ADAMANT_MACE(BarType.ADAMANT, SmithingType.TYPE_MACE, 1430, 60), /** * Adamant Med Helm */ - ADAMANT_MEDIUM_HELM(BarType.ADAMANT, SmithingType.TYPE_MEDIUM_HELM, 1145, 73), + ADAMANT_MEDIUM_HELM(BarType.ADAMANT, SmithingType.TYPE_MEDIUM_HELM, 1145, 60), /** * Adamant Crossbow Bolt */ - ADAMANT_BOLT(BarType.ADAMANT, SmithingType.TYPE_CROSSBOW_BOLT, 9380, 73), + ADAMANT_BOLT(BarType.ADAMANT, SmithingType.TYPE_CROSSBOW_BOLT, 9380, 60), /** * Adamant Sword */ - ADAMANT_SWORD(BarType.ADAMANT, SmithingType.TYPE_SWORD, 1287, 74), + ADAMANT_SWORD(BarType.ADAMANT, SmithingType.TYPE_SWORD, 1287, 60), /** * Adamant Dart Tips */ - ADAMANT_DART_TIPS(BarType.ADAMANT, SmithingType.TYPE_DART_TIP, 823, 74), + ADAMANT_DART_TIPS(BarType.ADAMANT, SmithingType.TYPE_DART_TIP, 823, 60), /** * Adamant Nails */ - ADAMANT_NAILS(BarType.ADAMANT, SmithingType.TYPE_NAIL, 4823, 74), + ADAMANT_NAILS(BarType.ADAMANT, SmithingType.TYPE_NAIL, 4823, 60), /** * Adamant Arrow Tips */ - ADAMANT_ARROW_TIPS(BarType.ADAMANT, SmithingType.TYPE_ARROW_TIP, 43, 75), + ADAMANT_ARROW_TIPS(BarType.ADAMANT, SmithingType.TYPE_ARROW_TIP, 43, 60), /** * Adamant Scmitar */ - ADAMANT_SCIMITAR(BarType.ADAMANT, SmithingType.TYPE_SCIMITAR, 1331, 75), + ADAMANT_SCIMITAR(BarType.ADAMANT, SmithingType.TYPE_SCIMITAR, 1331, 60), /** * Adamant Crossbow Limbs */ - ADAMANT_LIMBS(BarType.ADAMANT, SmithingType.TYPE_CROSSBOW_LIMB, 9429, 76), + ADAMANT_LIMBS(BarType.ADAMANT, SmithingType.TYPE_CROSSBOW_LIMB, 9429, 60), /** * Adamant LongSword */ - ADAMANT_LONGSWORD(BarType.ADAMANT, SmithingType.TYPE_LONGSWORD, 1301, 76), + ADAMANT_LONGSWORD(BarType.ADAMANT, SmithingType.TYPE_LONGSWORD, 1301, 60), /** * Adamant Knife */ - ADAMANT_KNIFE(BarType.ADAMANT, SmithingType.TYPE_THROWING_KNIFE, 867, 77), + ADAMANT_KNIFE(BarType.ADAMANT, SmithingType.TYPE_THROWING_KNIFE, 867, 60), /** * Adamant Full Helm */ - ADAMANT_FULL_HELM(BarType.ADAMANT, SmithingType.TYPE_FULL_HELM, 1161, 77), + ADAMANT_FULL_HELM(BarType.ADAMANT, SmithingType.TYPE_FULL_HELM, 1161, 60), /** * Adamant Square Shield */ - ADAMANT_SQUARE_SHIELD(BarType.ADAMANT, SmithingType.TYPE_SQUARE_SHIELD, 1183, 78), + ADAMANT_SQUARE_SHIELD(BarType.ADAMANT, SmithingType.TYPE_SQUARE_SHIELD, 1183, 60), /** * Adamant Warhammer */ - ADAMANT_WARHAMMER(BarType.ADAMANT, SmithingType.TYPE_WARHAMMER, 1345, 79), + ADAMANT_WARHAMMER(BarType.ADAMANT, SmithingType.TYPE_WARHAMMER, 1345, 60), /** * Adamant BattleAxe */ - ADAMANT_BATTLEAXE(BarType.ADAMANT, SmithingType.TYPE_BATTLE_AXE, 1371, 80), + ADAMANT_BATTLEAXE(BarType.ADAMANT, SmithingType.TYPE_BATTLE_AXE, 1371, 60), /** * Adamant ChainBody */ - ADAMANT_CHAINBODY(BarType.ADAMANT, SmithingType.TYPE_CHAINBODY, 1111, 81), + ADAMANT_CHAINBODY(BarType.ADAMANT, SmithingType.TYPE_CHAINBODY, 1111, 60), /** * Adamant KiteShield */ - ADAMANT_KITESHIELD(BarType.ADAMANT, SmithingType.TYPE_KITE_SHIELD, 1199, 82), + ADAMANT_KITESHIELD(BarType.ADAMANT, SmithingType.TYPE_KITE_SHIELD, 1199, 60), /** * Adamant Claws */ - ADAMANT_CLAWS(BarType.ADAMANT, SmithingType.TYPE_CLAWS, 3100, 83), + ADAMANT_CLAWS(BarType.ADAMANT, SmithingType.TYPE_CLAWS, 3100, 60), /** * Adamant 2H */ - ADAMANT_TWO_HANDED_SWORD(BarType.ADAMANT, SmithingType.TYPE_TWO_HAND_SWORD, 1317, 84), + ADAMANT_TWO_HANDED_SWORD(BarType.ADAMANT, SmithingType.TYPE_TWO_HAND_SWORD, 1317, 60), /** * Adamant PlateSkirt */ - ADAMANT_PLATE_SKIRT(BarType.ADAMANT, SmithingType.TYPE_PLATE_SKIRT, 1091, 86), + ADAMANT_PLATE_SKIRT(BarType.ADAMANT, SmithingType.TYPE_PLATE_SKIRT, 1091, 60), /** * Adamant PlateLegs */ - ADAMANT_PLATE_LEGS(BarType.ADAMANT, SmithingType.TYPE_PLATELEG, 1073, 86), + ADAMANT_PLATE_LEGS(BarType.ADAMANT, SmithingType.TYPE_PLATELEG, 1073, 60), /** * Adamant PlateBody */ - ADAMANT_PLATE_BODY(BarType.ADAMANT, SmithingType.TYPE_PLATEBODY, 1123, 88), + ADAMANT_PLATE_BODY(BarType.ADAMANT, SmithingType.TYPE_PLATEBODY, 1123, 60), /** * Adamant PickAxe */ - ADAMANT_PICKAXE(BarType.ADAMANT, SmithingType.TYPE_PICKAXE, 1271, 75), + ADAMANT_PICKAXE(BarType.ADAMANT, SmithingType.TYPE_PICKAXE, 1271, 60), /** * Rune Dagger */ - RUNE_DAGGER(BarType.RUNITE, SmithingType.TYPE_DAGGER, 1213, 85), + RUNE_DAGGER(BarType.RUNITE, SmithingType.TYPE_DAGGER, 1213, 70), /** * Rune Hatchet */ - RUNITE_AXE(BarType.RUNITE, SmithingType.TYPE_AXE, 1359, 86), + RUNITE_AXE(BarType.RUNITE, SmithingType.TYPE_AXE, 1359, 70), /** * Rune Mace */ - RUNITE_MACE(BarType.RUNITE, SmithingType.TYPE_MACE, 1432, 87), + RUNITE_MACE(BarType.RUNITE, SmithingType.TYPE_MACE, 1432, 70), /** * Rune Med Helm */ - RUNITE_MEDIUM_HELM(BarType.RUNITE, SmithingType.TYPE_MEDIUM_HELM, 1147, 88), + RUNITE_MEDIUM_HELM(BarType.RUNITE, SmithingType.TYPE_MEDIUM_HELM, 1147, 70), /** * Rune Crossbow Bolt */ - RUNITE_BOLT(BarType.RUNITE, SmithingType.TYPE_CROSSBOW_BOLT, 9381, 88), + RUNITE_BOLT(BarType.RUNITE, SmithingType.TYPE_CROSSBOW_BOLT, 9381, 70), /** * Rune Sword */ - RUNITE_SWORD(BarType.RUNITE, SmithingType.TYPE_SWORD, 1289, 89), + RUNITE_SWORD(BarType.RUNITE, SmithingType.TYPE_SWORD, 1289, 70), /** * Rune Dart Tips */ - RUNITE_DART_TIPS(BarType.RUNITE, SmithingType.TYPE_DART_TIP, 824, 89), + RUNITE_DART_TIPS(BarType.RUNITE, SmithingType.TYPE_DART_TIP, 824, 70), /** * Rune Nails */ - RUNITE_NAILS(BarType.RUNITE, SmithingType.TYPE_NAIL, 4824, 89), + RUNITE_NAILS(BarType.RUNITE, SmithingType.TYPE_NAIL, 4824, 70), /** * Rune Arrow Tips */ - RUNITE_ARROW_TIPS(BarType.RUNITE, SmithingType.TYPE_ARROW_TIP, 44, 90), + RUNITE_ARROW_TIPS(BarType.RUNITE, SmithingType.TYPE_ARROW_TIP, 44, 70), /** * Rune Scmitar */ - RUNITE_SCIMITAR(BarType.RUNITE, SmithingType.TYPE_SCIMITAR, 1333, 90), + RUNITE_SCIMITAR(BarType.RUNITE, SmithingType.TYPE_SCIMITAR, 1333, 70), /** * Rune Crossbow Limbs */ - RUNITE_LIMBS(BarType.RUNITE, SmithingType.TYPE_CROSSBOW_LIMB, 9431, 91), + RUNITE_LIMBS(BarType.RUNITE, SmithingType.TYPE_CROSSBOW_LIMB, 9431, 70), /** * Rune LongSword */ - RUNITE_LONGSWORD(BarType.RUNITE, SmithingType.TYPE_LONGSWORD, 1303, 91), + RUNITE_LONGSWORD(BarType.RUNITE, SmithingType.TYPE_LONGSWORD, 1303, 70), /** * Rune Knife */ - RUNITE_KNIFE(BarType.RUNITE, SmithingType.TYPE_THROWING_KNIFE, 868, 92), + RUNITE_KNIFE(BarType.RUNITE, SmithingType.TYPE_THROWING_KNIFE, 868, 70), /** * Rune Full Helm */ - RUNITE_FULL_HELM(BarType.RUNITE, SmithingType.TYPE_FULL_HELM, 1163, 92), + RUNITE_FULL_HELM(BarType.RUNITE, SmithingType.TYPE_FULL_HELM, 1163, 70), /** * Rune Square Shield */ - RUNITE_SQUARE_SHIELD(BarType.RUNITE, SmithingType.TYPE_SQUARE_SHIELD, 1185, 93), + RUNITE_SQUARE_SHIELD(BarType.RUNITE, SmithingType.TYPE_SQUARE_SHIELD, 1185, 70), /** * Rune Warhammer */ - RUNITE_WARHAMMER(BarType.RUNITE, SmithingType.TYPE_WARHAMMER, 1347, 94), + RUNITE_WARHAMMER(BarType.RUNITE, SmithingType.TYPE_WARHAMMER, 1347, 70), /** * Rune BattleAxe */ - RUNITE_BATTLEAXE(BarType.RUNITE, SmithingType.TYPE_BATTLE_AXE, 1373, 95), + RUNITE_BATTLEAXE(BarType.RUNITE, SmithingType.TYPE_BATTLE_AXE, 1373, 70), /** * Rune ChainBody */ - RUNITE_CHAINBODY(BarType.RUNITE, SmithingType.TYPE_CHAINBODY, 1113, 96), + RUNITE_CHAINBODY(BarType.RUNITE, SmithingType.TYPE_CHAINBODY, 1113, 70), /** * Rune KiteShield */ - RUNITE_KITESHIELD(BarType.RUNITE, SmithingType.TYPE_KITE_SHIELD, 1201, 97), + RUNITE_KITESHIELD(BarType.RUNITE, SmithingType.TYPE_KITE_SHIELD, 1201, 70), /** * Rune Claws */ - RUNITE_CLAWS(BarType.RUNITE, SmithingType.TYPE_CLAWS, 3101, 98), + RUNITE_CLAWS(BarType.RUNITE, SmithingType.TYPE_CLAWS, 3101, 70), /** * Rune 2H */ - RUNITE_TWO_HANDED_SWORD(BarType.RUNITE, SmithingType.TYPE_TWO_HAND_SWORD, 1319, 99), + RUNITE_TWO_HANDED_SWORD(BarType.RUNITE, SmithingType.TYPE_TWO_HAND_SWORD, 1319, 70), /** * Rune PlateSkirt */ - RUNITE_PLATE_SKIRT(BarType.RUNITE, SmithingType.TYPE_PLATE_SKIRT, 1093, 99), + RUNITE_PLATE_SKIRT(BarType.RUNITE, SmithingType.TYPE_PLATE_SKIRT, 1093, 70), /** * Rune PlateLegs */ - RUNITE_PLATE_LEGS(BarType.RUNITE, SmithingType.TYPE_PLATELEG, 1079, 99), + RUNITE_PLATE_LEGS(BarType.RUNITE, SmithingType.TYPE_PLATELEG, 1079, 70), /** * Rune PlateBody */ - RUNITE_PLATE_BODY(BarType.RUNITE, SmithingType.TYPE_PLATEBODY, 1127, 99), + RUNITE_PLATE_BODY(BarType.RUNITE, SmithingType.TYPE_PLATEBODY, 1127, 70), /** * Rune PickAxe */ - RUNITE_PICKAXE(BarType.RUNITE, SmithingType.TYPE_PICKAXE, 1275, 90), + RUNITE_PICKAXE(BarType.RUNITE, SmithingType.TYPE_PICKAXE, 1275, 70), /** * Blurite CrossBow bolts @@ -800,7 +800,7 @@ public enum Bars { /** * Blurite Crossbow Limbs */ - BLURITE_CROSSBOW_LIMBS(BarType.BLURITE, SmithingType.TYPE_CROSSBOW_LIMB, 9422, 13); + BLURITE_CROSSBOW_LIMBS(BarType.BLURITE, SmithingType.TYPE_CROSSBOW_LIMB, 9422, 8); /** * A map of object ids to primary ingredients. From 62dc8bc3241ce74ae5370025aa3bd7a9a9c3c2cf Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 27 Oct 2024 20:42:40 -0600 Subject: [PATCH 05/81] Updated Smelting levels Lowered Adamant and Runite smelting to 60 and 70 respectively. --- .../src/main/content/global/skill/smithing/smelting/Bar.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/content/global/skill/smithing/smelting/Bar.java b/Server/src/main/content/global/skill/smithing/smelting/Bar.java index 04177c11a..88b4eea74 100644 --- a/Server/src/main/content/global/skill/smithing/smelting/Bar.java +++ b/Server/src/main/content/global/skill/smithing/smelting/Bar.java @@ -15,8 +15,8 @@ public enum Bar { STEEL(30, 17.5, new Item(2353, 1), new Item(453, 2), new Item(440, 1)), GOLD(40, 22.5, new Item(2357, 1), new Item(444, 1)), MITHRIL(50, 30, new Item(2359, 1), new Item(447, 1), new Item(453, 4)), - ADAMANT(70, 37.5, new Item(2361, 1), new Item(449, 1), new Item(453, 6)), - RUNITE(85, 50, new Item(2363, 1), new Item(451, 1), new Item(453, 8)); + ADAMANT(60, 37.5, new Item(2361, 1), new Item(449, 1), new Item(453, 6)), + RUNITE(70, 50, new Item(2363, 1), new Item(451, 1), new Item(453, 8)); /** * The ore required. From cc6f33ab7ef218b99c1588b1a6ebd25b8126e9a4 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 27 Oct 2024 20:49:19 -0600 Subject: [PATCH 06/81] Updating mining levels for mithril, adamant, and rune to 50, 60, 70. --- .../main/content/global/skill/gather/mining/MiningNode.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/src/main/content/global/skill/gather/mining/MiningNode.java b/Server/src/main/content/global/skill/gather/mining/MiningNode.java index 5f7f00cf3..11a564cf8 100644 --- a/Server/src/main/content/global/skill/gather/mining/MiningNode.java +++ b/Server/src/main/content/global/skill/gather/mining/MiningNode.java @@ -522,21 +522,21 @@ public enum MiningNode{ experience = 80.0; rate = 0.70; reward = 447; - level = 55; + level = 50; break; case 11: respawnRate = 400 | 800 << 16; experience = 95.0; rate = 0.85; reward = 449; - level = 70; + level = 60; break; case 12: respawnRate = 1250 | 2500 << 16; experience = 125.0; rate = 0.95; reward = 451; - level = 85; + level = 70; break; case 13: respawnRate = 166 | 175 << 16; From bc5958b60db92409dd37c248989a0759cc6abba7 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 27 Oct 2024 20:57:03 -0600 Subject: [PATCH 07/81] Added -Xmx flag to specify the amount of RAM the server allocates --- run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run b/run index e1c4fdc10..ed57b2f4a 100755 --- a/run +++ b/run @@ -10,7 +10,7 @@ REFRESH_BUILD=1 GAMESERVER_ONLY=1 -GS_EXEC="cd $GS_SRC && java -Dnashorn.args=--no-deprecation-warning -jar $BUILD_DIR/server.jar" +GS_EXEC="cd $GS_SRC && java -Xmx7g -Dnashorn.args=--no-deprecation-warning -jar $BUILD_DIR/server.jar" MS_EXEC="cd $MS_SRC && java -Dnashorn.args=--no-deprecation-warning -jar $BUILD_DIR/ms.jar" # 0: parallel From 490c6d42ec18ebeae1275933159fa2ec40196778 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 27 Oct 2024 21:06:08 -0600 Subject: [PATCH 08/81] Autocast changes - All God staves can autocast, and autocast is now independent of active spellbook. --- .../combat/equipment/WeaponInterface.java | 61 +++++++++++++++---- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/Server/src/main/core/game/node/entity/combat/equipment/WeaponInterface.java b/Server/src/main/core/game/node/entity/combat/equipment/WeaponInterface.java index cb74f3fa6..6a38729fe 100644 --- a/Server/src/main/core/game/node/entity/combat/equipment/WeaponInterface.java +++ b/Server/src/main/core/game/node/entity/combat/equipment/WeaponInterface.java @@ -46,10 +46,20 @@ public final class WeaponInterface extends Component { private static final int[] SLAYER_STAFF_SPELL_IDS = { 22, 31, 45, 48, 52, 55 }; /** - * The void staff spell ids + * The void and guthix staff spell ids */ private static final int[] VOID_STAFF_SPELL_IDS = { 22, 42, 45, 48, 52, 55 }; + /** + * The saradomin staff spell ids + */ + private static final int[] SARADOMIN_STAFF_SPELL_IDS = { 22, 41, 45, 48, 52, 55 }; + + /** + * The zamorak staff spell ids + */ + private static final int[] ZAMORAK_STAFF_SPELL_IDS = { 22, 43, 45, 48, 52, 55 }; + /** * The default attack animations. */ @@ -333,13 +343,23 @@ public final class WeaponInterface extends Component { * @return The component id for the autocast select tab. */ public int getAutospellId(int spellId) { - boolean modern = player.getSpellBookManager().getSpellBook() == Components.MAGIC_192; - int[] data = modern ? MODERN_SPELL_IDS : ANCIENT_SPELL_IDS; - if (modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff")) { + //boolean modern = player.getSpellBookManager().getSpellBook() == Components.MAGIC_192; + boolean modern = !player.getEquipment().getNew(3).getName().equalsIgnoreCase("Ancient Staff") && !player.getEquipment().getNew(3).getName().contains("uriel's staff"); + int[] data = MODERN_SPELL_IDS; + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Ancient Staff") || player.getEquipment().getNew(3).getName().contains("uriel's staff")) { + data = ANCIENT_SPELL_IDS; + } + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff")) { data = SLAYER_STAFF_SPELL_IDS; } - if (modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace")) { + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace") || player.getEquipment().getNew(3).getName().equalsIgnoreCase("Guthix Staff")) { data = VOID_STAFF_SPELL_IDS; + } + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Saradomin Staff")) { + data = SARADOMIN_STAFF_SPELL_IDS; + } + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Zamorak Staff")) { + data = ZAMORAK_STAFF_SPELL_IDS; } for (int i = 0; i < data.length; i++) { if (data[i] == spellId) { @@ -355,14 +375,24 @@ public final class WeaponInterface extends Component { * @param adjustAttackStyle If the attack style should be adjusted. */ public void selectAutoSpell(int buttonId, boolean adjustAttackStyle) { - boolean modern = player.getSpellBookManager().getSpellBook() == Components.MAGIC_192; - int[] data = modern ? MODERN_SPELL_IDS : ANCIENT_SPELL_IDS; - if (modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff")) { + //boolean modern = player.getSpellBookManager().getSpellBook() == Components.MAGIC_192; + boolean modern = !player.getEquipment().getNew(3).getName().equalsIgnoreCase("Ancient Staff") && !player.getEquipment().getNew(3).getName().contains("uriel's staff"); + int[] data = MODERN_SPELL_IDS; + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Ancient staff") || player.getEquipment().getNew(3).getName().contains("uriel's staff")) { + data = ANCIENT_SPELL_IDS; + } + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff")) { data = SLAYER_STAFF_SPELL_IDS; } - if (modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace")) { + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace") || modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Guthix Staff")) { data = VOID_STAFF_SPELL_IDS; } + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Saradomin Staff")) { + data = SARADOMIN_STAFF_SPELL_IDS; + } + if (player.getEquipment().getNew(3).getName().equalsIgnoreCase("Zamorak Staff")) { + data = ZAMORAK_STAFF_SPELL_IDS; + } CombatSpell current = player.getProperties().getAutocastSpell(); if (buttonId >= data.length) { return; @@ -455,15 +485,20 @@ public final class WeaponInterface extends Component { return; } player.setAttribute("autocast_select", true); - int id = player.getSpellBookManager().getSpellBook() == 193 ? 797 : 319; + //int id = player.getSpellBookManager().getSpellBook() == 193 ? 797 : 319; + int id = 319; + boolean ancient = player.getEquipment().getNew(3).getName().equalsIgnoreCase("Ancient staff") || player.getEquipment().getNew(3).getName().contains("uriel's staff"); boolean slayer = player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff"); - boolean mace = player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace"); + boolean mace = player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace") || player.getEquipment().getNew(3).getName().equalsIgnoreCase("Guthix Staff") || player.getEquipment().getNew(3).getName().equalsIgnoreCase("Saradomin Staff") || player.getEquipment().getNew(3).getName().equalsIgnoreCase("Zamorak Staff"); if (slayer) { id = 310; } if (mace) { id = 406; } + if (ancient) { + id = 797; + } Component component = new Component(id); component.getDefinition().setTabIndex(0); component.getDefinition().setType(InterfaceType.TAB); @@ -480,7 +515,7 @@ public final class WeaponInterface extends Component { if (current != WeaponInterfaces.STAFF) { return false; } - if (player.getSpellBookManager().getSpellBook() == SpellBookManager.SpellBook.LUNAR.getInterfaceId()) { + /* if (player.getSpellBookManager().getSpellBook() == SpellBookManager.SpellBook.LUNAR.getInterfaceId()) { if (message) { player.getPacketDispatch().sendMessage("You can't autocast Lunar magic."); } @@ -492,7 +527,7 @@ public final class WeaponInterface extends Component { player.getPacketDispatch().sendMessage("You can only autocast ancient magicks with an Ancient or Zuriel's staff."); } return false; - } + } */ return true; } From b35159b5b7ccc356f464476db60b72b2eebba65d Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 28 Oct 2024 12:54:33 -0600 Subject: [PATCH 09/81] Implement pickpocketing auto-repeating if the player is wearing Gloves of Silence The player.lock function doesn't run if the player has gloves on, since it prevents triggering the pickpocket action immediately afterwards. To avoid pickpocketing every tick, we check the game ticks if the player has gloves and only perform the action every other tick. Testing indicates that manual pickpocketing can occur every 2 ticks, so the auto-repeat occurs at the same rate. If the player fails pickpocketing, the stun will prevent the auto-repeat from activating. --- .../global/skill/thieving/ThievingListeners.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Server/src/main/content/global/skill/thieving/ThievingListeners.kt b/Server/src/main/content/global/skill/thieving/ThievingListeners.kt index d6123fcda..a236ca291 100644 --- a/Server/src/main/content/global/skill/thieving/ThievingListeners.kt +++ b/Server/src/main/content/global/skill/thieving/ThievingListeners.kt @@ -15,6 +15,9 @@ import core.game.node.entity.player.Player import core.game.node.item.Item import org.rs09.consts.Sounds +import core.game.interaction.InteractionListeners +import core.game.world.GameWorld + class ThievingListeners : InteractionListener { companion object { @@ -64,6 +67,10 @@ class ThievingListeners : InteractionListener { player.sendMessage("You don't have enough inventory space to do that.") return@on true } + + //Custom portion. If the player has gloves of silence, only proceed every other tick + val glovesOfSilence = player.equipment.contains(Items.GLOVES_OF_SILENCE_10075,1) + if (!glovesOfSilence || GameWorld.ticks % 2 == 0) { player.animator.animate(PICKPOCKET_ANIM) val lootTable = pickpocketRoll(player, pickpocketData.low, pickpocketData.high, pickpocketData.table) @@ -80,11 +87,17 @@ class ThievingListeners : InteractionListener { node.asNpc().face(null) } else { playAudio(player, Sounds.PICK_2581) - player.lock(2) + if (!glovesOfSilence) { + player.lock(2) + } lootTable.forEach { player.inventory.add(it) } player.skills.addExperience(Skills.THIEVING,pickpocketData.experience) } - + } + // if wearing gloves of silence, pickpocket again. + if (glovesOfSilence) { + InteractionListeners.run(node.id, IntType.NPC,"Pickpocket",player,node) + } return@on true } } From 0fddd2134b25e7ffd1e67c2637ef119c3a432b19 Mon Sep 17 00:00:00 2001 From: randy Date: Thu, 31 Oct 2024 15:20:14 -0600 Subject: [PATCH 10/81] Firemaking now repeats until all the matching logs in your inventory are used --- .../global/skill/firemaking/FireMakingPulse.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/firemaking/FireMakingPulse.java b/Server/src/main/content/global/skill/firemaking/FireMakingPulse.java index 50b969efd..a2612543d 100644 --- a/Server/src/main/content/global/skill/firemaking/FireMakingPulse.java +++ b/Server/src/main/content/global/skill/firemaking/FireMakingPulse.java @@ -19,6 +19,8 @@ import org.rs09.consts.Items; import static core.api.ContentAPIKt.inInventory; import static core.api.ContentAPIKt.replaceSlot; +import static core.api.ContentAPIKt.removeItem; + /** * Represents the pulse used to light a log. * @author 'Vexia @@ -102,10 +104,12 @@ public final class FireMakingPulse extends SkillPulse { @Override public boolean reward() { + /* Snowscape: this section allows making a new fire without an animation if you're fast enough, but since we auto-repeat we don't need that if (getLastFire() >= GameWorld.getTicks()) { createFire(); return true; } + */ if (ticks == 0) { player.animate(ANIMATION); } @@ -119,7 +123,13 @@ public final class FireMakingPulse extends SkillPulse { return false; } createFire(); - return true; + // Snowscape: attempt to remove another log. If successful, the pulse continues and the player makes another fire + if (removeItem(player, new Item(node.getId(), 1), Container.INVENTORY)) { + return false; + } else { + return true; + } + } /** From bbf8f3c3487e0e937610f9c3ddeeaa9d1803693f Mon Sep 17 00:00:00 2001 From: randy Date: Thu, 31 Oct 2024 21:49:05 -0600 Subject: [PATCH 11/81] Ore rocks now only have a chance to deplete based on Mining Level and rock respawn time --- .../main/content/global/skill/gather/mining/MiningListener.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/gather/mining/MiningListener.kt b/Server/src/main/content/global/skill/gather/mining/MiningListener.kt index d744b0a8f..9233b836f 100644 --- a/Server/src/main/content/global/skill/gather/mining/MiningListener.kt +++ b/Server/src/main/content/global/skill/gather/mining/MiningListener.kt @@ -136,7 +136,7 @@ class MiningListener : InteractionListener { } // Transform ore to depleted version - if (!isEssence && resource!!.respawnRate != 0) { + if (!isEssence && resource!!.respawnRate != 0 && RandomFunction.roll(getDynLevel(player, Skills.MINING)*5/resource!!.respawnDuration + 1)) { SceneryBuilder.replace(node as Scenery, Scenery(resource!!.emptyId, node.getLocation(), node.type, node.rotation), resource!!.respawnDuration) node.setActive(false) return true From 0f00221cd945dbb7b9f72e94543c11b1bfb38f5f Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 3 Nov 2024 18:32:19 -0700 Subject: [PATCH 12/81] Updated Soul Rift in Abyss to teleport to new altar on Crandor --- .../src/main/content/global/skill/runecrafting/Altar.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Server/src/main/content/global/skill/runecrafting/Altar.java b/Server/src/main/content/global/skill/runecrafting/Altar.java index 8be433efc..5bb2f0794 100644 --- a/Server/src/main/content/global/skill/runecrafting/Altar.java +++ b/Server/src/main/content/global/skill/runecrafting/Altar.java @@ -82,6 +82,14 @@ public enum Altar { if (this == BLOOD) { if (!hasRequirement(player, "Legacy of Seergaze")) return; + } + if (this == SOUL) { + if (player.getQuestRepository().isComplete("Dragon Slayer")) { + player.getProperties().setTeleportLocation(Location.create(2836, 3285, 0)); + } else { + player.sendMessage("You need to have completed the Dragon Slayer quest in order to do that."); + return; + } } if (this == LAW) { if (!ItemDefinition.canEnterEntrana(player)) { From 020c10d96165172e8c0262ce1e3637227eb5b077 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 3 Nov 2024 18:34:44 -0700 Subject: [PATCH 13/81] Placed new Soul Altar on Crandor --- Server/data/ObjectParser.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/data/ObjectParser.xml b/Server/data/ObjectParser.xml index b10a0d445..547e2eaf1 100644 --- a/Server/data/ObjectParser.xml +++ b/Server/data/ObjectParser.xml @@ -25,4 +25,6 @@ + + From 540db8e15ad9302dbc75562e46f6d4cf99c9e2a5 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 3 Nov 2024 18:40:32 -0700 Subject: [PATCH 14/81] Added ability to craft altar teleport tablets by bringing soft clay to the respective altar. --- .../skill/runecrafting/RuneCraftPulse.java | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java index d32bea579..b5e2745b6 100644 --- a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java +++ b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java @@ -40,6 +40,7 @@ public final class RuneCraftPulse extends SkillPulse { * Represents the pure essence item. */ private static final Item PURE_ESSENCE = new Item(7936); + private static final Item SOFT_CLAY = new Item(1761); /** * Represents the binding necklace item. @@ -119,12 +120,12 @@ public final class RuneCraftPulse extends SkillPulse { player.getPacketDispatch().sendMessage("You need pure essence to craft this rune."); return false; } - if (!altar.isOurania() && !rune.isNormal() && !player.getInventory().containsItem(PURE_ESSENCE)) { - player.getPacketDispatch().sendMessage("You need pure essence to craft this rune."); + if (!altar.isOurania() && !rune.isNormal() && !player.getInventory().containsItem(PURE_ESSENCE) && !player.getInventory().containsItem(SOFT_CLAY)) { + player.getPacketDispatch().sendMessage("You need pure essence to craft this rune, or soft clay to craft teleport tablets."); return false; } - if (!altar.isOurania() && rune.isNormal() && !player.getInventory().containsItem(PURE_ESSENCE) && !player.getInventory().containsItem(RUNE_ESSENCE)) { - player.getPacketDispatch().sendMessage("You need rune essence or pure essence in order to craft this rune."); + if (!altar.isOurania() && rune.isNormal() && !player.getInventory().containsItem(PURE_ESSENCE) && !player.getInventory().containsItem(RUNE_ESSENCE) && !player.getInventory().containsItem(SOFT_CLAY)) { + player.getPacketDispatch().sendMessage("You need rune essence or pure essence in order to craft this rune, or soft clay to craft teleport tablets."); return false; } if (altar.isOurania() && !player.getInventory().containsItem(PURE_ESSENCE)) { @@ -160,6 +161,7 @@ public final class RuneCraftPulse extends SkillPulse { @Override public boolean reward() { if (!combination) { + craftTablet(); craft(); } else { combine(); @@ -268,6 +270,33 @@ public final class RuneCraftPulse extends SkillPulse { } } + /** + * Method used to craft tablets. Custom for Snowscape + */ + private final void craftTablet() { + int amount = player.getInventory().getAmount(new Item(1761)); + Item clay = new Item(1761, amount); + Item tablet = null; + if (altar == Altar.AIR) { tablet = new Item(13599, amount); } + if (altar == Altar.MIND) { tablet = new Item(13600, amount); } + if (altar == Altar.WATER) { tablet = new Item(13601, amount); } + if (altar == Altar.EARTH) { tablet = new Item(13602, amount); } + if (altar == Altar.FIRE) { tablet = new Item(13603, amount); } + if (altar == Altar.BODY) { tablet = new Item(13604, amount); } + if (altar == Altar.COSMIC) { tablet = new Item(13605, amount); } + if (altar == Altar.CHAOS) { tablet = new Item(13606, amount); } + if (altar == Altar.ASTRAL) { tablet = new Item(13611, amount); } + if (altar == Altar.NATURE) { tablet = new Item(13607, amount); } + if (altar == Altar.LAW) { tablet = new Item(13608, amount); } + if (altar == Altar.DEATH) { tablet = new Item(13609, amount); } + if (altar == Altar.BLOOD) { tablet = new Item(13610, amount); } + if (altar == Altar.SOUL) { tablet = new Item(13598, amount); } + if (tablet != null && player.getInventory().remove(clay)) { + player.getInventory().add(tablet); + player.getPacketDispatch().sendMessage("You bind the temple's power into teleport tablets."); + } + } + /** * Checks if the player has the spell imbue. * From 78847c2415a9febcda5d50be35b1f680a65feb09 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 3 Nov 2024 18:44:48 -0700 Subject: [PATCH 15/81] Ourania altar now gives multiple runes per essence, the same as all other altars. --- .../content/global/skill/runecrafting/RuneCraftPulse.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java index b5e2745b6..edd7a05e1 100644 --- a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java +++ b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java @@ -179,7 +179,7 @@ public final class RuneCraftPulse extends SkillPulse { int total = 0; for(int j = 0; j < amount; j++) { // since getMultiplier is stochastic, roll `amount` independent copies - total += getMultiplier(); + total += getMultiplier(rune); } Item i = new Item(rune.getRune().getId(), total); @@ -229,7 +229,7 @@ public final class RuneCraftPulse extends SkillPulse { } } player.getSkills().addExperience(Skills.RUNECRAFTING, rune.getExperience() * 2, true); - Item runeItem = rune.getRune(); + Item runeItem = new Item(rune.getRune().getId(),getMultiplier(rune)); player.getInventory().add(runeItem); } } @@ -347,10 +347,12 @@ public final class RuneCraftPulse extends SkillPulse { * * @return the amount. */ - public int getMultiplier() { + public int getMultiplier(Rune rune) { + /* if (altar.isOurania()) { return 1; } + */ int rcLevel = player.getSkills().getLevel(Skills.RUNECRAFTING); int runecraftingFormulaRevision = ServerConstants.RUNECRAFTING_FORMULA_REVISION; boolean lumbridgeDiary = player.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE).isComplete(1); From 2abf5405159444ddd78e59f4f7412e6ae54822a5 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 3 Nov 2024 18:54:51 -0700 Subject: [PATCH 16/81] Added Runecrafting Guild Teleport tablet (teleports to Soul Altar) --- Server/src/main/content/global/handlers/item/TeleTabsListener.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/Server/src/main/content/global/handlers/item/TeleTabsListener.kt b/Server/src/main/content/global/handlers/item/TeleTabsListener.kt index 21a291360..f04b421f8 100644 --- a/Server/src/main/content/global/handlers/item/TeleTabsListener.kt +++ b/Server/src/main/content/global/handlers/item/TeleTabsListener.kt @@ -32,6 +32,7 @@ class TeleTabsListener : InteractionListener { LUMBRIDGE_TELEPORT(8008, Location.create(3222, 3218, 0), 41.0), MIND_ALTAR_TELEPORT(13600, Location.create(2979, 3510, 0), 0.0), NATURE_ALTAR_TELEPORT(13607, Location.create(2868, 3013, 0), 0.0), + RUNECRAFTING_GUILD_TELEPORT(13598, Location.create(2836, 3285, 0), 0.0), VARROCK_TELEPORT(8007, Location.create(3212, 3423, 0), 35.00), WATCH_TOWER_TELEPORT(8012, Location.create(2548, 3114, 0), 68.00), WATER_ALTAR_TELEPORT(13601, Location.create(3182, 3162, 0), 0.0); From d74d83b2ecbc9ac267a6d388bc03d0c2e03dee6c Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 4 Nov 2024 06:13:23 -0700 Subject: [PATCH 17/81] Fixed missing dependency for Soul Rift teleport --- Server/src/main/content/global/skill/runecrafting/Altar.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/src/main/content/global/skill/runecrafting/Altar.java b/Server/src/main/content/global/skill/runecrafting/Altar.java index 5bb2f0794..53f4773b0 100644 --- a/Server/src/main/content/global/skill/runecrafting/Altar.java +++ b/Server/src/main/content/global/skill/runecrafting/Altar.java @@ -6,6 +6,8 @@ import core.game.node.scenery.Scenery; import static core.api.ContentAPIKt.hasRequirement; +import core.game.world.map.Location; + /** * Represents an altar an it's relative information(corresponding ruin, etc) * @author 'Vexia From 82681e8303198a073f663ff1ae2d514dedb05c04 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 4 Nov 2024 19:18:39 -0700 Subject: [PATCH 18/81] Changed Runecrafting Guild Teleport tablet to the unused Telekinetic Grab tablet --- .../src/main/content/global/handlers/item/TeleTabsListener.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/handlers/item/TeleTabsListener.kt b/Server/src/main/content/global/handlers/item/TeleTabsListener.kt index f04b421f8..4a3a0bf75 100644 --- a/Server/src/main/content/global/handlers/item/TeleTabsListener.kt +++ b/Server/src/main/content/global/handlers/item/TeleTabsListener.kt @@ -32,7 +32,7 @@ class TeleTabsListener : InteractionListener { LUMBRIDGE_TELEPORT(8008, Location.create(3222, 3218, 0), 41.0), MIND_ALTAR_TELEPORT(13600, Location.create(2979, 3510, 0), 0.0), NATURE_ALTAR_TELEPORT(13607, Location.create(2868, 3013, 0), 0.0), - RUNECRAFTING_GUILD_TELEPORT(13598, Location.create(2836, 3285, 0), 0.0), + TELEKINETIC_GRAB(8022, Location.create(2836, 3285, 0), 0.0), VARROCK_TELEPORT(8007, Location.create(3212, 3423, 0), 35.00), WATCH_TOWER_TELEPORT(8012, Location.create(2548, 3114, 0), 68.00), WATER_ALTAR_TELEPORT(13601, Location.create(3182, 3162, 0), 0.0); From 845a00079b2cb1cfc24be7f4de85b48b69ea0986 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 4 Nov 2024 19:19:38 -0700 Subject: [PATCH 19/81] Changed Soul Altar to use the Telekinetic Grab tablet instead of the Runecrafting Guild tablet --- .../main/content/global/skill/runecrafting/RuneCraftPulse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java index edd7a05e1..aff74d903 100644 --- a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java +++ b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java @@ -290,7 +290,7 @@ public final class RuneCraftPulse extends SkillPulse { if (altar == Altar.LAW) { tablet = new Item(13608, amount); } if (altar == Altar.DEATH) { tablet = new Item(13609, amount); } if (altar == Altar.BLOOD) { tablet = new Item(13610, amount); } - if (altar == Altar.SOUL) { tablet = new Item(13598, amount); } + if (altar == Altar.SOUL) { tablet = new Item(8022, amount); } if (tablet != null && player.getInventory().remove(clay)) { player.getInventory().add(tablet); player.getPacketDispatch().sendMessage("You bind the temple's power into teleport tablets."); From 17ac2ab4da965278d235d25383a50579c588185d Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 4 Nov 2024 19:30:28 -0700 Subject: [PATCH 20/81] Added Death and Blood Talismans to the drop tables of abyssal creatures --- Server/data/configs/drop_tables.json | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Server/data/configs/drop_tables.json b/Server/data/configs/drop_tables.json index 1a8525af4..87af56441 100644 --- a/Server/data/configs/drop_tables.json +++ b/Server/data/configs/drop_tables.json @@ -29532,6 +29532,18 @@ "id": "1438", "maxAmount": "1" }, + { + "minAmount": "1", + "weight": "25.0", + "id": "1456", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25.0", + "id": "1450", + "maxAmount": "1" + }, { "minAmount": "1", "weight": "25.0", @@ -29704,6 +29716,18 @@ "id": "1438", "maxAmount": "1" }, + { + "minAmount": "1", + "weight": "25.0", + "id": "1456", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25.0", + "id": "1450", + "maxAmount": "1" + }, { "minAmount": "1", "weight": "25.0", @@ -29876,6 +29900,18 @@ "id": "1438", "maxAmount": "1" }, + { + "minAmount": "1", + "weight": "25.0", + "id": "1456", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25.0", + "id": "1450", + "maxAmount": "1" + }, { "minAmount": "1", "weight": "25.0", From 86913bf75f96e2b6d78427e884b846384a535118 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 4 Nov 2024 19:42:31 -0700 Subject: [PATCH 21/81] Added additional stats to Monster Examine and removed the coin cost from Plank Make. Correctly done on the dev branch this time. --- .../skill/magic/lunar/LunarListeners.kt | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/Server/src/main/content/global/skill/magic/lunar/LunarListeners.kt b/Server/src/main/content/global/skill/magic/lunar/LunarListeners.kt index 40e27939a..ca302bfba 100644 --- a/Server/src/main/content/global/skill/magic/lunar/LunarListeners.kt +++ b/Server/src/main/content/global/skill/magic/lunar/LunarListeners.kt @@ -372,16 +372,26 @@ class LunarListeners : SpellListener("lunar"), Commands { setDelay(player, false) openSingleTab(player, Components.DREAM_MONSTER_STAT_522) - setInterfaceText(player, "Monster name : ${npc.definition.name}", Components.DREAM_MONSTER_STAT_522, 0) - setInterfaceText(player, "Combat Level : ${npc.definition.combatLevel}", Components.DREAM_MONSTER_STAT_522, 1) - setInterfaceText(player, "Hitpoints : ${npc.definition.handlers[NPCConfigParser.LIFEPOINTS] ?: 0}", Components.DREAM_MONSTER_STAT_522, 2) - setInterfaceText(player, "Max hit : ${npc.getSwingHandler(false).calculateHit(npc, player, 1.0)}", Components.DREAM_MONSTER_STAT_522, 3) + var bonuses = npc.properties.bonuses + setInterfaceText(player, "Monster name: ${npc.definition.name} (${npc.definition.combatLevel})", Components.DREAM_MONSTER_STAT_522, 0) + setInterfaceText(player, """ +Att:${npc.definition.handlers[NPCConfigParser.ATTACK_LEVEL] ?: 0} +Str:${npc.definition.handlers[NPCConfigParser.STRENGTH_LEVEL] ?: 0} +Ranged:${npc.definition.handlers[NPCConfigParser.RANGE_LEVEL] ?: 0} +Magic:${npc.definition.handlers[NPCConfigParser.MAGIC_LEVEL] ?: 0}""", Components.DREAM_MONSTER_STAT_522, 1) + setInterfaceText(player, """ +Defence:${npc.definition.handlers[NPCConfigParser.DEFENCE_LEVEL] ?: 0} +HP:${npc.definition.handlers[NPCConfigParser.LIFEPOINTS] ?: 0} +Max-hit:${npc.getSwingHandler(false).calculateHit(npc, player, 1.0)}""", Components.DREAM_MONSTER_STAT_522, 2) + setInterfaceText(player, "${bonuses[0]},${bonuses[1]},${bonuses[2]},${bonuses[3]},${bonuses[4]}, ${bonuses[5]},${bonuses[6]},${bonuses[7]},${bonuses[8]},${bonuses[9]}", Components.DREAM_MONSTER_STAT_522, 3) val poisonStatus = if(npc.definition.handlers.getOrDefault(NPCConfigParser.POISON_IMMUNE,false) == true){ - "This creature is immune to poison." - } else "This creature is not immune to poison." - - setInterfaceText(player, poisonStatus, Components.DREAM_MONSTER_STAT_522, 4) + "Immune to poison. " + } else "" + val poisonStatus2 = if(npc.definition.handlers.getOrDefault(NPCConfigParser.POISONOUS,false) == true){ + "Poisonous." + } else "" + setInterfaceText(player, poisonStatus + poisonStatus2, Components.DREAM_MONSTER_STAT_522, 4) } // Level 67 @@ -667,10 +677,12 @@ class LunarListeners : SpellListener("lunar"), Commands { sendMessage(player, "You need to use this spell on logs.") return } + /* if (amountInInventory(player, Items.COINS_995) < plankType.price || !removeItem(player, Item(Items.COINS_995, plankType.price))) { sendMessage(player, "You need ${plankType.price} coins to convert that log into a plank.") return } + */ lock(player, 3) setDelay(player, false) visualizeSpell(player, Animations.LUNAR_SPELLBOOK_PLANK_MAKE_6298, Graphics.LUNAR_SPELLBOOK_PLANK_MAKE_1063, 120, Sounds.LUNAR_MAKE_PLANK_3617) From 9295c91a7d3e08e89e4f35b50d5cdfe469dc94a4 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 4 Nov 2024 20:37:26 -0700 Subject: [PATCH 22/81] Plank Make now automatically recasts on matching logs --- .../skill/magic/lunar/LunarListeners.kt | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Server/src/main/content/global/skill/magic/lunar/LunarListeners.kt b/Server/src/main/content/global/skill/magic/lunar/LunarListeners.kt index ca302bfba..ba2483cc7 100644 --- a/Server/src/main/content/global/skill/magic/lunar/LunarListeners.kt +++ b/Server/src/main/content/global/skill/magic/lunar/LunarListeners.kt @@ -677,12 +677,28 @@ Max-hit:${npc.getSwingHandler(false).calculateHit(npc, player, 1.0)}""", Compone sendMessage(player, "You need to use this spell on logs.") return } - /* + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + removeAttribute(player, "spell:runes") + if (amountInInventory(player, item.id) == 0 ) + return true + requires(player, 86, arrayOf(Item(Items.ASTRAL_RUNE_9075, 2), Item(Items.NATURE_RUNE_561, 1), Item(Items.EARTH_RUNE_557, 15))) + if(removeItem(player, item.id) && addItem(player, plankType.plank.id)) { + removeRunes(player, false) + if (counter % 6 == 0) + visualizeSpell(player, Animations.LUNAR_SPELLBOOK_PLANK_MAKE_6298, Graphics.LUNAR_SPELLBOOK_PLANK_MAKE_1063, 120, Sounds.LUNAR_MAKE_PLANK_3617) + addXP(player, 90.0) + } + counter++ + return false + } + }) + /* Vanilla Spell if (amountInInventory(player, Items.COINS_995) < plankType.price || !removeItem(player, Item(Items.COINS_995, plankType.price))) { sendMessage(player, "You need ${plankType.price} coins to convert that log into a plank.") return } - */ lock(player, 3) setDelay(player, false) visualizeSpell(player, Animations.LUNAR_SPELLBOOK_PLANK_MAKE_6298, Graphics.LUNAR_SPELLBOOK_PLANK_MAKE_1063, 120, Sounds.LUNAR_MAKE_PLANK_3617) @@ -690,6 +706,7 @@ Max-hit:${npc.getSwingHandler(false).calculateHit(npc, player, 1.0)}""", Compone replaceSlot(player, item.slot, plankType.plank) addXP(player, 90.0) showMagicTab(player) + */ } // Level 91 From 010cd584609fc64e4c7179937a92b66639d56ac8 Mon Sep 17 00:00:00 2001 From: randy Date: Tue, 5 Nov 2024 19:29:58 -0700 Subject: [PATCH 23/81] Updated server config to desired settings --- Server/worldprops/default.conf | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Server/worldprops/default.conf b/Server/worldprops/default.conf index 6024160fe..063fb5cbc 100644 --- a/Server/worldprops/default.conf +++ b/Server/worldprops/default.conf @@ -11,18 +11,18 @@ secret_key = "2009scape_development" write_logs = true msip = "127.0.0.1" #preload the map (Increases memory usage by 2GB but makes game ticks smoother) -preload_map = false +preload_map = true #--------Note: If both of the below are false, no database is required to run the server.-------------- #true = login requires password to be correct, passwords are hashed before stored. false = login does not care about the correctness of a password. -use_auth = false #NOTE: THIS MUST BE SET TO TRUE IN PRODUCTION! +use_auth = true #NOTE: THIS MUST BE SET TO TRUE IN PRODUCTION! #true - account data (credits, playtime, etc) is persisted, false - account data is purely temporary #NOTE: this does not affect actual save data, like stats, inventory, etc. -persist_accounts = false #NOTE: THIS MUST BE SET TO TRUE IN PRODUCTION! +persist_accounts = true #NOTE: THIS MUST BE SET TO TRUE IN PRODUCTION! noauth_default_admin = true #NOTE: If we are not using auth, this determines whether or not players are admins by default. #------------------------------------------------------------------------------------------------------ #The limit on how many different accounts a player can log into per day. -daily_accounts_per_ip = 3 -watchdog_enabled = true +daily_accounts_per_ip = 30 +watchdog_enabled = false connectivity_check_url = "https://google.com,https://2009scape.org" connectivity_timeout = 500 @@ -44,21 +44,21 @@ grafana_log_ttl_days = 7 [world] -name = "2009Scape" +name = "SnowScape" #name used for announcements of bots selling items on the GE -name_ge = "2009Scape" -debug = true -dev = true +name_ge = "SnowScape" +debug = false +dev = false start_gui = false -daily_restart = false +daily_restart = true #world number world_id = "1" country_id = "0" members = true #activity as displayed on the world list -activity = "2009Scape Classic." +activity = "SnowScape" pvp = false -default_xp_rate = 5.0 +default_xp_rate = 1.0 allow_slayer_reroll = false #enables a default clan for players to join automatically. Should be an account with the same name as @name, with a clan set up already. enable_default_clan = true @@ -81,14 +81,14 @@ enable_doubling_money_scammers = true wild_pvp_enabled = true jad_practice_enabled = true #minimum HA value for announcements of bots selling on ge -ge_announcement_limit = 500 -enable_castle_wars = false +ge_announcement_limit = 500000 +enable_castle_wars = true personalized_shops = true -bots_influence_ge_price = true +bots_influence_ge_price = false #verbose cutscene logging (for cutscenes in the new system) verbose_cutscene = false #show the rules the first time a player logs in -show_rules = true +show_rules = false #the number of revenants active at a time revenant_population = 30 #enable auto-buy/auto-sell on the GE. @@ -100,7 +100,7 @@ better_dfs = true #new player announcement new_player_announcement = true #enables holiday random events (no effect on normal random events) -holiday_event_randoms = true +holiday_event_randoms = false #force holiday randoms (can only force one at a time) force_halloween_randoms = false force_christmas_randoms = false From 54d755b12d5dc86d7631e3a894b1bc5109131a97 Mon Sep 17 00:00:00 2001 From: randy Date: Tue, 5 Nov 2024 19:48:25 -0700 Subject: [PATCH 24/81] Enabled quick banking --- Server/worldprops/default.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/worldprops/default.conf b/Server/worldprops/default.conf index 063fb5cbc..fd25dd94c 100644 --- a/Server/worldprops/default.conf +++ b/Server/worldprops/default.conf @@ -108,6 +108,8 @@ force_christmas_randoms = false runecrafting_formula_revision = 581 #enable the enhanced deep wilderness, where the area past the members' fence applies a red skull that boosts brawler/pvp drop rates enhanced_deep_wilderness = true +#enable opening the bank on left-clicking the booth, instead of starting dialogue with the banker +bank_booth_quick_open = true [paths] #path to the data folder, which contains the cache subfolder and such From 1ef61d8c33328800537ae911e60be6e133187662 Mon Sep 17 00:00:00 2001 From: randy Date: Tue, 5 Nov 2024 20:00:47 -0700 Subject: [PATCH 25/81] Reduced Magic Training Arena costs to 1/5th --- Server/src/main/content/minigame/mta/MTAShop.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/content/minigame/mta/MTAShop.java b/Server/src/main/content/minigame/mta/MTAShop.java index beb64a1b2..d8db649a8 100644 --- a/Server/src/main/content/minigame/mta/MTAShop.java +++ b/Server/src/main/content/minigame/mta/MTAShop.java @@ -32,8 +32,8 @@ public class MTAShop { /** * The prices. */ - private static final int[][] PRICES = new int[][] { { 30, 30, 300, 30 }, { 60, 60, 600, 60 }, { 150, 200, 1500, 150 }, { 240, 240, 2400, 240 }, { 400, 450, 4000, 400 }, { 350, 400, 3000, 350 }, { 120, 120, 1200, 120 }, { 175, 225, 1500, 175 }, { 450, 500, 5000, 450 }, { 500, 550, 6000, 500 }, { 200, 300, 2000, 200 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 0, 0, 5, 0 }, { 0, 1, 5, 1 }, { 0, 1, 0, 1 }, { 2, 1, 20, 1 }, { 2, 0, 0, 0 }, { 2, 2, 25, 2 }, { 2, 2, 25, 2 } }; - + private static final int[][] PRICES = new int[][] { { 6, 6, 60, 6 }, { 12, 12, 120, 12 }, { 30, 40, 300, 30 }, { 48, 48, 480, 48 }, { 80, 90, 800, 80 }, { 70, 80, 600, 70 }, { 24, 24, 240, 24 }, { 35, 45, 300, 35 }, { 90, 100, 1000, 90 }, { 100, 110, 1200, 100 }, { 40, 60, 400, 40 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 0, 0, 5, 0 }, { 0, 1, 5, 1 }, { 0, 1, 0, 1 }, { 2, 1, 20, 1 }, { 2, 0, 0, 0 }, { 2, 2, 25, 2 }, { 2, 2, 25, 2 } }; + /** * The container. */ From 4cd703097c576f2af7bfd46b476aa118220340b4 Mon Sep 17 00:00:00 2001 From: randy Date: Wed, 6 Nov 2024 11:03:21 -0700 Subject: [PATCH 26/81] Increased Pest Control reward points by 5x (10, 15, and 25 for each boat) --- .../minigame/pestcontrol/PestControlActivityPlugin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java b/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java index f1fb680a0..396d22355 100644 --- a/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java +++ b/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java @@ -133,14 +133,14 @@ public final class PestControlActivityPlugin extends ActivityPlugin { // type, // default } else if (success && p.getAttribute("pc_zeal", 0) >= 50) { - int amount = type.ordinal() + 2; + int amount = type.ordinal() == 0 ? 10 : type.ordinal() == 1 ? 15 : 25; p.getSavedData().getActivityData().increasePestPoints(amount); Item coins = new Item(995, p.getProperties().getCurrentCombatLevel() * 10); if (!p.getInventory().add(coins)) { GroundItemManager.create(coins, p); } // default, type, name - p.getDialogueInterpreter().open(3781, true, 1, type.ordinal() == 0 ? "two" : type.ordinal() == 1 ? "three" : "four"); + p.getDialogueInterpreter().open(3781, true, 1, type.ordinal() == 0 ? "ten" : type.ordinal() == 1 ? "fifteen" : "twenty-five"); } else { // default type, default p.getDialogueInterpreter().open(3781, true, 2, true); From bbaa4bbdbea730dfa0dce2a2264e804dda08ba2b Mon Sep 17 00:00:00 2001 From: randy Date: Wed, 6 Nov 2024 11:06:23 -0700 Subject: [PATCH 27/81] Fixed exp reward calc and reduced to one fifth The reward formula double-dipped with exp multipliers. Corrected the formula to match the original 2009 version, then reduced to 1/5 to account for the increased points given for each round. The increased points are meant to reduce the grind for the items, but not the purchasable exp. --- .../minigame/pestcontrol/reward/PCRewardInterface.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Server/src/main/content/minigame/pestcontrol/reward/PCRewardInterface.java b/Server/src/main/content/minigame/pestcontrol/reward/PCRewardInterface.java index 9dc6aab16..1fd3c5ca7 100644 --- a/Server/src/main/content/minigame/pestcontrol/reward/PCRewardInterface.java +++ b/Server/src/main/content/minigame/pestcontrol/reward/PCRewardInterface.java @@ -192,13 +192,13 @@ public final class PCRewardInterface extends ComponentPlugin { */ public static double calculateExperience(final Player player, final int skillId) { int level = player.getSkills().getStaticLevel(skillId); - double divideBy = 30;//17.5-33 ideal range + double multiplier = 35; if (skillId == Skills.PRAYER) { - divideBy = 67;// 34-75 ideal range + multiplier = 18; } else if (skillId == Skills.MAGIC || skillId == Skills.RANGE) { - divideBy = 29;//19.1-31 ideal range + multiplier = 32; } - return (int) ((level * level) / divideBy) * (player.getSkills().experienceMultiplier / 2); + return (int) ((level * level) / 600) * (multiplier) / 5; } /** From 6305e2a718add434d083bda5d802a99885cbfd79 Mon Sep 17 00:00:00 2001 From: randy Date: Wed, 6 Nov 2024 13:36:24 -0700 Subject: [PATCH 28/81] Rewrote Alchemy spells to use pulse, repeating up to 30 times --- .../skill/magic/modern/ModernListeners.kt | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/Server/src/main/content/global/skill/magic/modern/ModernListeners.kt b/Server/src/main/content/global/skill/magic/modern/ModernListeners.kt index 262824d2c..0d35ef56a 100644 --- a/Server/src/main/content/global/skill/magic/modern/ModernListeners.kt +++ b/Server/src/main/content/global/skill/magic/modern/ModernListeners.kt @@ -30,6 +30,8 @@ import org.rs09.consts.Items import org.rs09.consts.Scenery import org.rs09.consts.Sounds +import core.game.system.task.Pulse + class ModernListeners : SpellListener("modern"){ override fun defineListeners() { onCast(Modern.HOME_TELEPORT, NONE){ player, _ -> @@ -232,25 +234,41 @@ class ModernListeners : SpellListener("modern"){ player.pulseManager.clear() } - if (explorersRing) { - visualize(player, LOW_ALCH_ANIM, EXPLORERS_RING_GFX) - } else { - val weapon = getItemFromEquipment(player, EquipmentSlot.WEAPON) - if (weapon != null && weapon.id in MagicStaff.FIRE_RUNE.staves) { - visualize(player, if (high) HIGH_ALCH_STAFF_ANIM else LOW_ALCH_STAFF_ANIM, if (high) HIGH_ALCH_STAFF_GFX else LOW_ALCH_STAFF_GFX) - } else { - visualize(player, if (high) HIGH_ALCH_ANIM else LOW_ALCH_ANIM, if (high) HIGH_ALCH_GFX else LOW_ALCH_GFX) + player.pulseManager.run(object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + if (amountInInventory(player, item.id) == 0 || counter >= 150) + return true + removeAttribute(player, "spell:runes") + if (counter % 5 == 0) { + if (explorersRing) { + visualize(player, LOW_ALCH_ANIM, EXPLORERS_RING_GFX) + } else { + val weapon = getItemFromEquipment(player, EquipmentSlot.WEAPON) + if (weapon != null && weapon.id in MagicStaff.FIRE_RUNE.staves) { + visualize(player, if (high) HIGH_ALCH_STAFF_ANIM else LOW_ALCH_STAFF_ANIM, if (high) HIGH_ALCH_STAFF_GFX else LOW_ALCH_STAFF_GFX) + } else { + visualize(player, if (high) HIGH_ALCH_ANIM else LOW_ALCH_ANIM, if (high) HIGH_ALCH_GFX else LOW_ALCH_GFX) + } + } + playAudio(player, if (high) Sounds.HIGH_ALCHEMY_97 else Sounds.LOW_ALCHEMY_98) + player.dispatch(ItemAlchemizationEvent(item.id, high)) + if (high) + requires(player,55, arrayOf(Item(Items.FIRE_RUNE_554,5),Item(Items.NATURE_RUNE_561,1))) + else + requires(player,21, arrayOf(Item(Items.FIRE_RUNE_554,3),Item(Items.NATURE_RUNE_561))) + removeRunes(player, false) + addXP(player, if (high) 65.0 else 31.0) + if (player.inventory.remove(Item(item.id, 1)) && coins.amount > 0) { + player.inventory.add(coins) + } + //showMagicTab(player) + setDelay(player, 5) + } + counter++ + return false } - } - playAudio(player, if (high) Sounds.HIGH_ALCHEMY_97 else Sounds.LOW_ALCHEMY_98) - player.dispatch(ItemAlchemizationEvent(item.id, high)) - if (player.inventory.remove(Item(item.id, 1)) && coins.amount > 0) { - player.inventory.add(coins) - } - removeRunes(player) - addXP(player, if (high) 65.0 else 31.0) - showMagicTab(player) - setDelay(player, 5) + }) return true } From 8094465579da7bcecd838214375a913c0088e206 Mon Sep 17 00:00:00 2001 From: randy Date: Thu, 7 Nov 2024 10:02:10 -0700 Subject: [PATCH 29/81] Added ability to toggle bonecrusher function on blessed sickle When using "cast bloom", the sickle will grow nearby fungus as usual. If no fungus are grown, it will instead toggle the bone crusher attribute. --- .../region/morytania/quest/naturespirit/NSUtils.kt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Server/src/main/content/region/morytania/quest/naturespirit/NSUtils.kt b/Server/src/main/content/region/morytania/quest/naturespirit/NSUtils.kt index 03263c6c4..c47754946 100644 --- a/Server/src/main/content/region/morytania/quest/naturespirit/NSUtils.kt +++ b/Server/src/main/content/region/morytania/quest/naturespirit/NSUtils.kt @@ -85,10 +85,12 @@ object NSUtils { fun castBloom(player: Player): Boolean{ var success = false val region = forId(player.location.regionId) + /* if (player.skills.prayerPoints < 1) { player.packetDispatch.sendMessage("You don't have enough prayer points to do this.") return false } + */ handleVisuals(player) val locs = player.location.surroundingTiles for (o in locs) { @@ -114,6 +116,17 @@ object NSUtils { } } } + if (success) { + player.skills.decrementPrayerPoints(RandomFunction.random(1, 3).toDouble()) + } else { + if (getAttribute(player, "bonecrusher:enabled", false)) { + setAttribute(player, "/save:bonecrusher:enabled",false) + player.packetDispatch.sendMessage("Automatic Bone Burial: Disabled.") + } else { + setAttribute(player, "/save:bonecrusher:enabled",true) + player.packetDispatch.sendMessage("Automatic Bone Burial: Enabled.") + } + } return success } @@ -122,7 +135,6 @@ object NSUtils { * animation. */ private fun handleVisuals(player: Player) { - player.skills.decrementPrayerPoints(RandomFunction.random(1, 3).toDouble()) playAudio(player, Sounds.CAST_BLOOM_1493) val AROUND_YOU = player.location.surroundingTiles for (location in AROUND_YOU) { From d4da75e6abe34de54a0879438ff32cfcafce9ac5 Mon Sep 17 00:00:00 2001 From: randy Date: Thu, 7 Nov 2024 10:05:10 -0700 Subject: [PATCH 30/81] Added bonecrusher functionality If the blessed silver sickle is in the player inventory (not equipped) and they have enabled the feature by using "cast bloom", bones will not drop and instead the player will directly get the prayer experience. --- .../src/main/core/game/node/entity/npc/drop/NPCDropTables.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java b/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java index e4e1cd3b6..5a5db3d49 100644 --- a/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java +++ b/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java @@ -206,7 +206,7 @@ public final class NPCDropTables { if (bone == null) { return false; } - if (!player.getGlobalData().isEnableBoneCrusher()) { + if (!player.getInventory().containsItem(new Item(2963, 1)) || !player.getAttribute("bonecrusher:enabled", false)) { return false; } player.getSkills().addExperience(Skills.PRAYER, item.getAmount() * bone.getExperience()); From 4b5687b8ab328a703e4181fad6a60f7d7c6742e1 Mon Sep 17 00:00:00 2001 From: randy Date: Thu, 7 Nov 2024 11:53:41 -0700 Subject: [PATCH 31/81] Added small slayer exp drop even when not on slayer task --- Server/src/main/content/global/skill/slayer/SlayerManager.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/slayer/SlayerManager.kt b/Server/src/main/content/global/skill/slayer/SlayerManager.kt index 5542a7777..1bcf56803 100644 --- a/Server/src/main/content/global/skill/slayer/SlayerManager.kt +++ b/Server/src/main/content/global/skill/slayer/SlayerManager.kt @@ -101,9 +101,11 @@ class SlayerManager(val player: Player? = null) : LoginListener, PersistPlayer, val player = entity as? Player ?: return val slayer = getInstance(player) val flags = slayer.flags + var xp = npc.skills.maximumLifepoints.toDouble() + rewardXP(player, Skills.SLAYER, xp/3) if (slayer.hasTask() && npc.id in slayer.task!!.npcs) { - var xp = npc.skills.maximumLifepoints.toDouble() + if (slayer.task!!.dragon && inEquipment(player, Items.DRAGON_SLAYER_GLOVES_12862)) { xp *= 1.15 FOGGlovesManager.updateCharges(player) From 1f538d2976ddf3aa291015945fbe298ab460e81c Mon Sep 17 00:00:00 2001 From: randy Date: Thu, 7 Nov 2024 15:56:58 -0700 Subject: [PATCH 32/81] Added agility exp gain when running --- Server/src/main/core/game/node/entity/impl/WalkingQueue.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Server/src/main/core/game/node/entity/impl/WalkingQueue.java b/Server/src/main/core/game/node/entity/impl/WalkingQueue.java index fbd9d2e36..f20768b70 100644 --- a/Server/src/main/core/game/node/entity/impl/WalkingQueue.java +++ b/Server/src/main/core/game/node/entity/impl/WalkingQueue.java @@ -193,6 +193,9 @@ public final class WalkingQueue { if (hasTimerActive(player, "hamstrung")) { rate *= 4; } + //Snowscape custom: gain agility exp when running. getLevel returns int so we convert to double for the math + double experience = (Double.valueOf(player.getSkills().getLevel(Skills.AGILITY)) + 10)/50; + player.getSkills().addExperience(Skills.AGILITY, experience); return rate; } From 7779d03654e6fa06b94e2ca4819eee90d373f748 Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 8 Nov 2024 15:42:16 -0700 Subject: [PATCH 33/81] Added Beast of Burden Looting Mob drops will go to a beast of burden inventory if there is room. The Pack Yak, if it has Winter Storage scrolls in its inventory, will instead send drops straight to the bank at the cost of one scroll. --- .../node/entity/npc/drop/NPCDropTables.java | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java b/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java index 5a5db3d49..7421228f7 100644 --- a/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java +++ b/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java @@ -23,6 +23,11 @@ import core.api.utils.NPCDropTable; import core.game.ge.GrandExchange; import core.game.world.repository.Repository; +import content.global.skill.summoning.familiar.BurdenBeast; +import content.global.skill.summoning.familiar.Forager; +import content.global.skill.summoning.SummoningPouch; +import content.global.skill.summoning.familiar.PackYakNPC; + import java.util.ArrayList; import java.util.List; @@ -106,9 +111,17 @@ public final class NPCDropTables { item = item.getPlugin().getItem(item, npc); } if (!item.getDefinition().isStackable() && item.getAmount() > 1) { + if (hasValidFamiliar(player)) { + for (int i = 0; i < item.getAmount(); i++) { + if (!addItemFamiliar(player, new Item(item.getId()))) { + GroundItemManager.create(new Item(item.getId()), l, player); + } + } + } else { for (int i = 0; i < item.getAmount(); i++) { GroundItemManager.create(new Item(item.getId()), l, player); } + } return; } announceIfRare(player, item); @@ -121,7 +134,11 @@ public final class NPCDropTables { GroundItemManager.create(item, l); } } else { - GroundItem groundItem = GroundItemManager.create(item, l, getLooter(player, npc, item)); + Player looter = getLooter(player, npc, item); + if (hasValidFamiliar(looter) && addItemFamiliar(looter, item)) { + return; + } + GroundItem groundItem = GroundItemManager.create(item, l, looter); if(player instanceof AIPlayer) { AIRepository.addItem(groundItem); } @@ -134,6 +151,37 @@ public final class NPCDropTables { } } + /** Snowlab custom looting + * Check if the player has a valid familiar that can loot. + * @param player The player + * @return true if they have a valid familiar. + */ + private boolean hasValidFamiliar(Player player) { + if (!(player instanceof AIPlayer) && player.getFamiliarManager().hasFamiliar() && player.getFamiliarManager().getFamiliar().isBurdenBeast() && !(player.getFamiliarManager().getFamiliar() instanceof Forager) && !SummoningPouch.get(player.getFamiliarManager().getFamiliar().getPouchId()).abyssal){ + return true; + } else { + return false; + } + } + /** Snowlab custom looting + * Attempt adding item to familiar inventory. + * @param player The player + * @return true if item was successfully added. + */ + private boolean addItemFamiliar(Player player, Item item) { + if ((player.getFamiliarManager().getFamiliar() instanceof PackYakNPC) && ((BurdenBeast) player.getFamiliarManager().getFamiliar()).getContainer().contains(12435, 1) && player.getBank().add(item)) { + ((BurdenBeast) player.getFamiliarManager().getFamiliar()).getContainer().remove(new Item(12435, 1)); + player.sendMessage("Your familiar picked up and banked " + item.getAmount() + " " + item.getName() + "."); + return true; + } + if (((BurdenBeast) player.getFamiliarManager().getFamiliar()).getContainer().add(item)) { + player.sendMessage("Your familiar picked up " + item.getAmount() + " " + item.getName() + "."); + return true; + } else { + return false; + } + } + /** * Gets the looting player. * @param player the player. From 8a72ac52dba85bc93e2b12a0572c1531b5cc63d6 Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 8 Nov 2024 16:09:13 -0700 Subject: [PATCH 34/81] Changed Summoning shard cost for all pouches to 1 Shards are a pure gold sink, which we don't need. --- .../skill/summoning/SummoningPouch.java | 148 +++++++++--------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/Server/src/main/content/global/skill/summoning/SummoningPouch.java b/Server/src/main/content/global/skill/summoning/SummoningPouch.java index b91634318..90a502e6d 100644 --- a/Server/src/main/content/global/skill/summoning/SummoningPouch.java +++ b/Server/src/main/content/global/skill/summoning/SummoningPouch.java @@ -14,27 +14,27 @@ public enum SummoningPouch { /** * Represents a spirit wolf pouch. */ - SPIRIT_WOLF_POUCH(0, 12047, 1, 4.8, 6829, 0.1, 1, false, new Item(12158), new Item(12155), new Item(2859), new Item(12183, 7)), + SPIRIT_WOLF_POUCH(0, 12047, 1, 4.8, 6829, 0.1, 1, false, new Item(12158), new Item(12155), new Item(2859), new Item(12183, 1)), /** * Represents a dreadfowl pouch. */ - DREADFOWL_POUCH(1, 12043, 4, 9.3, 6825, 0.1, 1, false, new Item(12158), new Item(12155), new Item(2138), new Item(12183, 8)), + DREADFOWL_POUCH(1, 12043, 4, 9.3, 6825, 0.1, 1, false, new Item(12158), new Item(12155), new Item(2138), new Item(12183, 1)), /** * Represents a spirit spider pouch. */ - SPIRIT_SPIDER_POUCH(2, 12059, 10, 12.6, 6841, 0.2, 2, false, new Item(12158), new Item(12155), new Item(6291), new Item(12183, 8)), + SPIRIT_SPIDER_POUCH(2, 12059, 10, 12.6, 6841, 0.2, 2, false, new Item(12158), new Item(12155), new Item(6291), new Item(12183, 1)), /** * Represents a thorny snail pouch. */ - THORNY_SNAIL_POUCH(3, 12019, 13, 12.6, 6806, 0.2, 2, false, new Item(12158), new Item(12155), new Item(3363), new Item(12183, 9)), + THORNY_SNAIL_POUCH(3, 12019, 13, 12.6, 6806, 0.2, 2, false, new Item(12158), new Item(12155), new Item(3363), new Item(12183, 1)), /** * Represents a granite crab pouch. */ - GRANITE_CRAB_POUCH(4, 12009, 16, 21.6, 6796, 0.2, 2, false, new Item(12158), new Item(12155), new Item(440), new Item(12183, 7)), + GRANITE_CRAB_POUCH(4, 12009, 16, 21.6, 6796, 0.2, 2, false, new Item(12158), new Item(12155), new Item(440), new Item(12183, 1)), /** * Represents a spirit mosquito pouch. @@ -44,97 +44,97 @@ public enum SummoningPouch { /** * Represents a desrrt wyrm pouch. */ - DESERT_WYRM_POUCH(6, 12049, 18, 31.2, 6831, 0.4, 1, false, new Item(12159), new Item(12155), new Item(1783), new Item(12183, 45)), + DESERT_WYRM_POUCH(6, 12049, 18, 31.2, 6831, 0.4, 1, false, new Item(12159), new Item(12155), new Item(1783), new Item(12183, 1)), /** * Represents a spirit scorpion pouch. */ - SPIRIT_SCORPION_POUCH(7, 12055, 19, 83.2, 6837, 0.9, 2, false, new Item(12160), new Item(12155), new Item(3095), new Item(12183, 57)), + SPIRIT_SCORPION_POUCH(7, 12055, 19, 83.2, 6837, 0.9, 2, false, new Item(12160), new Item(12155), new Item(3095), new Item(12183, 1)), /** * Represents a spirit tz-kih pouch. */ - SPIRIT_TZ_KIH_POUCH(8, 12808, 22, 96.8, 7361, 1.1, 3, false, new Item(12160), new Item(12168), new Item(12155), new Item(12183, 64)), + SPIRIT_TZ_KIH_POUCH(8, 12808, 22, 96.8, 7361, 1.1, 3, false, new Item(12160), new Item(12168), new Item(12155), new Item(12183, 1)), /** * Represents an albino rat pouch. */ - ALBINO_RAT_POUCH(9, 12067, 23, 202.4, 6847, 2.3, 1, false, new Item(12163), new Item(12155), new Item(2134), new Item(12183, 75)), + ALBINO_RAT_POUCH(9, 12067, 23, 202.4, 6847, 2.3, 1, false, new Item(12163), new Item(12155), new Item(2134), new Item(12183, 1)), /** * Represents a spirit kalphite pouch. */ - SPIRIT_KALPHITE_POUCH(10, 12063, 25, 220, 6994, 2.5, 3,false, new Item(12163), new Item(12155), new Item(3138), new Item(12183, 51)), + SPIRIT_KALPHITE_POUCH(10, 12063, 25, 220, 6994, 2.5, 3,false, new Item(12163), new Item(12155), new Item(3138), new Item(12183, 1)), /** * Represents a compost mound pouch. */ - COMPOST_MOUND_POUCH(11, 12091, 28, 49.8, 6871, 0.6, 6, false, new Item(12159), new Item(12155), new Item(6032), new Item(12183, 47)), + COMPOST_MOUND_POUCH(11, 12091, 28, 49.8, 6871, 0.6, 6, false, new Item(12159), new Item(12155), new Item(6032), new Item(12183, 1)), /** * Represents a giant chinchompa pouch. */ - GIANT_CHINCHOMPA_POUCH(12, 12800, 29, 255.2, 7353, 2.9, 1, false, new Item(12163), new Item(12155), new Item(10033), new Item(12183, 84)), + GIANT_CHINCHOMPA_POUCH(12, 12800, 29, 255.2, 7353, 2.9, 1, false, new Item(12163), new Item(12155), new Item(10033), new Item(12183, 1)), /** * Represents a vampire bat pouch. */ - VAMPIRE_BAT_POUCH(13, 12053, 31, 136, 6835, 1.5, 4, false, new Item(12160), new Item(12155), new Item(3325), new Item(12183, 81)), + VAMPIRE_BAT_POUCH(13, 12053, 31, 136, 6835, 1.5, 4, false, new Item(12160), new Item(12155), new Item(3325), new Item(12183, 1)), /** * Represents a honey badger pouch. */ - HONEY_BADGER_POUCH(14, 12065, 32, 140.8, 6845, 1.6, 4, false, new Item(12160), new Item(12155), new Item(12156), new Item(12183, 84)), + HONEY_BADGER_POUCH(14, 12065, 32, 140.8, 6845, 1.6, 4, false, new Item(12160), new Item(12155), new Item(12156), new Item(12183, 1)), /** * Represents a beaver pouch. */ - BEAVER_POUCH(15, 12021, 33, 57.6, 6808, 0.7, 4, true, new Item(12159), new Item(12155), new Item(1519), new Item(12183, 72)), + BEAVER_POUCH(15, 12021, 33, 57.6, 6808, 0.7, 4, true, new Item(12159), new Item(12155), new Item(1519), new Item(12183, 1)), /** * Represents a void ravager pouch. */ - VOID_RAVAGER_POUCH(16, 12818, 34, 59.6, 7370, 0.7, 4, false, new Item(12159), new Item(12164), new Item(12155), new Item(12183, 74)), + VOID_RAVAGER_POUCH(16, 12818, 34, 59.6, 7370, 0.7, 4, false, new Item(12159), new Item(12164), new Item(12155), new Item(12183, 1)), /** * Represents a void spinner pouch. */ - VOID_SPINNER_POUCH(17, 12780, 34, 59.6, 7333, 0.7, 4, true, new Item(12163), new Item(12166), new Item(12155), new Item(12183, 74)), + VOID_SPINNER_POUCH(17, 12780, 34, 59.6, 7333, 0.7, 4, true, new Item(12163), new Item(12166), new Item(12155), new Item(12183, 1)), /** * Represents a void torcher pouch. */ - VOID_TORCHER_POUCH(18, 12798, 34, 59.6, 7351, 0.7, 4, false, new Item(12163), new Item(12167), new Item(12155), new Item(12183, 74)), + VOID_TORCHER_POUCH(18, 12798, 34, 59.6, 7351, 0.7, 4, false, new Item(12163), new Item(12167), new Item(12155), new Item(12183, 1)), /** * Represents a void shifter pouch. */ - VOID_SHIFTER_POUCH(19, 12814, 34, 59.6, 7367, 0.7, 4, false, new Item(12163), new Item(12165), new Item(12155), new Item(12183, 74)), + VOID_SHIFTER_POUCH(19, 12814, 34, 59.6, 7367, 0.7, 4, false, new Item(12163), new Item(12165), new Item(12155), new Item(12183, 1)), /** * Represents a bronze minotaur pouch. */ - BRONZE_MINOTAUR_POUCH(64, 12073, 36, 316.8, 6853, 3.6, 3, false, new Item(12163), new Item(12155), new Item(2349), new Item(12183, 102)), + BRONZE_MINOTAUR_POUCH(64, 12073, 36, 316.8, 6853, 3.6, 3, false, new Item(12163), new Item(12155), new Item(2349), new Item(12183, 1)), /** * Represents an iron minotaur pouch. */ - IRON_MINOTAUR_POUCH(65, 12075, 46, 404.8, 6855, 4.6, 9, false, new Item(12163), new Item(12155), new Item(2351), new Item(12183, 125)), + IRON_MINOTAUR_POUCH(65, 12075, 46, 404.8, 6855, 4.6, 9, false, new Item(12163), new Item(12155), new Item(2351), new Item(12183, 1)), /** * Represents a steel minotaur pouch. */ - STEEL_MINOTAUR_POUCH(66, 12077, 56, 492.8, 6857, 5.6, 9, false, new Item(12163), new Item(12155), new Item(2353), new Item(12183, 141)), + STEEL_MINOTAUR_POUCH(66, 12077, 56, 492.8, 6857, 5.6, 9, false, new Item(12163), new Item(12155), new Item(2353), new Item(12183, 1)), /** * Represents a mithril minotaur pouch. */ - MITHRIL_MINOTAUR_POUCH(67, 12079, 66, 580.8, 6859, 6.6, 9,false, new Item(12163), new Item(12155), new Item(2359), new Item(12183, 152)), + MITHRIL_MINOTAUR_POUCH(67, 12079, 66, 580.8, 6859, 6.6, 9,false, new Item(12163), new Item(12155), new Item(2359), new Item(12183, 1)), /** * Represents an adamant minotaur pouch. */ - ADAMANT_MINOTAUR_POUCH(68, 12081, 76, 668.8, 6861, 7.6, 9, false, new Item(12163), new Item(12155), new Item(2361), new Item(12183, 144)), + ADAMANT_MINOTAUR_POUCH(68, 12081, 76, 668.8, 6861, 7.6, 9, false, new Item(12163), new Item(12155), new Item(2361), new Item(12183, 1)), /** * Represents a rune minotaur pouch. @@ -144,132 +144,132 @@ public enum SummoningPouch { /** * Represents a bull ant pouch. */ - BULL_ANT_POUCH(20, 12087, 40, 52.8, 6867, 0.6, 5, false, new Item(12158), new Item(12155), new Item(6010), new Item(12183, 11)), + BULL_ANT_POUCH(20, 12087, 40, 52.8, 6867, 0.6, 5, false, new Item(12158), new Item(12155), new Item(6010), new Item(12183, 1)), /** * Represents a macaw pouch. */ - MACAW_POUCH(21, 12071, 41, 72.4, 6851, 0.8, 5, true, new Item(12159), new Item(12155), new Item(249), new Item(12183, 78)), + MACAW_POUCH(21, 12071, 41, 72.4, 6851, 0.8, 5, true, new Item(12159), new Item(12155), new Item(249), new Item(12183, 1)), /** * Represents an evil turnip pouch. */ - EVIL_TURNIP_POUCH(22, 12051, 42, 184.8, 6833, 2.1, 5, false, new Item(12160), new Item(12155), new Item(12153), new Item(12183, 104)), + EVIL_TURNIP_POUCH(22, 12051, 42, 184.8, 6833, 2.1, 5, false, new Item(12160), new Item(12155), new Item(12153), new Item(12183, 1)), /** * Represents a spirit cockatrice pouch. */ - SPIRIT_COCKATRICE_POUCH(23, 12095, 43, 75.2, 6875, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12109), new Item(12183, 88)), + SPIRIT_COCKATRICE_POUCH(23, 12095, 43, 75.2, 6875, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12109), new Item(12183, 1)), /** * Represents a spirit guthatrice pouch. */ - SPIRIT_GUTHATRICE_POUCH(24, 12097, 43, 75.2, 6877, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12111), new Item(12183, 88)), + SPIRIT_GUTHATRICE_POUCH(24, 12097, 43, 75.2, 6877, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12111), new Item(12183, 1)), /** * Represents a spirit saratrice pouch. */ - SPIRIT_SARATRICE_POUCH(25, 12099, 43, 75.2, 6879, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12113), new Item(12183, 88)), + SPIRIT_SARATRICE_POUCH(25, 12099, 43, 75.2, 6879, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12113), new Item(12183, 1)), /** * Represents a spirit zamatrice pouch. */ - SPIRIT_ZAMATRICE_POUCH(26, 12101, 43, 75.2, 6881, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12115), new Item(12183, 88)), + SPIRIT_ZAMATRICE_POUCH(26, 12101, 43, 75.2, 6881, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12115), new Item(12183, 1)), /** * Represents a spirit pengatrice pouch. */ - SPIRIT_PENGATRICE_POUCH(27, 12103, 43, 75.2, 6883, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12117), new Item(12183, 88)), + SPIRIT_PENGATRICE_POUCH(27, 12103, 43, 75.2, 6883, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12117), new Item(12183, 1)), /** * Represents a coraxatrice pouch. */ - SPIRIT_CORAXATRICE_POUCH(28, 12105, 43, 75.2, 6885, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12119), new Item(12183, 88)), + SPIRIT_CORAXATRICE_POUCH(28, 12105, 43, 75.2, 6885, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12119), new Item(12183, 1)), /** * Represents a vulatrice pouch. */ - SPIRIT_VULATRICE(29, 12107, 43, 75.2, 6887, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12121), new Item(12183, 88)), + SPIRIT_VULATRICE(29, 12107, 43, 75.2, 6887, 0.9, 5, false, new Item(12159), new Item(12155), new Item(12121), new Item(12183, 1)), /** * Represents a pyrelord pouch. */ - PYRELORD_POUCH(30, 12816, 46, 202.4, 7377, 2.3, 5, false, new Item(12160), new Item(12155), new Item(590), new Item(12183, 111)), + PYRELORD_POUCH(30, 12816, 46, 202.4, 7377, 2.3, 5, false, new Item(12160), new Item(12155), new Item(590), new Item(12183, 1)), /** * Represents a magpie pouch. */ - MAGPIE_POUCH(31, 12041, 47, 83.2, 6824, 0.9, 5, true, new Item(12159), new Item(12155), new Item(1635), new Item(12183, 88)), + MAGPIE_POUCH(31, 12041, 47, 83.2, 6824, 0.9, 5, true, new Item(12159), new Item(12155), new Item(1635), new Item(12183, 1)), /** * Represents a bloated leech pouch. */ - BLOATED_LEECH_POUCH(32, 12061, 49, 215.2, 6843, 2.4, 5, false, new Item(12160), new Item(12155), new Item(2132), new Item(12183, 117)), + BLOATED_LEECH_POUCH(32, 12061, 49, 215.2, 6843, 2.4, 5, false, new Item(12160), new Item(12155), new Item(2132), new Item(12183, 1)), /** * Represents a spirit terrorbird pouch. */ - SPIRIT_TERRORBIRD_POUCH(33, 12007, 52, 68.4, 6794, 0.8, 6, true, new Item(12158), new Item(12155), new Item(9978), new Item(12183, 12)), + SPIRIT_TERRORBIRD_POUCH(33, 12007, 52, 68.4, 6794, 0.8, 6, true, new Item(12158), new Item(12155), new Item(9978), new Item(12183, 1)), /** * Represents an abyssal parasite pouch. */ - ABYSSAL_PARASITE_POUCH(34, true,12035, 54, 94.8, 6818, 1.1, 6, false, new Item(12159), new Item(12155), new Item(12161), new Item(12183, 106)), + ABYSSAL_PARASITE_POUCH(34, true,12035, 54, 94.8, 6818, 1.1, 6, false, new Item(12159), new Item(12155), new Item(12161), new Item(12183, 1)), /** * Represents a spirit jelly pouch. */ - SPIRIT_JELLY_POUCH(35, 12027, 55, 484, 6992, 5.5, 6, false, new Item(12163), new Item(12155), new Item(1937), new Item(12183, 151)), + SPIRIT_JELLY_POUCH(35, 12027, 55, 484, 6992, 5.5, 6, false, new Item(12163), new Item(12155), new Item(1937), new Item(12183, 1)), /** * Represents an ibis pouch. */ - IBIS_POUCH(36, 12531, 56, 98.8, 6991, 1.1, 6, true, new Item(12159), new Item(12155), new Item(311), new Item(12183, 109)), + IBIS_POUCH(36, 12531, 56, 98.8, 6991, 1.1, 6, true, new Item(12159), new Item(12155), new Item(311), new Item(12183, 1)), /** * Represents a spirit kyatt pouch. */ - SPIRIT_KYATT_POUCH(37, 12812, 57, 501.6, 7365, 5.7, 6, false, new Item(12163), new Item(12155), new Item(10103), new Item(12183, 153)), + SPIRIT_KYATT_POUCH(37, 12812, 57, 501.6, 7365, 5.7, 6, false, new Item(12163), new Item(12155), new Item(10103), new Item(12183, 1)), /** * Represents a spirit larupia pouch. */ - SPIRIT_LARUPIA_POUCH(38, 12784, 57, 501.6, 7337, 5.7, 6, false, new Item(12163), new Item(12155), new Item(10095), new Item(12183, 155)), + SPIRIT_LARUPIA_POUCH(38, 12784, 57, 501.6, 7337, 5.7, 6, false, new Item(12163), new Item(12155), new Item(10095), new Item(12183, 1)), /** * Represents a spirit graahk pouch. */ - SPIRIT_GRAAHK_POUCH(39, 12810, 57, 501.6, 7363, 5.7, 6, false, new Item(12163), new Item(12155), new Item(10099), new Item(12183, 154)), + SPIRIT_GRAAHK_POUCH(39, 12810, 57, 501.6, 7363, 5.7, 6, false, new Item(12163), new Item(12155), new Item(10099), new Item(12183, 1)), /** * Represents a karamthulhu overlord pouch. */ - KARAMTHULHU_POUCH(40, 12023, 58, 510.4, 6809, 5.8, 6, false, new Item(12163), new Item(12155), new Item(6667), new Item(12183, 144)), + KARAMTHULHU_POUCH(40, 12023, 58, 510.4, 6809, 5.8, 6, false, new Item(12163), new Item(12155), new Item(6667), new Item(12183, 1)), /** * Represents a smoke devil pouch. */ - SMOKE_DEVIL_POUCH(41, 12085, 61, 268, 6865, 3, 7, false, new Item(12160), new Item(12155), new Item(9736), new Item(12183, 141)), + SMOKE_DEVIL_POUCH(41, 12085, 61, 268, 6865, 3, 7, false, new Item(12160), new Item(12155), new Item(9736), new Item(12183, 1)), /** * Represents an abyssal lurker pouch. */ - ABYSSAL_LUKRER(42, true,12037, 62, 109.6, 6820, 1.9, 9, false, new Item(12159), new Item(12155), new Item(12161), new Item(12183, 119)), + ABYSSAL_LUKRER(42, true,12037, 62, 109.6, 6820, 1.9, 9, false, new Item(12159), new Item(12155), new Item(12161), new Item(12183, 1)), /** * Represents a spirit cobra pouch. */ - SPIRIT_COBRA_POUCH(43, 12015, 63, 276.8, 6802, 3.1, 6, false, new Item(12160), new Item(12155), new Item(6287), new Item(12183, 116)), + SPIRIT_COBRA_POUCH(43, 12015, 63, 276.8, 6802, 3.1, 6, false, new Item(12160), new Item(12155), new Item(6287), new Item(12183, 1)), /** * Represents a stranger plant pouch. */ - STRANGER_PLANT_POUCH(44, 12045, 64, 281.6, 6827, 3.2, 6, false, new Item(12160), new Item(12155), new Item(8431), new Item(12183, 128)), + STRANGER_PLANT_POUCH(44, 12045, 64, 281.6, 6827, 3.2, 6, false, new Item(12160), new Item(12155), new Item(8431), new Item(12183, 1)), /** * Represents a barker toad pouch. */ - BARKER_TOAD_POUCH(45, 12123, 66, 87, 6889, 1, 7, false, new Item(12158), new Item(12155), new Item(2150), new Item(12183, 11)), + BARKER_TOAD_POUCH(45, 12123, 66, 87, 6889, 1, 7, false, new Item(12158), new Item(12155), new Item(2150), new Item(12183, 1)), /** * Represents a war tortoise pouch. @@ -279,62 +279,62 @@ public enum SummoningPouch { /** * Represents a bunyip pouch. */ - BUNYIP_POUCH(47, 12029, 68, 119.2, 6813, 1.4, 7, true, new Item(12159), new Item(12155), new Item(383), new Item(12183, 110)), + BUNYIP_POUCH(47, 12029, 68, 119.2, 6813, 1.4, 7, true, new Item(12159), new Item(12155), new Item(383), new Item(12183, 1)), /** * Represents a fruit bat pouch. */ - FRUIT_BAT_POUCH(48, 12033, 69, 121.2, 6817, 1.4, 8, true, new Item(12159), new Item(12155), new Item(1963), new Item(12183, 130)), + FRUIT_BAT_POUCH(48, 12033, 69, 121.2, 6817, 1.4, 8, true, new Item(12159), new Item(12155), new Item(1963), new Item(12183, 1)), /** * Represents a ravenous locust pouch. */ - RAVENOUS_LOCUST_POUCH(49, 12820, 70, 132, 7372, 1.5, 4, false, new Item(12160), new Item(12155), new Item(1933), new Item(12183, 79)), + RAVENOUS_LOCUST_POUCH(49, 12820, 70, 132, 7372, 1.5, 4, false, new Item(12160), new Item(12155), new Item(1933), new Item(12183, 1)), /** * Represents an arctic bear pouch. */ - ARCTIC_BEAR_POUCH(50, 12057, 71, 93.2, 6839, 1.1, 8, false, new Item(12158), new Item(12155), new Item(10117), new Item(12183, 14)), + ARCTIC_BEAR_POUCH(50, 12057, 71, 93.2, 6839, 1.1, 8, false, new Item(12158), new Item(12155), new Item(10117), new Item(12183, 1)), /** * Represents a Phoenix */ - PHOENIX_POUCH(50, 14623, 72, 93.2, 8575, 1.1, 8, false, new Item(12160, 1), new Item(12183, 165), new Item(12155, 1), new Item(14616, 1)), + PHOENIX_POUCH(50, 14623, 72, 93.2, 8575, 1.1, 8, false, new Item(12160, 1), new Item(12183, 1), new Item(12155, 1), new Item(14616, 1)), /** * Represents an obsidian golem pouch. */ - OBSIDIAN_GOLEM_POUCH(51, 12792, 73, 642.4, 7345, 7.3, 8, false, new Item(12163), new Item(12155), new Item(12168), new Item(12183, 195)), + OBSIDIAN_GOLEM_POUCH(51, 12792, 73, 642.4, 7345, 7.3, 8, false, new Item(12163), new Item(12155), new Item(12168), new Item(12183, 1)), /** * Represents a granite lobster pouch. */ - GRANITE_LOBSTER_POUCH(52, 12069, 74, 325.6, 6849, 3.7, 8, false, new Item(12160), new Item(12155), new Item(6979), new Item(12183, 166)), + GRANITE_LOBSTER_POUCH(52, 12069, 74, 325.6, 6849, 3.7, 8, false, new Item(12160), new Item(12155), new Item(6979), new Item(12183, 1)), /** * Represents a praying mantis pouch. */ - PRAYING_MANTIS_POUCH(53, 12011, 75, 329.6, 6798, 3.6, 8, false, new Item(12160), new Item(12155), new Item(2460), new Item(12183, 168)), + PRAYING_MANTIS_POUCH(53, 12011, 75, 329.6, 6798, 3.6, 8, false, new Item(12160), new Item(12155), new Item(2460), new Item(12183, 1)), /** * Represents a forge regent pouch. */ - FORGE_REGENT_BEAST(54, 12782, 76, 134, 7335, 1.5, 9, false, new Item(12159), new Item(12155), new Item(10020), new Item(12183, 141)), + FORGE_REGENT_BEAST(54, 12782, 76, 134, 7335, 1.5, 9, false, new Item(12159), new Item(12155), new Item(10020), new Item(12183, 1)), /** * Represents a talon beast pouch. */ - TALON_BEAST_POUCH(55, 12794, 77, 1015.2, 7347, 3.8, 9, false, new Item(12160), new Item(12155), new Item(12162), new Item(12183, 174)), + TALON_BEAST_POUCH(55, 12794, 77, 1015.2, 7347, 3.8, 9, false, new Item(12160), new Item(12155), new Item(12162), new Item(12183, 1)), /** * Represents a giant ent pouch. */ - GIANT_ENT_POUCH(56, 12013, 78, 136.8, 6800, 1.6, 8, false, new Item(12159), new Item(5933), new Item(12155), new Item(12183, 124)), + GIANT_ENT_POUCH(56, 12013, 78, 136.8, 6800, 1.6, 8, false, new Item(12159), new Item(5933), new Item(12155), new Item(12183, 1)), /** * Represents a hydra pouch. */ - HYDRA_POUCH(60, 12025, 80, 140.8, 6811, 1.6, 9, false, new Item(12159), new Item(571), new Item(12155), new Item(12183, 128)), + HYDRA_POUCH(60, 12025, 80, 140.8, 6811, 1.6, 9, false, new Item(12159), new Item(571), new Item(12155), new Item(12183, 1)), /** * Represents a spirit dagannoth pouch. @@ -344,62 +344,62 @@ public enum SummoningPouch { /** * Represents a unicorn stallion pouch. */ - UNICORN_STALLION_POUCH(70, 12039, 88, 154.4, 6822, 1.8, 9, true, new Item(12159), new Item(237), new Item(12155), new Item(12183, 140)), + UNICORN_STALLION_POUCH(70, 12039, 88, 154.4, 6822, 1.8, 9, true, new Item(12159), new Item(237), new Item(12155), new Item(12183, 1)), /** * Represents a wolpertinger pouch. */ - WOLPERTINGER_POUCH(72, 12089, 92, 404.8, 6869, 4.5, 10, false, new Item(12160), new Item(2859), new Item(3226), new Item(12155), new Item(12183, 203)), + WOLPERTINGER_POUCH(72, 12089, 92, 404.8, 6869, 4.5, 10, false, new Item(12160), new Item(2859), new Item(3226), new Item(12155), new Item(12183, 1)), /** * Represents a pack yak pouch. */ - PACK_YAK_POUCH(75, 12093, 96, 422.4, 6873, 4.8, 10, true, new Item(12160), new Item(10818), new Item(12155), new Item(12183, 211)), + PACK_YAK_POUCH(75, 12093, 96, 422.4, 6873, 4.8, 10, true, new Item(12160), new Item(10818), new Item(12155), new Item(12183, 1)), /** * Represents a fire titan pouch. */ - FIRE_TITAN_POUCH(57, 12802, 79, 695.2, 7355, 7.9, 9, false, new Item(12163), new Item(1442), new Item(12155), new Item(12183, 198)), + FIRE_TITAN_POUCH(57, 12802, 79, 695.2, 7355, 7.9, 9, false, new Item(12163), new Item(1442), new Item(12155), new Item(12183, 1)), /** * Represents a moss titan pouch. */ - MOSS_TITAN_POUCH(58, 12804, 79, 695.2, 7357, 7.9, 9, false, new Item(12163), new Item(1440), new Item(12155), new Item(12183, 198)), + MOSS_TITAN_POUCH(58, 12804, 79, 695.2, 7357, 7.9, 9, false, new Item(12163), new Item(1440), new Item(12155), new Item(12183, 1)), /** * Represents an ice titan pouch. */ - ICE_TITAN_POUCH(59, 12806, 79, 695.2, 7359, 7.9, 9, false, new Item(12163), new Item(1438), new Item(1444), new Item(12155), new Item(12183, 198)), + ICE_TITAN_POUCH(59, 12806, 79, 695.2, 7359, 7.9, 9, false, new Item(12163), new Item(1438), new Item(1444), new Item(12155), new Item(12183, 1)), /** * Represents a lava titan pouch. */ - LAVA_TITAN_POUCH(62, 12788, 83, 730.4, 7341, 8.3, 9, false, new Item(12163), new Item(12168), new Item(12155), new Item(12183, 219)), + LAVA_TITAN_POUCH(62, 12788, 83, 730.4, 7341, 8.3, 9, false, new Item(12163), new Item(12168), new Item(12155), new Item(12183, 1)), /** * Represents a swamp titan pouch. */ - SWAMP_TITAN_POUCH(63, 12776, 85, 373.6, 7329, 4.2, 9, false, new Item(12160), new Item(10149), new Item(12155), new Item(12183, 150)), + SWAMP_TITAN_POUCH(63, 12776, 85, 373.6, 7329, 4.2, 9, false, new Item(12160), new Item(10149), new Item(12155), new Item(12183, 1)), /** * Represents a geyser titan pouch. */ - GEYSER_TITAN_POUCH(71, 12786, 89, 783.2, 7339, 8.9, 9, false, new Item(12163), new Item(1444), new Item(12155), new Item(12183, 222)), + GEYSER_TITAN_POUCH(71, 12786, 89, 783.2, 7339, 8.9, 9, false, new Item(12163), new Item(1444), new Item(12155), new Item(12183, 1)), /** * Represents an abyssal titan pouch. */ - ABYSSAL_TITAN_POUCH(73, true,12796, 93, 163.2, 7349, 1.9, 10, false, new Item(12159), new Item(12161), new Item(12155), new Item(12183, 113)), + ABYSSAL_TITAN_POUCH(73, true,12796, 93, 163.2, 7349, 1.9, 10, false, new Item(12159), new Item(12161), new Item(12155), new Item(12183, 1)), /** * Represents an iron titan pouch. */ - IRON_TITAN_POUCH(74, 12822, 95, 417.6, 7375, 4.7, 10, false, new Item(12160), new Item(1115), new Item(12155), new Item(12183, 198)), + IRON_TITAN_POUCH(74, 12822, 95, 417.6, 7375, 4.7, 10, false, new Item(12160), new Item(1115), new Item(12155), new Item(12183, 1)), /** * Represents a steel titan pouch. */ - STEEL_TITAN_POUCH(76, 12790, 99, 435.2, 7343, 4.9, 10, false, new Item(12160), new Item(1119), new Item(12155), new Item(12183, 178)), + STEEL_TITAN_POUCH(76, 12790, 99, 435.2, 7343, 4.9, 10, false, new Item(12160), new Item(1119), new Item(12155), new Item(12183, 1)), SACRED_CLAY_POUCH_1(-1, 14422, 1, 0, 8240, 0, 1, false, new Item(14182)), SACRED_CLAY_POUCH_2(-1, 14424, 20, 0, 8242, 0, 3, false, new Item(14184)), From 4eebee34c4760ce7534e76eb73030f58a217bac4 Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 8 Nov 2024 16:21:10 -0700 Subject: [PATCH 35/81] Removed Beast of Burden carrying restrictions --- .../content/global/skill/summoning/familiar/BurdenBeast.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/src/main/content/global/skill/summoning/familiar/BurdenBeast.java b/Server/src/main/content/global/skill/summoning/familiar/BurdenBeast.java index d6a3100d0..628ff5077 100644 --- a/Server/src/main/content/global/skill/summoning/familiar/BurdenBeast.java +++ b/Server/src/main/content/global/skill/summoning/familiar/BurdenBeast.java @@ -83,6 +83,7 @@ public abstract class BurdenBeast extends Familiar { * @return {@code True} if so. */ public boolean isAllowed(Player owner, Item item) { + /* if (item.getValue() > 50000) { owner.getPacketDispatch().sendMessage("This item is too valuable to trust to this familiar."); return false; @@ -95,6 +96,7 @@ public abstract class BurdenBeast extends Familiar { owner.getPacketDispatch().sendMessage("You can't store " + item.getName().toLowerCase() + " in this familiar."); return false; } + */ if(SummoningPouch.get(this.getPouchId()).abyssal){ if(!item.getName().toLowerCase().contains("essence")) { owner.getPacketDispatch().sendMessage("You can only give unnoted essence to this familiar."); From 6195af3e7b80398a0f651d40178c4c8a9792b6b8 Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 8 Nov 2024 16:22:21 -0700 Subject: [PATCH 36/81] Increased Abyssal Lurker carrying capacity --- .../global/skill/summoning/familiar/AbyssalLurkerNPC.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/summoning/familiar/AbyssalLurkerNPC.java b/Server/src/main/content/global/skill/summoning/familiar/AbyssalLurkerNPC.java index 9fb1effdc..b6184c4a8 100644 --- a/Server/src/main/content/global/skill/summoning/familiar/AbyssalLurkerNPC.java +++ b/Server/src/main/content/global/skill/summoning/familiar/AbyssalLurkerNPC.java @@ -28,7 +28,7 @@ public class AbyssalLurkerNPC extends BurdenBeast { * @param id The id. */ public AbyssalLurkerNPC(Player owner, int id) { - super(owner, id, 4100, 12037, 3, 7, WeaponInterface.STYLE_CAST); + super(owner, id, 4100, 12037, 3, 24, WeaponInterface.STYLE_CAST); } @Override From acfd5c90b9d16efb153d305c9d6c5f4a22df08ca Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 8 Nov 2024 16:22:42 -0700 Subject: [PATCH 37/81] Increased Abyssal Parasite carrying capacity --- .../global/skill/summoning/familiar/AbyssalParasiteNPC.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/summoning/familiar/AbyssalParasiteNPC.java b/Server/src/main/content/global/skill/summoning/familiar/AbyssalParasiteNPC.java index 795484722..551e2db9a 100644 --- a/Server/src/main/content/global/skill/summoning/familiar/AbyssalParasiteNPC.java +++ b/Server/src/main/content/global/skill/summoning/familiar/AbyssalParasiteNPC.java @@ -36,7 +36,7 @@ public class AbyssalParasiteNPC extends BurdenBeast { * @param id The id. */ public AbyssalParasiteNPC(Player owner, int id) { - super(owner, id, 3000, 12035, 1, 7); + super(owner, id, 3000, 12035, 1, 18); } @Override From 3fd5f60d7fb3de3ddef93c33aa6081581def7b19 Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 8 Nov 2024 16:23:02 -0700 Subject: [PATCH 38/81] Increased Abyssal Titan carrying capacity --- .../content/global/skill/summoning/familiar/AbyssalTitanNPC.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/summoning/familiar/AbyssalTitanNPC.kt b/Server/src/main/content/global/skill/summoning/familiar/AbyssalTitanNPC.kt index a7ed47a6d..eaeb73b45 100644 --- a/Server/src/main/content/global/skill/summoning/familiar/AbyssalTitanNPC.kt +++ b/Server/src/main/content/global/skill/summoning/familiar/AbyssalTitanNPC.kt @@ -21,7 +21,7 @@ import org.rs09.consts.NPCs @Initializable class AbyssalTitanNPC constructor(owner: Player? = null, id: Int = NPCs.ABYSSAL_TITAN_7349) : - BurdenBeast(owner, id, 3200, Items.ABYSSAL_TITAN_POUCH_12796, 6, 7, WeaponInterface.STYLE_ACCURATE) { + BurdenBeast(owner, id, 3200, Items.ABYSSAL_TITAN_POUCH_12796, 6, 30, WeaponInterface.STYLE_ACCURATE) { override fun construct(owner: Player, id: Int): Familiar { return AbyssalTitanNPC(owner, id) } From 7113ef393d3e5c15f577608687309c8e35f49fe4 Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 8 Nov 2024 17:29:55 -0700 Subject: [PATCH 39/81] Added Swamp Tar to Lumbridge General Store --- Server/data/configs/shops.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/data/configs/shops.json b/Server/data/configs/shops.json index 714e32a73..fd2444578 100644 --- a/Server/data/configs/shops.json +++ b/Server/data/configs/shops.json @@ -213,7 +213,7 @@ "general_store": "true", "id": "25", "title": "Lumbridge General Store", - "stock": "{1931,30,100}-{1935,30,100}-{1735,10,100}-{1925,10,100}-{1923,10,100}-{1887,10,100}-{590,10,100}-{1755,10,100}-{2347,10,100}-{550,10,100}-{9003,10,100}" + "stock": "{1931,30,100}-{1935,30,100}-{1735,10,100}-{1925,10,100}-{1923,10,100}-{1887,10,100}-{590,10,100}-{1755,10,100}-{2347,10,100}-{550,10,100}-{9003,10,100}-{1939,1000,1}" }, { "npcs": "4716", From 81779f1fae23dd5e3f26374ed6122230c5cad00e Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 8 Nov 2024 21:12:11 -0700 Subject: [PATCH 40/81] Fixing missing healing on Void Spinner Familiar --- .../global/skill/summoning/familiar/VoidFamiliarNPC.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/summoning/familiar/VoidFamiliarNPC.java b/Server/src/main/content/global/skill/summoning/familiar/VoidFamiliarNPC.java index 4f8d3fab5..817b0501c 100644 --- a/Server/src/main/content/global/skill/summoning/familiar/VoidFamiliarNPC.java +++ b/Server/src/main/content/global/skill/summoning/familiar/VoidFamiliarNPC.java @@ -195,8 +195,9 @@ public final class VoidFamiliarNPC implements Plugin { public void handleFamiliarTick() { super.handleFamiliarTick(); if (healDelay < GameWorld.getTicks()) { - getSkills().heal(1); + owner.getSkills().heal(1); healDelay = GameWorld.getTicks() + 25; + owner.graphics(Graphics.create(1507), 1); } } From f4c51dbafeb62827a8709bddd0855c266386666f Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 8 Nov 2024 21:17:27 -0700 Subject: [PATCH 41/81] Reduced Quest Point Requirements for Culinomancer shop so that all gloves are obtainable --- .../misthalin/lumbridge/handlers/CulinomancerShop.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Server/src/main/content/region/misthalin/lumbridge/handlers/CulinomancerShop.kt b/Server/src/main/content/region/misthalin/lumbridge/handlers/CulinomancerShop.kt index e82bcce41..727743512 100644 --- a/Server/src/main/content/region/misthalin/lumbridge/handlers/CulinomancerShop.kt +++ b/Server/src/main/content/region/misthalin/lumbridge/handlers/CulinomancerShop.kt @@ -14,9 +14,9 @@ import kotlin.collections.HashMap class CulinomancerShop : LoginListener { //Enable the chest if the player has 18 quest points or more override fun login(player: Player) { - if(player.questRepository.points >= 18){ + if(player.questRepository.points >= 10){ setVarbit(player, 1850, 5) - setAttribute(player, "culino-tier", player.questRepository.points / 18) //Set this, so we can check if the player has gained a tier during server runtime + setAttribute(player, "culino-tier", player.questRepository.points / 10) //Set this, so we can check if the player has gained a tier during server runtime //Restock pulse for this player (yes, this means the chest will only restock if the player has logged in. Shop system needs work in order to do otherwise.) val restockPulse = object : Pulse(100){ //Run once a minute @@ -49,7 +49,7 @@ class CulinomancerShop : LoginListener { fun getShop(player: Player, food: Boolean): Shop { val uid = player.details.uid val points = player.questRepository.points - val tier = (points / 18) + val tier = (points / 10) if (tier != getAttribute(player, "culino-tier", 0)) //If player tier has changed { foodShops.remove(uid) //Clear the previous shops, so they can regenerate with the new tier @@ -69,7 +69,7 @@ class CulinomancerShop : LoginListener { //Generate default food stock based on an amount of total QP. private fun generateFoodStock(points: Int): Array { val stock = Array(foodStock.size) { ShopItem(0, 0) } - val maxQty = when (val qpTier = (points / 18) - 1) { + val maxQty = when (val qpTier = (points / 10) - 1) { 0, 1, 2, 3, 4 -> 1 + qpTier else -> qpTier + (qpTier + (qpTier - 5)) //5 = 10, 6 = 13, 7 = 15, etc } @@ -83,14 +83,14 @@ class CulinomancerShop : LoginListener { //Generate default gear stock based on an amount of total QP. private fun generateGearStock(points: Int): Array { val stock = Array(gearStock.size) { ShopItem(0, 0) } - val qpTier = (points / 18) + val qpTier = (points / 10) for ((index, item) in stock.withIndex()) item.itemId = gearStock[index] for (i in 0 until min(qpTier, 10)) { stock[i].amount = 30 stock[i + 10].amount = 5 } - stock[9].amount = 1 + //stock[9].amount = 1 return stock } From 13e4a0b6408df693b4b02b8096e7d54f0f226221 Mon Sep 17 00:00:00 2001 From: randy Date: Sat, 9 Nov 2024 09:08:05 -0700 Subject: [PATCH 42/81] Added code to customize logout timer. Set to 1 hour. --- .../main/core/net/packet/PacketProcessor.kt | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Server/src/main/core/net/packet/PacketProcessor.kt b/Server/src/main/core/net/packet/PacketProcessor.kt index 51e4324e9..875d3693f 100644 --- a/Server/src/main/core/net/packet/PacketProcessor.kt +++ b/Server/src/main/core/net/packet/PacketProcessor.kt @@ -307,8 +307,24 @@ object PacketProcessor { pkt.player.interfaceManager.switchWindowMode(pkt.windowMode) } is Packet.TrackingAfkTimeout -> { - //if (pkt.player.details.rights != Rights.ADMINISTRATOR) - //pkt.player.packetDispatch.sendLogout() + /* After 5 minutes idle, the client sends an afk packet every 10 seconds. + *This code counts the number of afk packets recieved, resetting the count if they are more than 100 ticks apart. + *This allows us to customize the afk logout timer + */ + if (pkt.player.details.rights != Rights.ADMINISTRATOR) { + if (GameWorld.ticks - pkt.player.getAttribute("afk:lasttick", 0) > 100) { + pkt.player.setAttribute("afk:count", 0) + } else { + pkt.player.setAttribute("afk:count", pkt.player.getAttribute("afk:count", 0) + 1) + } + pkt.player.setAttribute("afk:lasttick", GameWorld.ticks) + if (pkt.player.getAttribute("afk:count", 0) == 300) { + pkt.player.sendMessage("You have been idle for 55 minutes and will be logged out soon.") + } + if (pkt.player.getAttribute("afk:count", 0) >= 330) { + pkt.player.packetDispatch.sendLogout() + } + } } is Packet.TrackingCameraPos -> { //TODO Refactor the player monitor to be actually useful and log this From 325b8f6f2043490904fc5be23ce5501238397df7 Mon Sep 17 00:00:00 2001 From: randy Date: Sat, 9 Nov 2024 15:45:48 -0700 Subject: [PATCH 43/81] Crystal Bow and Shield no longer lose stats as they degrade --- Server/data/configs/item_configs.json | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Server/data/configs/item_configs.json b/Server/data/configs/item_configs.json index 852a6fc39..08580edac 100644 --- a/Server/data/configs/item_configs.json +++ b/Server/data/configs/item_configs.json @@ -38817,7 +38817,7 @@ "name": "Crystal bow 9/10", "archery_ticket_price": "0", "id": "4215", - "bonuses": "0,0,0,0,96,0,0,0,0,0,0,0,0,0,68" + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70" }, { "requirements": "{4,70}-{16,50}", @@ -38838,7 +38838,7 @@ "name": "Crystal bow 8/10", "archery_ticket_price": "0", "id": "4216", - "bonuses": "0,0,0,0,92,0,0,0,0,0,0,0,0,0,66" + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70" }, { "requirements": "{4,70}-{16,50}", @@ -38859,7 +38859,7 @@ "name": "Crystal bow 7/10", "archery_ticket_price": "0", "id": "4217", - "bonuses": "0,0,0,0,88,0,0,0,0,0,0,0,0,0,64" + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70" }, { "requirements": "{4,70}-{16,50}", @@ -38880,7 +38880,7 @@ "name": "Crystal bow 6/10", "archery_ticket_price": "0", "id": "4218", - "bonuses": "0,0,0,0,84,0,0,0,0,0,0,0,0,0,62" + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70" }, { "requirements": "{4,70}-{16,50}", @@ -38901,7 +38901,7 @@ "name": "Crystal bow 5/10", "archery_ticket_price": "0", "id": "4219", - "bonuses": "0,0,0,0,80,0,0,0,0,0,0,0,0,0,60" + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70" }, { "requirements": "{4,70}-{16,50}", @@ -38922,7 +38922,7 @@ "name": "Crystal bow 4/10", "archery_ticket_price": "0", "id": "4220", - "bonuses": "0,0,0,0,76,0,0,0,0,0,0,0,0,0,58" + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70" }, { "requirements": "{4,70}-{16,50}", @@ -38943,7 +38943,7 @@ "name": "Crystal bow 3/10", "archery_ticket_price": "0", "id": "4221", - "bonuses": "0,0,0,0,72,0,0,0,0,0,0,0,0,0,56" + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70" }, { "requirements": "{4,70}-{16,50}", @@ -38964,7 +38964,7 @@ "name": "Crystal bow 2/10", "archery_ticket_price": "0", "id": "4222", - "bonuses": "0,0,0,0,68,0,0,0,0,0,0,0,0,0,54" + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70" }, { "requirements": "{4,70}-{16,50}", @@ -38985,7 +38985,7 @@ "name": "Crystal bow 1/10", "archery_ticket_price": "0", "id": "4223", - "bonuses": "0,0,0,0,64,0,0,0,0,0,0,0,0,0,52" + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70" }, { "requirements": "{1,70}-{16,50}", @@ -39028,7 +39028,7 @@ "archery_ticket_price": "0", "id": "4226", "absorb": "6,0,12", - "bonuses": "0,0,0,-10,-10,49,52,51,0,78,68,0,0,0,0", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", "equipment_slot": "5" }, { @@ -39042,7 +39042,7 @@ "archery_ticket_price": "0", "id": "4227", "absorb": "6,0,12", - "bonuses": "0,0,0,-10,-10,47,50,49,0,76,66,0,0,0,0", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", "equipment_slot": "5" }, { @@ -39056,7 +39056,7 @@ "archery_ticket_price": "0", "id": "4228", "absorb": "6,0,12", - "bonuses": "0,0,0,-10,-10,45,48,47,0,74,65,0,0,0,0", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", "equipment_slot": "5" }, { @@ -39070,7 +39070,7 @@ "archery_ticket_price": "0", "id": "4229", "absorb": "6,0,12", - "bonuses": "0,0,0,-10,-10,43,46,45,0,72,63,0,0,0,0", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", "equipment_slot": "5" }, { @@ -39084,7 +39084,7 @@ "archery_ticket_price": "0", "id": "4230", "absorb": "6,0,12", - "bonuses": "0,0,0,-10,-10,41,44,43,0,70,61,0,0,0,0", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", "equipment_slot": "5" }, { @@ -39098,7 +39098,7 @@ "archery_ticket_price": "0", "id": "4231", "absorb": "6,0,12", - "bonuses": "0,0,0,-10,-10,39,42,41,0,68,59,0,0,0,0", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", "equipment_slot": "5" }, { @@ -39112,7 +39112,7 @@ "archery_ticket_price": "0", "id": "4232", "absorb": "6,0,12", - "bonuses": "0,0,0,-10,-10,37,40,39,0,66,58,0,0,0,0", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", "equipment_slot": "5" }, { @@ -39126,7 +39126,7 @@ "archery_ticket_price": "0", "id": "4233", "absorb": "6,0,12", - "bonuses": "0,0,0,-10,-10,35,38,37,0,64,56,0,0,0,0", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", "equipment_slot": "5" }, { @@ -39140,7 +39140,7 @@ "archery_ticket_price": "0", "id": "4234", "absorb": "6,0,12", - "bonuses": "0,0,0,-10,-10,33,36,35,0,62,54,0,0,0,0", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", "equipment_slot": "5" }, { From 974c44a04166a66b0cd3e258bde97dd2ce541261 Mon Sep 17 00:00:00 2001 From: randy Date: Sat, 9 Nov 2024 20:29:01 -0700 Subject: [PATCH 44/81] Remove staff check when autocasting Slayer Dart and Claws of Guthix This should have no effect on the slayer dart spell, but does allow Claws of Guthix to be autocast with the Guthix Staff and not just the Void Mace. --- .../src/main/core/game/node/entity/combat/spell/MagicSpell.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java b/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java index 12059a76c..cf003c648 100644 --- a/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java +++ b/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java @@ -203,6 +203,7 @@ public abstract class MagicSpell implements Plugin { } if (caster instanceof Player) { CombatSpell spell = ((Player) caster).getProperties().getAutocastSpell(); + /* Snowscape custom. Removing this allows guthix staff to autocast claws of guthix. if (spell != null) { boolean slayer = ((Player) caster).getEquipment().get(3).getName().contains("layer's staff"); boolean voidKnight = ((Player) caster).getEquipment().get(3).getName().contains("knight mace"); @@ -211,6 +212,7 @@ public abstract class MagicSpell implements Plugin { return false; } } + */ } if((spellId == 12 || spellId == 30 || spellId == 56) && caster instanceof Player){ if (caster.getAttribute("entangleDelay", 0) > GameWorld.getTicks()) { From 98e8cd4592e86c6e4e2247d7851e6c888c593af8 Mon Sep 17 00:00:00 2001 From: randy Date: Sat, 9 Nov 2024 21:47:02 -0700 Subject: [PATCH 45/81] Fixed incorrect autocast animation for the three god spells Also future-proofed by adding animation for Iban's blast, even though the staff is not obtainable yet and the spell can't normally be autocast. --- .../node/entity/combat/spell/CombatSpell.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Server/src/main/core/game/node/entity/combat/spell/CombatSpell.java b/Server/src/main/core/game/node/entity/combat/spell/CombatSpell.java index 3601d6849..0db21b192 100644 --- a/Server/src/main/core/game/node/entity/combat/spell/CombatSpell.java +++ b/Server/src/main/core/game/node/entity/combat/spell/CombatSpell.java @@ -156,10 +156,20 @@ public abstract class CombatSpell extends MagicSpell { } if (entity.getProperties().getAutocastSpell() == this && (entity instanceof Player || animation == null)) { Player p = entity.asPlayer(); - if (p.getProperties().getAutocastSpell().getSpellId() == 31) { - entity.animate(new Animation(1576)); - } else { - entity.animate(AUTOCAST_ANIMATION); + switch(p.getProperties().getAutocastSpell().getSpellId()) { + case 31: + entity.animate(new Animation(1576, Priority.HIGH)); + break; + case 41: + case 42: + case 43: + entity.animate(new Animation(811, Priority.HIGH)); + break; + case 29: + entity.animate(new Animation(708, Priority.HIGH)); + break; + default: + entity.animate(AUTOCAST_ANIMATION); } } else { if (entity instanceof NPC) { From e8afa4e529bf21bab5829d15cfbbb724262aff9c Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 15:15:10 -0700 Subject: [PATCH 46/81] Add damage scaling to Crumble Undead The spell damage scales like Magic Dart, but due to the limitation of only affecting undead enemies, deals 2 more damage. If the enemy is not undead, deals only 1 damage (set to 1 instead of 0 to prevent splashing abuse). --- .../main/core/game/node/entity/combat/spell/SpellType.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Server/src/main/core/game/node/entity/combat/spell/SpellType.java b/Server/src/main/core/game/node/entity/combat/spell/SpellType.java index 828a88804..d58dd2887 100644 --- a/Server/src/main/core/game/node/entity/combat/spell/SpellType.java +++ b/Server/src/main/core/game/node/entity/combat/spell/SpellType.java @@ -47,7 +47,11 @@ public enum SpellType { CRUMBLE_UNDEAD(1.2) { @Override public int getImpactAmount(Entity e, Entity victim, int base) { - return 15; // Hits as high as Earth blast + if (((NPC) victim).getTask() != null && ((NPC) victim).getTask().undead) { + return 12 + (e.getSkills().getLevel(Skills.MAGIC) / 10); + } + ((Player) e).sendMessage("Your spell does almost no damage, as your target is not undead."); + return 1; } }, From d21452a8bffedcd7572d4899962147c02787f090 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 17:36:38 -0700 Subject: [PATCH 47/81] Increased arrowheads and other ranged ammo produced from bars by 3x This is done with the intention to balance the value of rune arrows and bolts with the value of a rune bar (12800 if you make high-end rune gear and high alch it), as well as the value of the crystal bow (72 gp per shot). --- .../main/content/global/skill/smithing/SmithingType.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Server/src/main/content/global/skill/smithing/SmithingType.java b/Server/src/main/content/global/skill/smithing/SmithingType.java index fd38a6209..e4a05e640 100644 --- a/Server/src/main/content/global/skill/smithing/SmithingType.java +++ b/Server/src/main/content/global/skill/smithing/SmithingType.java @@ -32,7 +32,7 @@ public enum SmithingType { /** * Crossbow bolt */ - TYPE_CROSSBOW_BOLT(1, 50, 51, new int[] { 56, 55, 54, 53 }, 10), + TYPE_CROSSBOW_BOLT(1, 50, 51, new int[] { 56, 55, 54, 53 }, 30), /** * Sword @@ -42,7 +42,7 @@ public enum SmithingType { /** * Dart tips */ - TYPE_DART_TIP(1, 66, 67, new int[] { 72, 71, 70, 69 }, 10), + TYPE_DART_TIP(1, 66, 67, new int[] { 72, 71, 70, 69 }, 30), /** * Nails @@ -66,7 +66,7 @@ public enum SmithingType { /** * Arrow Tips */ - TYPE_ARROW_TIP(1, 106, 107, new int[] { 112, 111, 110, 109 }, 15), + TYPE_ARROW_TIP(1, 106, 107, new int[] { 112, 111, 110, 109 }, 45), /** * Scimitar @@ -86,7 +86,7 @@ public enum SmithingType { /** * Throwing Knife */ - TYPE_THROWING_KNIFE(1, 138, 139, new int[] { 144, 143, 142, 141 }, 5), + TYPE_THROWING_KNIFE(1, 138, 139, new int[] { 144, 143, 142, 141 }, 15), /** * Full helm From de4f67832b2ed7a3a7e582828134e96efa572308 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 18:45:01 -0700 Subject: [PATCH 48/81] Changed crystal equipment to recharge with rune arrows and kiteshields instead of coins New Crystal Bows require 3600 rune arrows, recharging requires 3000. New Shields cost 24 Rune Kite shields, recharging requires 20. --- .../quest/rovingelves/IslwynDialogue.java | 62 ++++++++++++------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/Server/src/main/content/region/tirranwn/quest/rovingelves/IslwynDialogue.java b/Server/src/main/content/region/tirranwn/quest/rovingelves/IslwynDialogue.java index b24862a1f..e1bcd2184 100644 --- a/Server/src/main/content/region/tirranwn/quest/rovingelves/IslwynDialogue.java +++ b/Server/src/main/content/region/tirranwn/quest/rovingelves/IslwynDialogue.java @@ -235,7 +235,7 @@ public class IslwynDialogue extends DialoguePlugin { case 33: switch (buttonId) { case 1: - interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Ah, very well.", "I will sell you a new bow or shield for 900,000 coins."); + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Ah, very well.", "I will make you a new bow from 3,600 Rune Arrows", "or a shield from 24 Rune Kiteshields."); stage = 37; break; case 2: @@ -245,7 +245,7 @@ public class IslwynDialogue extends DialoguePlugin { } break; case 34: - interpreter.sendOptions("Select an Option", "Recharge seed into bow", "Recharge seed into shield"); + interpreter.sendOptions("Select an Option", "Recharge seed into bow with 3000 Rune Arrows", "Recharge seed into shield with 20 Rune Kiteshields"); stage = 35; break; case 35: @@ -266,13 +266,13 @@ public class IslwynDialogue extends DialoguePlugin { stage = 500; } int timesRecharged = player.getAttribute("rovingelves:crystal-equip-recharges", 0); - int price = crystalWeaponPrice(timesRecharged); - if (!player.getInventory().contains(995, price)) { - interpreter.sendDialogue(String.format("You don't have enough coins, you need %d.", price)); + int price = crystalBowPrice(false); + if (!player.getInventory().contains(892, price)) { + interpreter.sendDialogue(String.format("You don't have enough Rune Arrows, you need %d.", price)); stage = 500; } - if (player.getInventory().contains(995, price) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { - if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(995, price))) { + if (player.getInventory().contains(892, price) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { + if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(892, price))) { player.getInventory().add(new Item(4214, 1)); player.incrementAttribute("/save:rovingelves:crystal-equip-recharges", 1); end(); @@ -285,13 +285,13 @@ public class IslwynDialogue extends DialoguePlugin { stage = 500; } timesRecharged = player.getAttribute("rovingelves:crystal-equip-recharges", 0); - price = crystalWeaponPrice(timesRecharged); - if (!player.getInventory().contains(995, price)) { - interpreter.sendDialogue("You don't have enough coins."); + price = crystalShieldPrice(false); + if (!player.getInventory().contains(1201, price)) { + interpreter.sendDialogue(String.format("You don't have enough Rune Kiteshields, you need %d.", price)); stage = 500; } - if (player.getInventory().contains(995, price) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { - if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(995, price))) { + if (player.getInventory().contains(1201, price) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { + if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(1201, price))) { player.getInventory().add(new Item(4225, 1)); player.incrementAttribute("/save:rovingelves:crystal-equip-recharges", 1); end(); @@ -315,13 +315,13 @@ public class IslwynDialogue extends DialoguePlugin { } break; case 39: - price = crystalWeaponPrice(0); - if (!player.getInventory().contains(995, price)) { - interpreter.sendDialogue("You don't have enough coins."); + price = crystalBowPrice(true); + if (!player.getInventory().contains(892, price)) { + interpreter.sendDialogue(String.format("You don't have enough Rune Arrows, you need %d.", price)); stage = 500; } - if (player.getInventory().contains(995, price)) { - if (player.getInventory().remove(new Item(995, price))) { + if (player.getInventory().contains(892, price)) { + if (player.getInventory().remove(new Item(892, price))) { if (!player.getInventory().add(new Item(4212, 1))) { GroundItemManager.create(new Item(4212, 1), player); } @@ -330,13 +330,13 @@ public class IslwynDialogue extends DialoguePlugin { } break; case 40: - price = crystalWeaponPrice(0); - if (!player.getInventory().contains(995, price)) { - interpreter.sendDialogue("You don't have enough coins."); + price = crystalShieldPrice(true); + if (!player.getInventory().contains(1201, price)) { + interpreter.sendDialogue(String.format("You don't have enough Rune Kiteshields, you need %d.", price)); stage = 500; } - if (player.getInventory().contains(995, price)) { - if (player.getInventory().remove(new Item(995, price))) { + if (player.getInventory().contains(1201, price)) { + if (player.getInventory().remove(new Item(1201, price))) { if (!player.getInventory().add(new Item(4224, 1))) { GroundItemManager.create(new Item(4224, 1), player); } @@ -377,7 +377,21 @@ public class IslwynDialogue extends DialoguePlugin { } // 900k for the 0th recharge (or for new bows), decreasing by 180k per recharge down to 180k - public int crystalWeaponPrice(int timesRecharged) { - return Math.max(900000 - 180000 * timesRecharged, 180000); + //public int crystalWeaponPrice(int timesRecharged) { + // return Math.max(900000 - 180000 * timesRecharged, 180000); + //} + public int crystalBowPrice(boolean isNew) { + if (isNew) { + return 3600; + } else { + return 3000; + } + } + public int crystalShieldPrice(boolean isNew) { + if (isNew) { + return 24; + } else { + return 20; + } } } From 7da14bd3b8ca907e959f484b7f3af045d45ac6a4 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 18:46:47 -0700 Subject: [PATCH 49/81] Increased Crystal Equipment charges to 12,000 --- .../handlers/item/equipment/CrystalEquipmentRegister.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/content/global/handlers/item/equipment/CrystalEquipmentRegister.kt b/Server/src/main/content/global/handlers/item/equipment/CrystalEquipmentRegister.kt index 2bb7bb48d..4504e9dfd 100644 --- a/Server/src/main/content/global/handlers/item/equipment/CrystalEquipmentRegister.kt +++ b/Server/src/main/content/global/handlers/item/equipment/CrystalEquipmentRegister.kt @@ -7,7 +7,7 @@ class CrystalEquipmentRegister : StartupListener { val shield: Array = arrayOf(Items.NEW_CRYSTAL_SHIELD_4224, Items.CRYSTAL_SHIELD_FULL_4225, Items.CRYSTAL_SHIELD_9_10_4226, Items.CRYSTAL_SHIELD_8_10_4227, Items.CRYSTAL_SHIELD_7_10_4228, Items.CRYSTAL_SHIELD_6_10_4229, Items.CRYSTAL_SHIELD_5_10_4230, Items.CRYSTAL_SHIELD_4_10_4231, Items.CRYSTAL_SHIELD_3_10_4232, Items.CRYSTAL_SHIELD_2_10_4233, Items.CRYSTAL_SHIELD_1_10_4234, Items.CRYSTAL_SEED_4207) val bow: Array = arrayOf(Items.NEW_CRYSTAL_BOW_4212, Items.CRYSTAL_BOW_FULL_4214, Items.CRYSTAL_BOW_9_10_4215, Items.CRYSTAL_BOW_8_10_4216, Items.CRYSTAL_BOW_7_10_4217, Items.CRYSTAL_BOW_6_10_4218, Items.CRYSTAL_BOW_5_10_4219, Items.CRYSTAL_BOW_4_10_4220, Items.CRYSTAL_BOW_3_10_4221, Items.CRYSTAL_BOW_2_10_4222, Items.CRYSTAL_BOW_1_10_4223, Items.CRYSTAL_SEED_4207) override fun startup() { - EquipmentDegrader.registerSet(250, shield) - EquipmentDegrader.registerSet(250, bow) + EquipmentDegrader.registerSet(1200, shield) + EquipmentDegrader.registerSet(1200, bow) } } \ No newline at end of file From 2e65f0d186ed1798770c3ccb6e44f157d7b7ed1a Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 19:06:13 -0700 Subject: [PATCH 50/81] Changed combat spells to only consume runes 33% of the time This is part of the attempt to balance ammo production and consumption rates. --- .../core/game/node/entity/combat/spell/MagicSpell.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java b/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java index cf003c648..6259add5a 100644 --- a/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java +++ b/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java @@ -222,12 +222,12 @@ public abstract class MagicSpell implements Plugin { } if (caster instanceof Player) { Player p = (Player) caster; - if(p.getEquipment().get(3) != null && p.getEquipment().get(3).getId() == 14726){ - if(RandomFunction.getRandom(100) < 13){ - p.sendMessage("Your staff negates the rune requirement of the spell."); + //if(p.getEquipment().get(3) != null && p.getEquipment().get(3).getId() == 14726){ + if(RandomFunction.getRandom(100) > 33){ + //p.sendMessage("Your staff negates the rune requirement of the spell."); return true; } - } + //} if (runes == null) { return true; } From 48069e2234080a10c933928080d6e6984edadeb6 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 20:47:32 -0700 Subject: [PATCH 51/81] Added Lunar Robes to Moonclan clothing shop There is no way to get the robes until the quest is implemented, so this is a temporary solution. The robes are very cheap, but they also aren't very good so it should be fine. --- Server/data/configs/shops.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/data/configs/shops.json b/Server/data/configs/shops.json index fd2444578..2f6a5ff1f 100644 --- a/Server/data/configs/shops.json +++ b/Server/data/configs/shops.json @@ -1599,7 +1599,7 @@ "general_store": "false", "id": "181", "title": "MoonClan Fine Clothes", - "stock": "{9068,10,100}-{9069,10,100}-{9070,10,100}-{9071,10,100}-{9072,10,100}-{9073,10,100}-{9074,10,100}-{1733,50,100}-{1734,500,100}" + "stock": "{9068,10,100}-{9069,10,100}-{9070,10,100}-{9071,10,100}-{9072,10,100}-{9073,10,100}-{9074,10,100}-{1733,50,100}-{1734,500,100}-{9084,10,100}-{9096,10,100}-{9097,10,100}-{9098,10,100}-{9099,10,100}-{9100,10,100}-{9101,10,100}-{9102,10,100}-{9104,10,100}" }, { "npcs": "", From da071b795d19f83f8cf296c0cf2b2d0d897ed08e Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 20:55:02 -0700 Subject: [PATCH 52/81] Normal trees now have a chance to deplete, like higher level trees This is done to make collecting normal logs for arrowshafts less click-intensive. --- .../global/skill/gather/woodcutting/WoodcuttingListener.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/gather/woodcutting/WoodcuttingListener.kt b/Server/src/main/content/global/skill/gather/woodcutting/WoodcuttingListener.kt index c73b135b6..4ca385088 100644 --- a/Server/src/main/content/global/skill/gather/woodcutting/WoodcuttingListener.kt +++ b/Server/src/main/content/global/skill/gather/woodcutting/WoodcuttingListener.kt @@ -156,7 +156,7 @@ class WoodcuttingListener : InteractionListener { //OSRS: https://oldschool.runescape.wiki/w/Woodcutting scroll down to the mechanics section //RS3 : https://runescape.wiki/w/Woodcutting scroll down to the mechanics section, and expand the tree felling chances table if (resource.getRespawnRate() > 0) { - if (RandomFunction.roll(8) || listOf(1, 2, 3, 4, 6).contains(resource.identifier.toInt())){ + if (RandomFunction.roll(8) || listOf(2, 3, 4, 6).contains(resource.identifier.toInt())){ if (resource.isFarming()) { val fPatch = forObject(node.asScenery()) if (fPatch != null) { From df3fc6c9739f9bd6e2c9ab989c0b57353f46be83 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 21:17:30 -0700 Subject: [PATCH 53/81] Increased the Herb:Tar ratio from 1:15 to 1:45 Salamanders burn through ammo, and herbs are a lot of work to come by. This increases how much ammo you get per herb by 3x. --- .../main/content/global/skill/herblore/HerbTarPulse.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/src/main/content/global/skill/herblore/HerbTarPulse.java b/Server/src/main/content/global/skill/herblore/HerbTarPulse.java index 45793be82..a63c5f4f5 100644 --- a/Server/src/main/content/global/skill/herblore/HerbTarPulse.java +++ b/Server/src/main/content/global/skill/herblore/HerbTarPulse.java @@ -25,7 +25,7 @@ public final class HerbTarPulse extends SkillPulse { /** * Represents the swamp tar item. */ - private static final Item SWAMP_TAR = new Item(1939, 15); + private static final Item SWAMP_TAR = new Item(1939, 45); /** * Represents the tar to make. @@ -65,7 +65,7 @@ public final class HerbTarPulse extends SkillPulse { return false; } if (!player.getInventory().containsItem(SWAMP_TAR)) { - player.getPacketDispatch().sendMessage("You need at least 15 swamp tar in order to do this."); + player.getPacketDispatch().sendMessage("You need at least 45 swamp tar in order to do this."); return false; } return true; @@ -83,7 +83,7 @@ public final class HerbTarPulse extends SkillPulse { return false; } if (player.getInventory().containsItem(SWAMP_TAR) && player.getInventory().containsItem(tar.getIngredient()) && player.getInventory().remove(SWAMP_TAR) && player.getInventory().remove(tar.getIngredient())) { - final Item item = new Item(tar.getTar().getId(), 15); + final Item item = new Item(tar.getTar().getId(), 45); player.getInventory().add(item); player.getSkills().addExperience(Skills.HERBLORE, tar.getExperience(), true); player.getPacketDispatch().sendMessage("You add the " + tar.getIngredient().getName().toLowerCase().replace("clean", "").trim() + " to the swamp tar."); From fa808accd4c6ba55f92a0a0384557c37db4c69aa Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 22:09:13 -0700 Subject: [PATCH 54/81] Added requirement checks to the teleport tablets --- .../global/handlers/item/TeleTabsListener.kt | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/Server/src/main/content/global/handlers/item/TeleTabsListener.kt b/Server/src/main/content/global/handlers/item/TeleTabsListener.kt index 4a3a0bf75..45925a4e9 100644 --- a/Server/src/main/content/global/handlers/item/TeleTabsListener.kt +++ b/Server/src/main/content/global/handlers/item/TeleTabsListener.kt @@ -11,6 +11,8 @@ import core.game.node.item.Item import core.game.world.map.Location import core.api.hasRequirement; +import core.cache.def.impl.ItemDefinition; + class TeleTabsListener : InteractionListener { enum class TeleTabs(val item: Int, val location: Location, val exp: Double, val requirementCheck: (Player) -> Boolean = { true }) { @@ -18,23 +20,37 @@ class TeleTabsListener : InteractionListener { player -> hasRequirement(player, "Plague City"); }), AIR_ALTAR_TELEPORT(13599, Location.create(2978, 3296, 0), 0.0), - ASTRAL_ALTAR_TELEPORT(13611, Location.create(2156, 3862, 0), 0.0), - BLOOD_ALTAR_TELEPORT(13610, Location.create(3559, 9778, 0), 0.0), + ASTRAL_ALTAR_TELEPORT(13611, Location.create(2156, 3862, 0), 0.0, { + player -> hasRequirement(player, "Lunar Diplomacy"); + }), + BLOOD_ALTAR_TELEPORT(13610, Location.create(3559, 9778, 0), 0.0, { + player -> hasRequirement(player, "Legacy of Seergaze"); + }), BODY_ALTAR_TELEPORT(13604, Location.create(3055, 3443, 0), 0.0), CAMELOT_TELEPORT(8010, Location.create(2757, 3477, 0), 55.5), CHAOS_ALTAR_TELEPORT(13606, Location.create(3058, 3593, 0), 0.0), - COSMIC_ALTAR_TELEPORT(13605, Location.create(2411, 4380, 0), 0.0), - DEATH_ALTAR_TELEPORT(13609, Location.create(1863, 4639, 0), 0.0), + COSMIC_ALTAR_TELEPORT(13605, Location.create(2411, 4380, 0), 0.0, { + player -> hasRequirement(player, "Lost City"); + }), + DEATH_ALTAR_TELEPORT(13609, Location.create(1863, 4639, 0), 0.0, { + player -> hasRequirement(player, "Mourning's End Part II"); + }), EARTH_ALTAR_TELEPORT(13602, Location.create(3304, 3472, 0), 0.0), FALADOR_TELEPORT(8009, Location.create(2966, 3380, 0), 47.0), FIRE_ALTAR_TELEPORT(13603, Location.create(3311, 3252, 0), 0.0), - LAW_ALTAR_TELEPORT(13608, Location.create(2857, 3378, 0), 0.0), + LAW_ALTAR_TELEPORT(13608, Location.create(2857, 3378, 0), 0.0, { + player -> if (!ItemDefinition.canEnterEntrana(player)) (player.sendMessage("The power of Saradomin prevents you from taking armour or weaponry to Entrana.") !is Unit) else true; // ugly way of doing this, but the sendMessage function returns a Unit type, so by using !is Unit it becomes false. + }), LUMBRIDGE_TELEPORT(8008, Location.create(3222, 3218, 0), 41.0), MIND_ALTAR_TELEPORT(13600, Location.create(2979, 3510, 0), 0.0), NATURE_ALTAR_TELEPORT(13607, Location.create(2868, 3013, 0), 0.0), - TELEKINETIC_GRAB(8022, Location.create(2836, 3285, 0), 0.0), + TELEKINETIC_GRAB(8022, Location.create(2836, 3285, 0), 0.0, { + player -> hasRequirement(player, "Dragon Slayer"); + }), VARROCK_TELEPORT(8007, Location.create(3212, 3423, 0), 35.00), - WATCH_TOWER_TELEPORT(8012, Location.create(2548, 3114, 0), 68.00), + WATCH_TOWER_TELEPORT(8012, Location.create(2548, 3114, 0), 68.00, { + player -> hasRequirement(player, "Watchtower"); + }), WATER_ALTAR_TELEPORT(13601, Location.create(3182, 3162, 0), 0.0); companion object { From e5e6006212b44b8cb97fc76ef9945da3f8108c12 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 10 Nov 2024 22:36:00 -0700 Subject: [PATCH 55/81] Protect from Summoning prayer now prevents NPC aggression when active --- .../core/game/node/entity/npc/agg/AggressiveHandler.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Server/src/main/core/game/node/entity/npc/agg/AggressiveHandler.java b/Server/src/main/core/game/node/entity/npc/agg/AggressiveHandler.java index c2a49842d..5ee281bb4 100644 --- a/Server/src/main/core/game/node/entity/npc/agg/AggressiveHandler.java +++ b/Server/src/main/core/game/node/entity/npc/agg/AggressiveHandler.java @@ -9,6 +9,8 @@ import core.game.node.entity.player.info.Rights; import core.game.world.GameWorld; import core.tools.RandomFunction; +import core.game.node.entity.player.link.prayer.PrayerType; + /** * Used to handle entity aggressiveness. * @author Emperor @@ -81,6 +83,9 @@ public final class AggressiveHandler { } Entity target = behavior.getLogicalTarget(entity, behavior.getPossibleTargets(entity, radius)); if (target instanceof Player) { + if (((Player) target).getPrayer().get(PrayerType.PROTECT_FROM_SUMMONING)) { + return false; + } if (target.getAttribute("ignore_aggression", false)) { return false; } From a361915281012423709b35c4d9a26fca9170d769 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 11 Nov 2024 09:57:51 -0700 Subject: [PATCH 56/81] Familiar timer now only decreases if at zero summoning points This change reduces the upkeep cost of Summoning, now you only need points or pouches, but not both. --- .../global/skill/summoning/familiar/Familiar.java | 9 +++++++-- .../global/skill/summoning/familiar/FamiliarManager.java | 4 +++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Server/src/main/content/global/skill/summoning/familiar/Familiar.java b/Server/src/main/content/global/skill/summoning/familiar/Familiar.java index b85c1ec16..4177e1d5c 100644 --- a/Server/src/main/content/global/skill/summoning/familiar/Familiar.java +++ b/Server/src/main/content/global/skill/summoning/familiar/Familiar.java @@ -177,7 +177,9 @@ public abstract class Familiar extends NPC implements Plugin { if (pouchId == -1) { this.pointsPerTick = 0.0; } else { - int drain = pouch.getLevelRequired() - pouch.getSummonCost() + 1; + //int drain = pouch.getLevelRequired() - pouch.getSummonCost() + 1; + // Snowscape: removing the initial drain and making it drain over the life of the familiar. Removing the +1 makes the final drain happen on the last tick of the familiar's life. That works for our new system, as the familiar timer won't start until that final tick happens. + int drain = pouch.getLevelRequired(); this.pointsPerTick = (double) drain / maximumTicks; } } @@ -223,7 +225,10 @@ public abstract class Familiar extends NPC implements Plugin { @Override public void handleTickActions() { - ticks--; + //Snowscape: only count down the familiar timer if summoning points are zero + if (owner.getSkills().getLevel(Skills.SUMMONING) == 0) { + ticks--; + } fracDrain += pointsPerTick; if (fracDrain > 1.0 && ticks > 0) { fracDrain -= 1.0; diff --git a/Server/src/main/content/global/skill/summoning/familiar/FamiliarManager.java b/Server/src/main/content/global/skill/summoning/familiar/FamiliarManager.java index 02bb0a403..61b97126e 100644 --- a/Server/src/main/content/global/skill/summoning/familiar/FamiliarManager.java +++ b/Server/src/main/content/global/skill/summoning/familiar/FamiliarManager.java @@ -187,10 +187,12 @@ public final class FamiliarManager { player.getPacketDispatch().sendMessage("You need a Summoning level of " + pouch.getLevelRequired() + " to summon this familiar."); return; } + /* Snowscape: removing the drain on summon. This drain will instead be added to the gradual drain over the familiar's life. if (player.getSkills().getLevel(Skills.SUMMONING) < pouch.getSummonCost()) { player.getPacketDispatch().sendMessage("You need at least " + pouch.getSummonCost() + " Summoning points to summon this familiar."); return; } + */ final int npcId = pouch.getNpcId(); Familiar fam = !renew ? FAMILIARS.get(npcId) : familiar; if (fam == null) { @@ -208,7 +210,7 @@ public final class FamiliarManager { if (!player.getInventory().remove(item)) { return; } - player.getSkills().updateLevel(Skills.SUMMONING, -pouch.getSummonCost(), 0); + //player.getSkills().updateLevel(Skills.SUMMONING, -pouch.getSummonCost(), 0); player.getSkills().addExperience(Skills.SUMMONING, pouch.getSummonExperience()); if (!renew) { familiar = fam; From ee3a71a5d0cf3c47c25cdc0f4c5572a1db05c037 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 11 Nov 2024 18:01:57 -0700 Subject: [PATCH 57/81] Allow Ancient Magick spells to work up to level 48 wilderness. --- .../core/game/world/map/zone/ZoneMonitor.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/Server/src/main/core/game/world/map/zone/ZoneMonitor.java b/Server/src/main/core/game/world/map/zone/ZoneMonitor.java index 65b4a0322..4be51e122 100644 --- a/Server/src/main/core/game/world/map/zone/ZoneMonitor.java +++ b/Server/src/main/core/game/world/map/zone/ZoneMonitor.java @@ -238,7 +238,7 @@ public final class ZoneMonitor { * @return {@code True} if so. */ public boolean teleport(int type, Node node) { - if (type != -1 && entity.isTeleBlocked() && !canTeleportByJewellery(type, node)) { + if (type != -1 && entity.isTeleBlocked() && !canTeleportByJewellery(type, node)&& !canTeleportByAncient(type)) { if (entity.isPlayer()) { entity.asPlayer().sendMessage("A magical force has stopped you from teleporting."); } @@ -278,6 +278,32 @@ public final class ZoneMonitor { return false; } + /** + * Snowscape custom allowing teleports with Ancient Magicks in >= 1 <= 30 wilderness level + * @return {@code True} if so. + */ + private boolean canTeleportByAncient(int type) { + if (type != 0) { + return false; + } + if (entity.timers.getTimer("teleblock") != null) + return false; + + if (entity.getZoneMonitor().isRestricted(ZoneRestriction.TELEPORT)) { + return false; + } + + if (entity.getLocks().isTeleportLocked()) { + if (entity.isPlayer()) { + Player p = entity.asPlayer(); + if (p.getSpellBookManager().getSpellBook() == 193 && p.getSkullManager().getLevel() >= 1 && p.getSkullManager().getLevel() <= 48) { + return true; + } + } + } + + return false; + } /** * Checks if the death should start for an entity. From f2aad1c95712f2449118b6467ea6fd553dc26ccf Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 11 Nov 2024 18:05:16 -0700 Subject: [PATCH 58/81] Allow Ancient Teleports to bypass the isTeleBlocked function so that they work in the wilderness Note that they are still restricted by the checks in the ZoneMonitor file, which does include teleblock checks, as well as specific wilderness levels. --- .../main/core/game/node/entity/player/link/TeleportManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/core/game/node/entity/player/link/TeleportManager.java b/Server/src/main/core/game/node/entity/player/link/TeleportManager.java index 140ecf405..147337cc5 100644 --- a/Server/src/main/core/game/node/entity/player/link/TeleportManager.java +++ b/Server/src/main/core/game/node/entity/player/link/TeleportManager.java @@ -99,7 +99,7 @@ public class TeleportManager { if (!entity.getZoneMonitor().teleport(teleportType, null)) { return false; } - if (teleportType != -1 && entity.isTeleBlocked()) { + if (teleportType != -1 && type != TeleportType.ANCIENT && entity.isTeleBlocked()) { if (entity.isPlayer()) entity.asPlayer().sendMessage("A magical force has stopped you from teleporting."); return false; From ac14e7a22e7635d955fa8dd22e001a1ced50a144 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 11 Nov 2024 18:29:55 -0700 Subject: [PATCH 59/81] Remove last check preventing Ancient Magicks from working in wilderness. --- .../global/skill/magic/ancient/AncientTeleportPlugin.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/src/main/content/global/skill/magic/ancient/AncientTeleportPlugin.java b/Server/src/main/content/global/skill/magic/ancient/AncientTeleportPlugin.java index 3944c3c7e..ec6c8999c 100644 --- a/Server/src/main/content/global/skill/magic/ancient/AncientTeleportPlugin.java +++ b/Server/src/main/content/global/skill/magic/ancient/AncientTeleportPlugin.java @@ -51,10 +51,12 @@ public final class AncientTeleportPlugin extends MagicSpell { @Override public boolean cast(Entity entity, Node target) { + /* Snowscape Custom to allow teleporting in wilderness. The teleport limitations are still checked later by the send() function, so this is not if (entity.isTeleBlocked() || !super.meetsRequirements(entity, true, false)) { entity.asPlayer().sendMessage("A magical force has stopped you from teleporting."); return false; } + */ if (entity.getTeleporter().send(location.transform(0, RandomFunction.random(3), 0), getSpellId() == 28 ? TeleportType.HOME : TeleportType.ANCIENT)) { if (!super.meetsRequirements(entity, true, true)) { entity.getTeleporter().getCurrentTeleport().stop(); From 62463576cf0b0513c494e7d6fc9e5a8d95cff4c0 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 11 Nov 2024 19:14:58 -0700 Subject: [PATCH 60/81] Herb cleaning is now a pulse that cleans all the matching herbs in your inventory --- .../skill/herblore/HerbCleanListener.kt | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt b/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt index 7ba8cfe5a..3189ba640 100644 --- a/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt +++ b/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt @@ -7,6 +7,9 @@ import core.game.node.entity.skill.Skills import core.game.node.item.Item import java.util.* +import core.game.system.task.Pulse + + /** * Dirty herb cleaning listener * @author Woah @@ -19,16 +22,35 @@ class HerbCleanListener : InteractionListener { val herb: Herbs = Herbs.forItem(node as Item) ?: return@on true if (getDynLevel(player, Skills.HERBLORE) < herb.level) { - sendMessage(player, "You cannot clean this herb. You need a Herblore level of " + herb.level + " to attempt this.") + sendMessage(player, "You need level " + herb.level + " Herblore to clean the " + herb.product.name.replace("Clean", "Grimy") + ".") return@on true } val exp = herb.experience + + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + if (amountInInventory(player, node.asItem().id) == 0 ) + return true + if(removeItem(player, node.asItem().id)) { + addItem(player, herb.product.id) + rewardXP(player, Skills.HERBLORE, exp) + playAudio(player, 5153) + //sendMessage(player, "You clean the dirt from the " + herb.product.name.lowercase(Locale.getDefault()).replace("clean", "").trim { it <= ' ' } + " leaf.") + } + return false + } + }) + return@on true + + /* Vanilla actions, replaced by pulse above replaceSlot(player, node.asItem().slot, herb.product, node.asItem()) rewardXP(player, Skills.HERBLORE, exp) playAudio(player, 5153) sendMessage(player, "You clean the dirt from the " + herb.product.name.lowercase(Locale.getDefault()).replace("clean", "").trim { it <= ' ' } + " leaf.") return@on true + */ } } } \ No newline at end of file From 2e68ac1522d23cb605362d83333f8f5ec856fbc8 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 11 Nov 2024 19:16:53 -0700 Subject: [PATCH 61/81] Fixed overwritten herb cleaning line --- .../src/main/content/global/skill/herblore/HerbCleanListener.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt b/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt index 3189ba640..a2cd826d1 100644 --- a/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt +++ b/Server/src/main/content/global/skill/herblore/HerbCleanListener.kt @@ -22,7 +22,7 @@ class HerbCleanListener : InteractionListener { val herb: Herbs = Herbs.forItem(node as Item) ?: return@on true if (getDynLevel(player, Skills.HERBLORE) < herb.level) { - sendMessage(player, "You need level " + herb.level + " Herblore to clean the " + herb.product.name.replace("Clean", "Grimy") + ".") + sendMessage(player, "You cannot clean this herb. You need a Herblore level of " + herb.level + " to attempt this.") return@on true } From 563fcc23bc4e24eec8914d87ee8c5957699a2184 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 11 Nov 2024 21:43:20 -0700 Subject: [PATCH 62/81] Farming patches now return the seeds if the plant being cleared or harvested is fully grown --- .../src/main/content/global/skill/farming/Patch.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Server/src/main/content/global/skill/farming/Patch.kt b/Server/src/main/content/global/skill/farming/Patch.kt index c9f90b4a9..3ec029a89 100644 --- a/Server/src/main/content/global/skill/farming/Patch.kt +++ b/Server/src/main/content/global/skill/farming/Patch.kt @@ -350,6 +350,19 @@ class Patch(val player: Player, val patch: FarmingPatch, var plantable: Plantabl } fun clear(){ + if (isGrown()) { + var seedAmount = 1 + var seedMessage = "a seed" + if (patch.type == PatchType.ALLOTMENT || plantable!! == Plantable.JUTE_SEED) { + seedAmount = 3 + seedMessage = "some seeds" + } else if (patch.type == PatchType.HOPS_PATCH) { + seedAmount = 4 + seedMessage = "some seeds" + } + addItemOrDrop(player, plantable!!.itemID, seedAmount) + sendMessage(player, "You find $seedMessage in the patch as you clear it.") + } isCheckHealth = false isDiseased = false isDead = false From 65cb778a187489e569ba734f461efc2cd5e99329 Mon Sep 17 00:00:00 2001 From: randy Date: Mon, 11 Nov 2024 22:16:17 -0700 Subject: [PATCH 63/81] Hunter traps last 10 minutes instead of 1 minute --- Server/src/main/content/global/skill/hunter/TrapWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/hunter/TrapWrapper.java b/Server/src/main/content/global/skill/hunter/TrapWrapper.java index 4cbe32987..b596d864c 100644 --- a/Server/src/main/content/global/skill/hunter/TrapWrapper.java +++ b/Server/src/main/content/global/skill/hunter/TrapWrapper.java @@ -102,7 +102,7 @@ public final class TrapWrapper { this.type = type; this.object = object; this.originalId = object.getId(); - this.ticks = GameWorld.getTicks() + (100); + this.ticks = GameWorld.getTicks() + (1000); this.instance = HunterManager.getInstance(player); this.object.getAttributes().setAttribute("trap-uid", instance.getUid()); } From d92a3f3a8e528bd7dc8b2db768daaa01eb8a808f Mon Sep 17 00:00:00 2001 From: randy Date: Tue, 12 Nov 2024 06:24:27 -0700 Subject: [PATCH 64/81] Increase bird snare feather drops from 8 to 60 As part of the plan to make self-sufficient fletching more viable. --- .../src/main/content/global/skill/hunter/Traps.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Server/src/main/content/global/skill/hunter/Traps.java b/Server/src/main/content/global/skill/hunter/Traps.java index f2151d660..e5e30ca34 100644 --- a/Server/src/main/content/global/skill/hunter/Traps.java +++ b/Server/src/main/content/global/skill/hunter/Traps.java @@ -21,12 +21,12 @@ import static core.api.ContentAPIKt.log; */ public enum Traps { BIRD_SNARE(new TrapSetting(10006, new int[] { 19175 }, new int[] {}, "lay", 19174, Animation.create(5208), Animation.create(5207), 1), - new TrapNode(new int[] { 5073 }, 1, 34, new int[] { 19179, 19180 }, new Item[] { new Item(10088, 8), new Item(9978), new Item(526) }), - new TrapNode(new int[] { 5075 }, 5, 48, new int[] { 19183, 19184 }, new Item[] { new Item(10090, 8), new Item(9978), new Item(526) }), - new TrapNode(new int[] { 5076 }, 9, 61, new int[] { 19185, 19186 }, new Item[] { new Item(10091, 8), new Item(9978), new Item(526) }), - new TrapNode(new int[] { 5074 }, 11, 64.7, new int[] { 19181, 19182 }, new Item[] { new Item(10089, 8), new Item(9978), new Item(526) }), - new TrapNode(new int[] { 5072 }, 19, 95.2, new int[] { 19177, 19178 }, new Item[] { new Item(10087, 8), new Item(9978), new Item(526) }), - new TrapNode(new int[] { 7031 }, 39, 167, new int[] { 28931, 28930 }, new Item[] { new Item(11525, 8), new Item(9978), new Item(526) }) { + new TrapNode(new int[] { 5073 }, 1, 34, new int[] { 19179, 19180 }, new Item[] { new Item(10088, 60), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 5075 }, 5, 48, new int[] { 19183, 19184 }, new Item[] { new Item(10090, 60), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 5076 }, 9, 61, new int[] { 19185, 19186 }, new Item[] { new Item(10091, 60), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 5074 }, 11, 64.7, new int[] { 19181, 19182 }, new Item[] { new Item(10089, 60), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 5072 }, 19, 95.2, new int[] { 19177, 19178 }, new Item[] { new Item(10087, 60), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 7031 }, 39, 167, new int[] { 28931, 28930 }, new Item[] { new Item(11525, 60), new Item(9978), new Item(526) }) { @Override public boolean canCatch(TrapWrapper wrapper, final NPC npc) { return false; From 9143cd5f47aa103305e2fc1861e167c0e2a69543 Mon Sep 17 00:00:00 2001 From: randy Date: Tue, 12 Nov 2024 07:52:06 -0700 Subject: [PATCH 65/81] Fixed getting slayer exp from hunting --- .../src/main/content/global/skill/slayer/SlayerManager.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/slayer/SlayerManager.kt b/Server/src/main/content/global/skill/slayer/SlayerManager.kt index 1bcf56803..f0ff71ed5 100644 --- a/Server/src/main/content/global/skill/slayer/SlayerManager.kt +++ b/Server/src/main/content/global/skill/slayer/SlayerManager.kt @@ -13,6 +13,8 @@ import org.json.simple.JSONObject import java.util.* import org.rs09.consts.Items +import content.global.skill.hunter.HunterNPC + /** * Manages the players slayer data. * @author Ceikry @@ -102,7 +104,9 @@ class SlayerManager(val player: Player? = null) : LoginListener, PersistPlayer, val slayer = getInstance(player) val flags = slayer.flags var xp = npc.skills.maximumLifepoints.toDouble() - rewardXP(player, Skills.SLAYER, xp/3) + //Snowscape custom: grant a third of the normal slayer exp on all kills (this stacks with the exp from on-task kills) + if (npc !is HunterNPC) + rewardXP(player, Skills.SLAYER, xp/3) if (slayer.hasTask() && npc.id in slayer.task!!.npcs) { From 3035aaa7e6caaccc178aaf671505ec7d4faeea2c Mon Sep 17 00:00:00 2001 From: randy Date: Tue, 12 Nov 2024 15:00:37 -0700 Subject: [PATCH 66/81] Implemented proper probabilities when using the Ourania altar --- .../skill/runecrafting/RuneCraftPulse.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java index aff74d903..77e21b7f2 100644 --- a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java +++ b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java @@ -217,7 +217,9 @@ public final class RuneCraftPulse extends SkillPulse { player.getPacketDispatch().sendMessage("You bind the temple's power into runes."); player.incrementAttribute("/save:" + STATS_BASE + ":" + STATS_RC, amount); for (int i = 0; i < amount; i++) { - Rune rune = null; + Rune rune = getOuraniaRune(player.getSkills().getLevel(Skills.RUNECRAFTING)); + /* Snowscape: removed this placeholder formula and implemented the real ourania probabilities. The multiplier on Orania runes is also a custom feature. + Rune rune = null; while (rune == null) { final Rune temp = Rune.values()[RandomFunction.random(Rune.values().length)]; if (player.getSkills().getLevel(Skills.RUNECRAFTING) >= temp.getLevel()) { @@ -228,6 +230,7 @@ public final class RuneCraftPulse extends SkillPulse { } } } + */ player.getSkills().addExperience(Skills.RUNECRAFTING, rune.getExperience() * 2, true); Item runeItem = new Item(rune.getRune().getId(),getMultiplier(rune)); player.getInventory().add(runeItem); @@ -396,6 +399,38 @@ public final class RuneCraftPulse extends SkillPulse { public boolean hasBindingNecklace() { return player.getEquipment().containsItem(BINDING_NECKLACE); } + + /** + * Method used to get a random rune for the Ourania altar based on runecrafting level. + * Todo: This should probably use a weighted table but I couldn't figure them out. + * @return the randomly selected rune. + */ + public static Rune getOuraniaRune(int rcLevel) { + int random = RandomFunction.random(10000); + if (rcLevel >= 99) { + if (random > 9100) { return Rune.SOUL; } else if (random > 7800) { return Rune.BLOOD; } else if (random > 6250) { return Rune.DEATH; } else if (random > 4800) { return Rune.LAW; } else if (random > 3450) { return Rune.NATURE; } else if (random > 2500) { return Rune.ASTRAL; } else if (random > 1900) { return Rune.CHAOS; } else if (random > 1400) { return Rune.COSMIC; } else if (random > 1000) { return Rune.BODY; } else if (random > 700) { return Rune.FIRE; } else if (random > 400) { return Rune.EARTH; } else if (random > 200) { return Rune.WATER; } else if (random > 100) { return Rune.MIND; } else { return Rune.AIR; } + } else if (rcLevel >= 90) { + if (random > 9350) { return Rune.SOUL; } else if (random > 8350) { return Rune.BLOOD; } else if (random > 6700) { return Rune.DEATH; } else if (random > 5250) { return Rune.LAW; } else if (random > 3900) { return Rune.NATURE; } else if (random > 2900) { return Rune.ASTRAL; } else if (random > 2200) { return Rune.CHAOS; } else if (random > 1600) { return Rune.COSMIC; } else if (random > 1100) { return Rune.BODY; } else if (random > 700) { return Rune.FIRE; } else if (random > 400) { return Rune.EARTH; } else if (random > 200) { return Rune.WATER; } else if (random > 100) { return Rune.MIND; } else { return Rune.AIR; } + } else if (rcLevel >= 80) { + if (random > 9600) { return Rune.SOUL; } else if (random > 9000) { return Rune.BLOOD; } else if (random > 7550) { return Rune.DEATH; } else if (random > 6100) { return Rune.LAW; } else if (random > 4750) { return Rune.NATURE; } else if (random > 3700) { return Rune.ASTRAL; } else if (random > 2900) { return Rune.CHAOS; } else if (random > 2200) { return Rune.COSMIC; } else if (random > 1600) { return Rune.BODY; } else if (random > 700) { return Rune.FIRE; } else if (random > 400) { return Rune.EARTH; } else if (random > 200) { return Rune.WATER; } else if (random > 100) { return Rune.MIND; } else { return Rune.AIR; } + } else if (rcLevel >= 70) { + if (random > 9800) { return Rune.SOUL; } else if (random > 9300) { return Rune.BLOOD; } else if (random > 8300) { return Rune.DEATH; } else if (random > 6500) { return Rune.LAW; } else if (random > 5000) { return Rune.NATURE; } else if (random > 3800) { return Rune.ASTRAL; } else if (random > 2900) { return Rune.CHAOS; } else if (random > 2200) { return Rune.COSMIC; } else if (random > 1700) { return Rune.BODY; } else if (random > 1300) { return Rune.FIRE; } else if (random > 900) { return Rune.EARTH; } else if (random > 600) { return Rune.WATER; } else if (random > 300) { return Rune.MIND; } else { return Rune.AIR; } + } else if (rcLevel >= 60) { + if (random > 9900) { return Rune.SOUL; } else if (random > 9700) { return Rune.BLOOD; } else if (random > 9300) { return Rune.DEATH; } else if (random > 8500) { return Rune.LAW; } else if (random > 6950) { return Rune.NATURE; } else if (random > 5550) { return Rune.ASTRAL; } else if (random > 4500) { return Rune.CHAOS; } else if (random > 3550) { return Rune.COSMIC; } else if (random > 2800) { return Rune.BODY; } else if (random > 2100) { return Rune.FIRE; } else if (random > 1500) { return Rune.EARTH; } else if (random > 950) { return Rune.WATER; } else if (random > 450) { return Rune.MIND; } else { return Rune.AIR; } + } else if (rcLevel >= 50) { + if (random > 9920) { return Rune.SOUL; } else if (random > 9750) { return Rune.BLOOD; } else if (random > 9400) { return Rune.DEATH; } else if (random > 8700) { return Rune.LAW; } else if (random > 7350) { return Rune.NATURE; } else if (random > 5850) { return Rune.ASTRAL; } else if (random > 4750) { return Rune.CHAOS; } else if (random > 3750) { return Rune.COSMIC; } else if (random > 3000) { return Rune.BODY; } else if (random > 2300) { return Rune.FIRE; } else if (random > 1650) { return Rune.EARTH; } else if (random > 1050) { return Rune.WATER; } else if (random > 500) { return Rune.MIND; } else { return Rune.AIR; } + } else if (rcLevel >= 40) { + if (random > 9960) { return Rune.SOUL; } else if (random > 9880) { return Rune.BLOOD; } else if (random > 9760) { return Rune.DEATH; } else if (random > 9500) { return Rune.LAW; } else if (random > 9000) { return Rune.NATURE; } else if (random > 8000) { return Rune.ASTRAL; } else if (random > 6000) { return Rune.CHAOS; } else if (random > 4500) { return Rune.COSMIC; } else if (random > 3500) { return Rune.BODY; } else if (random > 2700) { return Rune.FIRE; } else if (random > 1950) { return Rune.EARTH; } else if (random > 1250) { return Rune.WATER; } else if (random > 600) { return Rune.MIND; } else { return Rune.AIR; } + } else if (rcLevel >= 30) { + if (random > 9980) { return Rune.SOUL; } else if (random > 9940) { return Rune.BLOOD; } else if (random > 9880) { return Rune.DEATH; } else if (random > 9750) { return Rune.LAW; } else if (random > 9500) { return Rune.NATURE; } else if (random > 9000) { return Rune.ASTRAL; } else if (random > 8000) { return Rune.CHAOS; } else if (random > 6000) { return Rune.COSMIC; } else if (random > 4700) { return Rune.BODY; } else if (random > 3500) { return Rune.FIRE; } else if (random > 2400) { return Rune.EARTH; } else if (random > 1500) { return Rune.WATER; } else if (random > 700) { return Rune.MIND; } else { return Rune.AIR; } + } else if (rcLevel >= 20) { + if (random > 9992) { return Rune.SOUL; } else if (random > 9977) { return Rune.BLOOD; } else if (random > 9945) { return Rune.DEATH; } else if (random > 9890) { return Rune.LAW; } else if (random > 9780) { return Rune.NATURE; } else if (random > 9570) { return Rune.ASTRAL; } else if (random > 9150) { return Rune.CHAOS; } else if (random > 8350) { return Rune.COSMIC; } else if (random > 6750) { return Rune.BODY; } else if (random > 5250) { return Rune.FIRE; } else if (random > 3850) { return Rune.EARTH; } else if (random > 2500) { return Rune.WATER; } else if (random > 1200) { return Rune.MIND; } else { return Rune.AIR; } + } else if (rcLevel >= 10) { + if (random > 9997) { return Rune.SOUL; } else if (random > 9991) { return Rune.BLOOD; } else if (random > 9979) { return Rune.DEATH; } else if (random > 9955) { return Rune.LAW; } else if (random > 9915) { return Rune.NATURE; } else if (random > 9855) { return Rune.ASTRAL; } else if (random > 9775) { return Rune.CHAOS; } else if (random > 9600) { return Rune.COSMIC; } else if (random > 9000) { return Rune.BODY; } else if (random > 7800) { return Rune.FIRE; } else if (random > 5400) { return Rune.EARTH; } else if (random > 3300) { return Rune.WATER; } else if (random > 1500) { return Rune.MIND; } else { return Rune.AIR; } + } else { + if (random > 9998) { return Rune.SOUL; } else if (random > 9993) { return Rune.BLOOD; } else if (random > 9985) { return Rune.DEATH; } else if (random > 9970) { return Rune.LAW; } else if (random > 9940) { return Rune.NATURE; } else if (random > 9895) { return Rune.ASTRAL; } else if (random > 9835) { return Rune.CHAOS; } else if (random > 9750) { return Rune.COSMIC; } else if (random > 9600) { return Rune.BODY; } else if (random > 9300) { return Rune.FIRE; } else if (random > 8700) { return Rune.EARTH; } else if (random > 7500) { return Rune.WATER; } else if (random > 5000) { return Rune.MIND; } else { return Rune.AIR; } + } + } /** * Gets the altar. From e45f8fa81bafd99055fe2ec4a8bdfa945c1df57d Mon Sep 17 00:00:00 2001 From: randy Date: Tue, 12 Nov 2024 16:00:02 -0700 Subject: [PATCH 67/81] Implemented rune multipliers on combination runes The altar you are at will now give its multiplier to the combination runes crafted. This only saves essence, the opposing rune cost is multiplied as well. (If you get 10 air runes per essence, then making mist runes at the air altar will cost 10 water runes and 1 essence to give you 10 mist runes). --- .../skill/runecrafting/RuneCraftPulse.java | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java index 77e21b7f2..5006b52be 100644 --- a/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java +++ b/Server/src/main/content/global/skill/runecrafting/RuneCraftPulse.java @@ -239,9 +239,39 @@ public final class RuneCraftPulse extends SkillPulse { } } - /** - * Method used to combine runes. - */ + /** + * Method used to combine runes. Snowscape custom: you get multiple combination runes per essence (the opposite rune cost scales to match the multiplier) + */ + private final void combine() { + final Item remove = node.getName().contains("talisman") ? node : talisman != null ? talisman.getTalisman() : Talisman.forName(Rune.forItem(node).name()).getTalisman(); + boolean imbued = hasSpellImbue(); + if (!imbued ? player.getInventory().remove(remove) : imbued) { + int essenceAmt = player.getInventory().getAmount(PURE_ESSENCE); + int multiplier = getMultiplier(altar.getRune()); + final Item rune = node.getName().contains("rune") ? Rune.forItem(node).getRune() : Rune.forName(Talisman.forItem(node).name()).getRune(); + for (int i = 0; i < essenceAmt; i++) { + int runeAmt = player.getInventory().getAmount(rune); + if (runeAmt > 0 && player.getInventory().remove(new Item(PURE_ESSENCE.getId(),1))) { + if (runeAmt < multiplier) { + multiplier = runeAmt; + } + player.getInventory().remove(new Item(rune.getId(), multiplier)); + if (RandomFunction.random(2) == 1 || hasBindingNecklace()) { + player.getInventory().add(new Item(combo.getRune().getId(), multiplier)); + player.getSkills().addExperience(Skills.RUNECRAFTING, combo.getExperience(), true); + } + } + } + if (hasBindingNecklace()) { + player.getEquipment().get(EquipmentContainer.SLOT_AMULET).setCharge(player.getEquipment().get(EquipmentContainer.SLOT_AMULET).getCharge() - 1); + if (1000 - player.getEquipment().get(EquipmentContainer.SLOT_AMULET).getCharge() > 14) { + player.getEquipment().remove(BINDING_NECKLACE, true); + player.getPacketDispatch().sendMessage("Your binding necklace crumbles into dust."); + } + } + } + } + /* Original function, replaced by snowscape custom above private final void combine() { final Item remove = node.getName().contains("talisman") ? node : talisman != null ? talisman.getTalisman() : Talisman.forName(Rune.forItem(node).name()).getTalisman(); boolean imbued = hasSpellImbue(); @@ -272,7 +302,7 @@ public final class RuneCraftPulse extends SkillPulse { } } } - +*/ /** * Method used to craft tablets. Custom for Snowscape */ From 0b0542469078178e683a77e09a239930a11e20cb Mon Sep 17 00:00:00 2001 From: randy Date: Tue, 12 Nov 2024 21:04:11 -0700 Subject: [PATCH 68/81] Changed Imp-in-a-box to act a full deposit box. One-time use. The Imp-in-a-box is broken, and I don't know how to fix it so I buffed it instead. --- .../src/main/content/global/skill/hunter/ImpBoxPlugin.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Server/src/main/content/global/skill/hunter/ImpBoxPlugin.java b/Server/src/main/content/global/skill/hunter/ImpBoxPlugin.java index 800e342eb..a1cf25062 100644 --- a/Server/src/main/content/global/skill/hunter/ImpBoxPlugin.java +++ b/Server/src/main/content/global/skill/hunter/ImpBoxPlugin.java @@ -46,10 +46,16 @@ public class ImpBoxPlugin extends OptionHandler { public boolean handle(Player player, Node node, String option) { switch (option) { case "bank": + int boxSlot = node.asItem().getSlot(); + player.getInventory().replace(new Item(10025), boxSlot); + player.sendMessage("You free the imp in exchange for it taking some items to your bank."); + player.getBank().openDepositBox(); + /* Snowscape Custom: the normal imp interface is broken, so we fixed/buffed it by making it act as a one-time-use deposit box instead. Component component = new Component(478); component.setPlugin(new ImpInterfaceHandler((Item) node)); player.getInterfaceManager().open(component); PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 478, 61, 91, player.getInventory(), true)); + */ break; case "talk-to": player.getDialogueInterpreter().open("imp-box"); From a6ad4f8f3b8c0f406c57b327a893747e62540db9 Mon Sep 17 00:00:00 2001 From: randy Date: Wed, 13 Nov 2024 14:10:24 -0700 Subject: [PATCH 69/81] High Alching Ring of Wealth now adds permanent unlock. --- .../skill/magic/modern/ModernListeners.kt | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/Server/src/main/content/global/skill/magic/modern/ModernListeners.kt b/Server/src/main/content/global/skill/magic/modern/ModernListeners.kt index 0d35ef56a..d56b8230b 100644 --- a/Server/src/main/content/global/skill/magic/modern/ModernListeners.kt +++ b/Server/src/main/content/global/skill/magic/modern/ModernListeners.kt @@ -230,6 +230,23 @@ class ModernListeners : SpellListener("modern"){ return false } + var loop = true + + val ringOfWealth = intArrayOf(14646,14644,14642,14640,14638) + if(high && ringOfWealth.contains(item.id)){ + if (getAttribute(player, "ringofwealth:unlocked", false)) { + player.sendMessage("You have already unlocked the permanent Wealth effect and can no longer ") + player.sendMessage("alchemize this ring.") + return false + } else { + player.setAttribute("/save:ringofwealth:unlocked", true) + player.sendMessage("Combining the Alchemy spell with the Wealth enchantment causes a strange ") + player.sendMessage("interaction. You are now permanently enchanted with the Wealth effect and ") + player.sendMessage("no longer need to wear the ring to get the benefit of increased rare drops.") + loop = false + } + } + if (player.pulseManager.current !is MovementPulse) { player.pulseManager.clear() } @@ -265,8 +282,12 @@ class ModernListeners : SpellListener("modern"){ //showMagicTab(player) setDelay(player, 5) } - counter++ - return false + if (loop) { + counter++ + return false + } else { + return true + } } }) return true From e7ed5b0d7ae58283824138f91d11ba7a43513f71 Mon Sep 17 00:00:00 2001 From: randy Date: Wed, 13 Nov 2024 14:23:17 -0700 Subject: [PATCH 70/81] Added check to allow permanant unlock to act as a worn ring of wealth This only affects NPC drops, not gem drops from mining. Due to this affecting the rare drop table only, this has not been tested. --- Server/src/main/core/api/ContentAPI.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Server/src/main/core/api/ContentAPI.kt b/Server/src/main/core/api/ContentAPI.kt index 84d41d69a..daf3c8625 100644 --- a/Server/src/main/core/api/ContentAPI.kt +++ b/Server/src/main/core/api/ContentAPI.kt @@ -279,7 +279,16 @@ fun hasGodItem(player: Player, god: God): Boolean { */ fun shouldRemoveNothings(player: Player) : Boolean { val ring = getItemFromEquipment(player, EquipmentSlot.RING) - return ring != null && ring.id in Items.RING_OF_WEALTH_14638..Items.RING_OF_WEALTH4_14646 + if (getAttribute(player, "ringofwealth:unlocked", false)){ + player.sendMessage("Your Wealth enchantment coaxes a rare drop from your opponent.") + return true + } else if (ring != null && ring.id in Items.RING_OF_WEALTH_14638..Items.RING_OF_WEALTH4_14646) { + player.sendMessage("Your Ring of Wealth coaxes a rare drop from your opponent.") + player.sendMessage("The magic in the ring reminds you of the High Level Alchemy spell for some reason.") + return true + } else { + return false + } } /** From 964c95b572ed55c8d1f41d68bb13a64135c44da3 Mon Sep 17 00:00:00 2001 From: randy Date: Wed, 13 Nov 2024 15:21:17 -0700 Subject: [PATCH 71/81] Fixed noncombat spells getting the 33% chance to not use runes. --- .../main/core/game/node/entity/combat/spell/MagicSpell.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java b/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java index 6259add5a..86b7e1260 100644 --- a/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java +++ b/Server/src/main/core/game/node/entity/combat/spell/MagicSpell.java @@ -201,9 +201,9 @@ public abstract class MagicSpell implements Plugin { if (!checkLevelRequirement(caster, message)) { return false; } + /* Snowscape custom. Removing this allows guthix staff to autocast claws of guthix. if (caster instanceof Player) { CombatSpell spell = ((Player) caster).getProperties().getAutocastSpell(); - /* Snowscape custom. Removing this allows guthix staff to autocast claws of guthix. if (spell != null) { boolean slayer = ((Player) caster).getEquipment().get(3).getName().contains("layer's staff"); boolean voidKnight = ((Player) caster).getEquipment().get(3).getName().contains("knight mace"); @@ -212,8 +212,8 @@ public abstract class MagicSpell implements Plugin { return false; } } - */ } + */ if((spellId == 12 || spellId == 30 || spellId == 56) && caster instanceof Player){ if (caster.getAttribute("entangleDelay", 0) > GameWorld.getTicks()) { caster.asPlayer().sendMessage("You have recently cast a binding spell."); @@ -223,7 +223,7 @@ public abstract class MagicSpell implements Plugin { if (caster instanceof Player) { Player p = (Player) caster; //if(p.getEquipment().get(3) != null && p.getEquipment().get(3).getId() == 14726){ - if(RandomFunction.getRandom(100) > 33){ + if(this instanceof CombatSpell && RandomFunction.getRandom(100) > 33){ //p.sendMessage("Your staff negates the rune requirement of the spell."); return true; } From 251934d3a9efa9027ad41782ce74714e045d3bb7 Mon Sep 17 00:00:00 2001 From: randy Date: Wed, 13 Nov 2024 20:51:24 -0700 Subject: [PATCH 72/81] Audded autolooting of coins and tokkul if wearing ring of wealth --- .../node/entity/npc/drop/NPCDropTables.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java b/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java index 7421228f7..2ce42e98c 100644 --- a/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java +++ b/Server/src/main/core/game/node/entity/npc/drop/NPCDropTables.java @@ -104,6 +104,9 @@ public final class NPCDropTables { if (handleBoneCrusher(player, item)) { return; } + if (handleCurrency(player, item)) { + return; + } if (item.hasItemPlugin() && player != null) { if (!item.getPlugin().createDrop(item, player, npc, l)) { return; @@ -260,6 +263,25 @@ public final class NPCDropTables { player.getSkills().addExperience(Skills.PRAYER, item.getAmount() * bone.getExperience()); return true; } + + /** + * Snowscape custom: Automatically loot coins and tokkul if wearing a ring of wealth. + * @param player The player + * @param item The item + * @return true if successfully added items to player. + */ + private boolean handleCurrency(Player player, Item item) { + if (item.getId() == 995 || item.getId() == 6529) { + Item ring = player.getEquipment().get(12); + if (ring != null && ring.getId() >= 14638 && ring.getId() <=14646) { + if (player.getInventory().add(item)) { + player.sendMessage("Your Ring collected " + item.getAmount() + " " + item.getName() + "."); + return true; + } + } + } + return false; + } /** * Gets the ratio for stabilizing NPC combat difficulty & drop rates. From 02a36f7bf791414f9319738f90e99262339fbb4f Mon Sep 17 00:00:00 2001 From: randy Date: Fri, 15 Nov 2024 12:37:47 -0700 Subject: [PATCH 73/81] Removed gloves of silence requirement for auto-pickpocketing --- .../global/skill/thieving/ThievingListeners.kt | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/Server/src/main/content/global/skill/thieving/ThievingListeners.kt b/Server/src/main/content/global/skill/thieving/ThievingListeners.kt index a236ca291..8068d35eb 100644 --- a/Server/src/main/content/global/skill/thieving/ThievingListeners.kt +++ b/Server/src/main/content/global/skill/thieving/ThievingListeners.kt @@ -68,9 +68,8 @@ class ThievingListeners : InteractionListener { return@on true } - //Custom portion. If the player has gloves of silence, only proceed every other tick - val glovesOfSilence = player.equipment.contains(Items.GLOVES_OF_SILENCE_10075,1) - if (!glovesOfSilence || GameWorld.ticks % 2 == 0) { + //Custom portion. Repeat pickpocket, only proceed every other tick + if (GameWorld.ticks % 2 == 0) { player.animator.animate(PICKPOCKET_ANIM) val lootTable = pickpocketRoll(player, pickpocketData.low, pickpocketData.high, pickpocketData.table) @@ -87,17 +86,14 @@ class ThievingListeners : InteractionListener { node.asNpc().face(null) } else { playAudio(player, Sounds.PICK_2581) - if (!glovesOfSilence) { - player.lock(2) - } + //player.lock(2) lootTable.forEach { player.inventory.add(it) } player.skills.addExperience(Skills.THIEVING,pickpocketData.experience) } } - // if wearing gloves of silence, pickpocket again. - if (glovesOfSilence) { - InteractionListeners.run(node.id, IntType.NPC,"Pickpocket",player,node) - } + //pickpocket again. + InteractionListeners.run(node.id, IntType.NPC,"Pickpocket",player,node) + return@on true } } From 6845a3740f6ddfd7fbb75b709728020087ff4c2f Mon Sep 17 00:00:00 2001 From: randy Date: Sat, 16 Nov 2024 09:47:46 -0700 Subject: [PATCH 74/81] Rebalanced prayer point drain rates (almost everything except protection prayers drains far less) - Protection prayers are now all equal at 10 points per minute - the 5%, 10%, and 15% bonus prayers now drain 1, 2, and 3 points per minute, respectively. Having all of them active at once is now a lower drain than Chivalry. -- The attack and strength versions drain half of that, since you need two of them active. - Chivalry and Piety now also boost magic and ranged at the same rate as attack, and have had their drain slightly lowered. (7.5 and 10 points per minute) --- .../entity/player/link/prayer/PrayerType.java | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/Server/src/main/core/game/node/entity/player/link/prayer/PrayerType.java b/Server/src/main/core/game/node/entity/player/link/prayer/PrayerType.java index e8fba525e..5b8b3e8a1 100644 --- a/Server/src/main/core/game/node/entity/player/link/prayer/PrayerType.java +++ b/Server/src/main/core/game/node/entity/player/link/prayer/PrayerType.java @@ -22,33 +22,33 @@ import static core.api.ContentAPIKt.*; * @author jamix77 */ public enum PrayerType { - THICK_SKIN(1, 12, 83, 5, PrayerCategory.BABY_BLUE, Sounds.THICK_SKIN_2690, new SkillBonus(Skills.DEFENCE, 0.05)), - BURST_OF_STRENGTH(4, 12, 84, 7, PrayerCategory.GREEN, Sounds.STRENGTH_BURST_2688, new SkillBonus(Skills.STRENGTH, 0.05)), - CLARITY_OF_THOUGHT(7, 12, 85, 9, PrayerCategory.PINK, Sounds.CLARITY_2664, new SkillBonus(Skills.ATTACK, 0.05)), - SHARP_EYE(8, 12, 862, 11, PrayerCategory.LIME_GREEN, Sounds.SHARP_EYE_2685, new SkillBonus(Skills.RANGE, 0.05)), - MYSTIC_WILL(9, 12, 863, 13, PrayerCategory.LIME_GREEN, Sounds.MYSTIC_WILL_2670, new SkillBonus(Skills.MAGIC, 0.05)), - ROCK_SKIN(10, 6, 86, 15, PrayerCategory.BABY_BLUE, Sounds.ROCK_SKIN_2684, new SkillBonus(Skills.DEFENCE, 0.1)), - SUPERHUMAN_STRENGTH(13, 6, 87, 17, PrayerCategory.GREEN, Sounds.SUPERHUMAN_STRENGTH_2689, new SkillBonus(Skills.STRENGTH, 0.1)), - IMPROVED_REFLEXES(16, 6, 88, 19, PrayerCategory.PINK, Sounds.IMPROVED_REFLEXES_2662, new SkillBonus(Skills.ATTACK, 0.1)), - RAPID_RESTORE(19, 26, 89, 21, PrayerCategory.PURPLE, Sounds.RAPID_RESTORE_2679), - RAPID_HEAL(22, 18, 90, 23, PrayerCategory.PURPLE, Sounds.RAPID_HEAL_2678), - PROTECT_ITEMS(25, 18, 91, 25, PrayerCategory.DARK_GREEN, Sounds.PROTECT_ITEMS_1982), - HAWK_EYE(26, 6, 864, 27, PrayerCategory.LIME_GREEN, Sounds.HAWK_EYE_2666, new SkillBonus(Skills.RANGE, 0.1)), - MYSTIC_LORE(27, 6, 865, 29, PrayerCategory.LIME_GREEN, Sounds.MYSTIC_2668, new SkillBonus(Skills.MAGIC, 0.1)), - STEEL_SKIN(28, 3, 92, 31, PrayerCategory.BABY_BLUE, Sounds.STEEL_SKIN_2687, new SkillBonus(Skills.DEFENCE, 0.15)), - ULTIMATE_STRENGTH(31, 3, 93, 33, PrayerCategory.GREEN, Sounds.ULTIMATE_STRENGTH_2691, new SkillBonus(Skills.STRENGTH, 0.15)), - INCREDIBLE_REFLEXES(34, 3, 94, 35, PrayerCategory.PINK, Sounds.INCREDIBLE_REFLEXES_2667, new SkillBonus(Skills.ATTACK, 0.15)), - PROTECT_FROM_SUMMONING(35, 2, 1168, 53, PrayerCategory.DARK_BROWN, PrayerCategory.MAGENTA, new Audio(4262)), + THICK_SKIN(1, 30, 83, 5, PrayerCategory.BABY_BLUE, Sounds.THICK_SKIN_2690, new SkillBonus(Skills.DEFENCE, 0.05)), + BURST_OF_STRENGTH(4, 60, 84, 7, PrayerCategory.GREEN, Sounds.STRENGTH_BURST_2688, new SkillBonus(Skills.STRENGTH, 0.05)), + CLARITY_OF_THOUGHT(7, 60, 85, 9, PrayerCategory.PINK, Sounds.CLARITY_2664, new SkillBonus(Skills.ATTACK, 0.05)), + SHARP_EYE(8, 30, 862, 11, PrayerCategory.LIME_GREEN, Sounds.SHARP_EYE_2685, new SkillBonus(Skills.RANGE, 0.05)), + MYSTIC_WILL(9, 30, 863, 13, PrayerCategory.LIME_GREEN, Sounds.MYSTIC_WILL_2670, new SkillBonus(Skills.MAGIC, 0.05)), + ROCK_SKIN(10, 15, 86, 15, PrayerCategory.BABY_BLUE, Sounds.ROCK_SKIN_2684, new SkillBonus(Skills.DEFENCE, 0.1)), + SUPERHUMAN_STRENGTH(13, 30, 87, 17, PrayerCategory.GREEN, Sounds.SUPERHUMAN_STRENGTH_2689, new SkillBonus(Skills.STRENGTH, 0.1)), + IMPROVED_REFLEXES(16, 30, 88, 19, PrayerCategory.PINK, Sounds.IMPROVED_REFLEXES_2662, new SkillBonus(Skills.ATTACK, 0.1)), + RAPID_RESTORE(19, 30, 89, 21, PrayerCategory.PURPLE, Sounds.RAPID_RESTORE_2679), + RAPID_HEAL(22, 20, 90, 23, PrayerCategory.PURPLE, Sounds.RAPID_HEAL_2678), + PROTECT_ITEMS(25, 20, 91, 25, PrayerCategory.DARK_GREEN, Sounds.PROTECT_ITEMS_1982), + HAWK_EYE(26, 15, 864, 27, PrayerCategory.LIME_GREEN, Sounds.HAWK_EYE_2666, new SkillBonus(Skills.RANGE, 0.1)), + MYSTIC_LORE(27, 15, 865, 29, PrayerCategory.LIME_GREEN, Sounds.MYSTIC_2668, new SkillBonus(Skills.MAGIC, 0.1)), + STEEL_SKIN(28, 10, 92, 31, PrayerCategory.BABY_BLUE, Sounds.STEEL_SKIN_2687, new SkillBonus(Skills.DEFENCE, 0.15)), + ULTIMATE_STRENGTH(31, 20, 93, 33, PrayerCategory.GREEN, Sounds.ULTIMATE_STRENGTH_2691, new SkillBonus(Skills.STRENGTH, 0.15)), + INCREDIBLE_REFLEXES(34, 20, 94, 35, PrayerCategory.PINK, Sounds.INCREDIBLE_REFLEXES_2667, new SkillBonus(Skills.ATTACK, 0.15)), + PROTECT_FROM_SUMMONING(35, 3, 1168, 53, PrayerCategory.DARK_BROWN, PrayerCategory.MAGENTA, new Audio(4262)), PROTECT_FROM_MAGIC(37, 3, 95, 37, PrayerCategory.LIGHT_BROWN, Sounds.PROTECT_FROM_MAGIC_2675), PROTECT_FROM_MISSILES(40, 3, 96, 39, PrayerCategory.LIGHT_BROWN, Sounds.PROTECT_FROM_MISSILES_2677), - PROTECT_FROM_MELEE(43, 4, 97, 41, PrayerCategory.LIGHT_BROWN, Sounds.PROTECT_FROM_MELEE_2676), - EAGLE_EYE(44, 3, 866, 43, PrayerCategory.LIME_GREEN, Sounds.EAGLE_EYE_2665, new SkillBonus(Skills.RANGE, 0.15)), - MYSTIC_MIGHT(45, 3, 867, 45, PrayerCategory.LIME_GREEN, Sounds.MYSTIC_MIGHT_2669, new SkillBonus(Skills.MAGIC, 0.15)), + PROTECT_FROM_MELEE(43, 3, 97, 41, PrayerCategory.LIGHT_BROWN, Sounds.PROTECT_FROM_MELEE_2676), + EAGLE_EYE(44, 10, 866, 43, PrayerCategory.LIME_GREEN, Sounds.EAGLE_EYE_2665, new SkillBonus(Skills.RANGE, 0.15)), + MYSTIC_MIGHT(45, 10, 867, 45, PrayerCategory.LIME_GREEN, Sounds.MYSTIC_MIGHT_2669, new SkillBonus(Skills.MAGIC, 0.15)), RETRIBUTION(46, 12, 98, 47, PrayerCategory.LIGHT_BROWN, PrayerCategory.MAGENTA, new Audio(2682)), REDEMPTION(49, 6, 99, 49, PrayerCategory.LIGHT_BROWN, PrayerCategory.MAGENTA, new Audio(2680)), SMITE(52, 2, 100, 51, PrayerCategory.LIGHT_BROWN, PrayerCategory.MAGENTA, new Audio(2686)), - CHIVALRY(60, 2, 1052, 55, PrayerCategory.PINK, Sounds.KR_CHIVALRY_3826, 65, new SkillBonus(Skills.DEFENCE, 0.2), new SkillBonus(Skills.STRENGTH, 0.18), new SkillBonus(Skills.ATTACK, 0.15)), - PIETY(70, 2, 1053, 57, PrayerCategory.PINK, Sounds.KR_PIETY_3825, 70, new SkillBonus(Skills.DEFENCE, 0.25), new SkillBonus(Skills.STRENGTH, 0.23), new SkillBonus(Skills.ATTACK, 0.2)); + CHIVALRY(60, 4, 1052, 55, PrayerCategory.PINK, Sounds.KR_CHIVALRY_3826, 65, new SkillBonus(Skills.DEFENCE, 0.2), new SkillBonus(Skills.STRENGTH, 0.18), new SkillBonus(Skills.ATTACK, 0.15), new SkillBonus(Skills.MAGIC, 0.15), new SkillBonus(Skills.RANGE, 0.15)), + PIETY(70, 3, 1053, 57, PrayerCategory.PINK, Sounds.KR_PIETY_3825, 70, new SkillBonus(Skills.DEFENCE, 0.25), new SkillBonus(Skills.STRENGTH, 0.23), new SkillBonus(Skills.ATTACK, 0.2), new SkillBonus(Skills.MAGIC, 0.2), new SkillBonus(Skills.RANGE, 0.2)); /** * Represents the a cache of objects related to prayers in order to decide @@ -63,6 +63,7 @@ public enum PrayerType { /** * The drain rate. + * The drain rate X 2 is the number of seconds (not ticks) that it takes to drain 1 point at 0 prayer bonus */ private final int drain; From 8f55baa13eec8e3dac0e06cf3a35d9d2cb51a15e Mon Sep 17 00:00:00 2001 From: randy Date: Sat, 16 Nov 2024 16:19:06 -0700 Subject: [PATCH 75/81] Experience multiplier now scales based on the skill level This slows down the extremely boosted early game while still allowing the multiplier to reduce late-game grind. --- Server/src/main/core/game/node/entity/skill/Skills.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Server/src/main/core/game/node/entity/skill/Skills.java b/Server/src/main/core/game/node/entity/skill/Skills.java index 9f550245a..bc07f8e25 100644 --- a/Server/src/main/core/game/node/entity/skill/Skills.java +++ b/Server/src/main/core/game/node/entity/skill/Skills.java @@ -290,7 +290,13 @@ public final class Skills { private double getExperienceMod(int slot, double experience, boolean playerMod, boolean multiplyer) { //Keywords for people ctrl + Fing the project //xprate xp rate xp multiplier skilling rate - return experienceMultiplier; + + //Snowscape Custom: experience multiplier starts at 1x and scales to the selected multiplier as level incrceases + double perLevel = (experienceMutiplier-1)/100; + double finalMult = staticLevels[slot]*perLevel+1; + return finalMult; + //return experienceMultiplier; + /*if (!(entity instanceof Player)) { return 1.0; } From 63c7fc3f702e1a2560cbc9046cc4c1357e8c2f93 Mon Sep 17 00:00:00 2001 From: randy Date: Sat, 16 Nov 2024 16:45:43 -0700 Subject: [PATCH 76/81] Fixed typo in variable name --- Server/src/main/core/game/node/entity/skill/Skills.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/core/game/node/entity/skill/Skills.java b/Server/src/main/core/game/node/entity/skill/Skills.java index bc07f8e25..fc3ed9191 100644 --- a/Server/src/main/core/game/node/entity/skill/Skills.java +++ b/Server/src/main/core/game/node/entity/skill/Skills.java @@ -292,7 +292,7 @@ public final class Skills { //xprate xp rate xp multiplier skilling rate //Snowscape Custom: experience multiplier starts at 1x and scales to the selected multiplier as level incrceases - double perLevel = (experienceMutiplier-1)/100; + double perLevel = (experienceMultiplier-1)/100; double finalMult = staticLevels[slot]*perLevel+1; return finalMult; //return experienceMultiplier; From ee6f83eb7e0b1b4d3b1ac970f8bc96a4e650e766 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 17 Nov 2024 10:56:19 -0700 Subject: [PATCH 77/81] Improved timing of pickpocket repeating, and allowed repeating even when caught --- .../content/global/skill/thieving/ThievingListeners.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Server/src/main/content/global/skill/thieving/ThievingListeners.kt b/Server/src/main/content/global/skill/thieving/ThievingListeners.kt index 8068d35eb..77a7f25dc 100644 --- a/Server/src/main/content/global/skill/thieving/ThievingListeners.kt +++ b/Server/src/main/content/global/skill/thieving/ThievingListeners.kt @@ -68,8 +68,8 @@ class ThievingListeners : InteractionListener { return@on true } - //Custom portion. Repeat pickpocket, only proceed every other tick - if (GameWorld.ticks % 2 == 0) { + //Custom portion. Repeat pickpocket, only proceed if it has been long enough since the last pickpocket action + if (getAttribute(player, "pickpockettick", 0) <= GameWorld.ticks) { player.animator.animate(PICKPOCKET_ANIM) val lootTable = pickpocketRoll(player, pickpocketData.low, pickpocketData.high, pickpocketData.table) @@ -79,7 +79,9 @@ class ThievingListeners : InteractionListener { playHurtAudio(player, 20) - stun(player, pickpocketData.stunTime) + //stun(player, pickpocketData.stunTime) + stun(player, 0) + setAttribute(player, "pickpockettick", GameWorld.ticks + pickpocketData.stunTime) player.impactHandler.manualHit(node.asNpc(),RandomFunction.random(pickpocketData.stunDamageMin,pickpocketData.stunDamageMax),ImpactHandler.HitsplatType.NORMAL) @@ -87,6 +89,7 @@ class ThievingListeners : InteractionListener { } else { playAudio(player, Sounds.PICK_2581) //player.lock(2) + setAttribute(player, "pickpockettick", GameWorld.ticks + 2) lootTable.forEach { player.inventory.add(it) } player.skills.addExperience(Skills.THIEVING,pickpocketData.experience) } From 5319cabdae527cd96b3cca3a31845d81459ed047 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 17 Nov 2024 12:59:35 -0700 Subject: [PATCH 78/81] Selecting "make 10 bars" in the smelting interface will now make 30, allowing a full inventory --- .../main/content/global/handlers/iface/SmeltingInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/handlers/iface/SmeltingInterface.java b/Server/src/main/content/global/handlers/iface/SmeltingInterface.java index 4032ff524..b7fadd28c 100644 --- a/Server/src/main/content/global/handlers/iface/SmeltingInterface.java +++ b/Server/src/main/content/global/handlers/iface/SmeltingInterface.java @@ -49,7 +49,7 @@ public class SmeltingInterface extends ComponentPlugin { * @author 'Vexia */ public enum BarButton { - BRONZE_1(16, Bar.BRONZE, 1), BRONZE_5(15, Bar.BRONZE, 5), BRONZE_10(14, Bar.BRONZE, 10), BRONZE_X(13, Bar.BRONZE, -1), BLURITE_1(20, Bar.BLURITE, 1), BLURITE_5(19, Bar.BLURITE, 5), BLURITE_10(18, Bar.BLURITE, 10), BLURITE_X(17, Bar.BLURITE, -1), IRON_1(24, Bar.IRON, 1), IRON_5(23, Bar.IRON, 5), IRON_10(22, Bar.IRON, 10), IRON_X(21, Bar.IRON, -1), SILVER_1(28, Bar.SILVER, 1), SILVER_5(27, Bar.SILVER, 5), SILVER_10(26, Bar.SILVER, 10), SILVER_X(25, Bar.SILVER, -1), STEEL_1(32, Bar.STEEL, 1), STEEL_5(31, Bar.STEEL, 5), STEEL_10(30, Bar.STEEL, 10), STEEL_X(29, Bar.STEEL, -1), GOLD_1(36, Bar.GOLD, 1), GOLD_5(35, Bar.GOLD, 5), GOLD_10(34, Bar.GOLD, 10), GOLD_X(33, Bar.GOLD, -1), MITHRIL_1(40, Bar.MITHRIL, 1), MITHRIL_5(39, Bar.MITHRIL, 5), MITHRIL_10(38, Bar.MITHRIL, 10), MITHRIL_X(37, Bar.MITHRIL, -1), ADAMANT_1(44, Bar.ADAMANT, 1), ADAMANT_5(43, Bar.ADAMANT, 5), ADAMANT_10(42, Bar.ADAMANT, 10), ADAMANT_X(41, Bar.ADAMANT, -1), RUNE_1(48, Bar.RUNITE, 1), RUNE_5(47, Bar.RUNITE, 5), RUNE_10(46, Bar.RUNITE, 10), RUNE_X(45, Bar.RUNITE, -1); + BRONZE_1(16, Bar.BRONZE, 1), BRONZE_5(15, Bar.BRONZE, 5), BRONZE_10(14, Bar.BRONZE, 30), BRONZE_X(13, Bar.BRONZE, -1), BLURITE_1(20, Bar.BLURITE, 1), BLURITE_5(19, Bar.BLURITE, 5), BLURITE_10(18, Bar.BLURITE, 30), BLURITE_X(17, Bar.BLURITE, -1), IRON_1(24, Bar.IRON, 1), IRON_5(23, Bar.IRON, 5), IRON_10(22, Bar.IRON, 30), IRON_X(21, Bar.IRON, -1), SILVER_1(28, Bar.SILVER, 1), SILVER_5(27, Bar.SILVER, 5), SILVER_10(26, Bar.SILVER, 30), SILVER_X(25, Bar.SILVER, -1), STEEL_1(32, Bar.STEEL, 1), STEEL_5(31, Bar.STEEL, 5), STEEL_10(30, Bar.STEEL, 30), STEEL_X(29, Bar.STEEL, -1), GOLD_1(36, Bar.GOLD, 1), GOLD_5(35, Bar.GOLD, 5), GOLD_10(34, Bar.GOLD, 30), GOLD_X(33, Bar.GOLD, -1), MITHRIL_1(40, Bar.MITHRIL, 1), MITHRIL_5(39, Bar.MITHRIL, 5), MITHRIL_10(38, Bar.MITHRIL, 30), MITHRIL_X(37, Bar.MITHRIL, -1), ADAMANT_1(44, Bar.ADAMANT, 1), ADAMANT_5(43, Bar.ADAMANT, 5), ADAMANT_10(42, Bar.ADAMANT, 30), ADAMANT_X(41, Bar.ADAMANT, -1), RUNE_1(48, Bar.RUNITE, 1), RUNE_5(47, Bar.RUNITE, 5), RUNE_10(46, Bar.RUNITE, 30), RUNE_X(45, Bar.RUNITE, -1); /** * Constructs a new {@code BarButton} {@code Object}. From a86b734e0dac8363d7dec14999fb63daf9700bb8 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 17 Nov 2024 13:04:51 -0700 Subject: [PATCH 79/81] Replaced "Make 10" with "Make 30" for crafting interfaces that use the chat dialogue The client will still display 10, but the action will repeat 30 times. --- .../main/core/game/dialogue/SkillDialogueHandler.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Server/src/main/core/game/dialogue/SkillDialogueHandler.kt b/Server/src/main/core/game/dialogue/SkillDialogueHandler.kt index 58e692b23..ada3a4232 100644 --- a/Server/src/main/core/game/dialogue/SkillDialogueHandler.kt +++ b/Server/src/main/core/game/dialogue/SkillDialogueHandler.kt @@ -154,8 +154,8 @@ open class SkillDialogueHandler( // "Make 5 sets" Option 3 -> 5 // "Make 10 sets" Option - 2 -> 10 - else -> 10 + 2 -> 30 + else -> 30 } } }, @@ -182,7 +182,7 @@ open class SkillDialogueHandler( when (buttonId) { 6, 10 -> return 1 5, 9 -> return 5 - 4, 8 -> return 10 + 4, 8 -> return 30 3, 7 -> return -1 } return 1 @@ -211,7 +211,7 @@ open class SkillDialogueHandler( when (buttonId) { 7, 11, 15 -> return 1 6, 10, 14 -> return 5 - 5, 9, 13 -> return 10 + 5, 9, 13 -> return 30 4, 8, 12 -> return -1 } return 1 @@ -241,7 +241,7 @@ open class SkillDialogueHandler( when (buttonId) { 8, 12, 16, 20 -> return 1 7, 11, 15, 19 -> return 5 - 6, 10, 14, 18 -> return 10 + 6, 10, 14, 18 -> return 30 5, 9, 13, 17 -> return -1 } return 1 @@ -278,7 +278,7 @@ open class SkillDialogueHandler( when (buttonId) { 9, 13, 17, 21, 25 -> return 1 8, 12, 16, 20, 24 -> return 5 - 7, 11, 15, 19, 23 -> return 10 + 7, 11, 15, 19, 23 -> return 30 6, 10, 14, 18, 22 -> return -1 } return 1 From 9ed560cca674ad87f6b3a33d1d1c6c402a1f31db Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 17 Nov 2024 14:16:39 -0700 Subject: [PATCH 80/81] Can now fletch arrow shafts from higher tier logs, getting more arrowshafts in return This uses the same exp, level requirements, and arrowshaft output as Old School Runescape. --- .../global/skill/fletching/Fletching.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Server/src/main/content/global/skill/fletching/Fletching.java b/Server/src/main/content/global/skill/fletching/Fletching.java index de5a99e65..bc2b49f79 100644 --- a/Server/src/main/content/global/skill/fletching/Fletching.java +++ b/Server/src/main/content/global/skill/fletching/Fletching.java @@ -265,13 +265,13 @@ public class Fletching { } } private enum Items{ - STANDARD(1511,FletchingItems.ARROW_SHAFT, FletchingItems.SHORT_BOW, FletchingItems.LONG_BOW, FletchingItems.WOODEN_STOCK), + STANDARD(1511, FletchingItems.ARROW_SHAFT, FletchingItems.SHORT_BOW, FletchingItems.LONG_BOW, FletchingItems.WOODEN_STOCK), ACHEY(2862, FletchingItems.OGRE_ARROW_SHAFT), - OAK(1521, FletchingItems.OAK_SHORTBOW, FletchingItems.OAK_LONGBOW, FletchingItems.OAK_STOCK), - WILLOW(1519, FletchingItems.WILLOW_SHORTBOW, FletchingItems.WILLOW_LONGBOW, FletchingItems.WILLOW_STOCK), - MAPLE(1517, FletchingItems.MAPLE_SHORTOW, FletchingItems.MAPLE_LONGBOW, FletchingItems.MAPLE_STOCK), - YEW(1515, FletchingItems.YEW_SHORTBOW, FletchingItems.YEW_LONGBOW, FletchingItems.YEW_STOCK), - MAGIC(1513, FletchingItems.MAGIC_SHORTBOW, FletchingItems.MAGIC_LONGBOW), + OAK(1521, FletchingItems.OAK_ARROW_SHAFT, FletchingItems.OAK_SHORTBOW, FletchingItems.OAK_LONGBOW, FletchingItems.OAK_STOCK), + WILLOW(1519, FletchingItems.WILLOW_ARROW_SHAFT, FletchingItems.WILLOW_SHORTBOW, FletchingItems.WILLOW_LONGBOW, FletchingItems.WILLOW_STOCK), + MAPLE(1517, FletchingItems.MAPLE_ARROW_SHAFT, FletchingItems.MAPLE_SHORTOW, FletchingItems.MAPLE_LONGBOW, FletchingItems.MAPLE_STOCK), + YEW(1515, FletchingItems.YEW_ARROW_SHAFT, FletchingItems.YEW_SHORTBOW, FletchingItems.YEW_LONGBOW, FletchingItems.YEW_STOCK), + MAGIC(1513, FletchingItems.MAGIC_ARROW_SHAFT, FletchingItems.MAGIC_SHORTBOW, FletchingItems.MAGIC_LONGBOW), TEAK(6333, FletchingItems.TEAK_STOCK), MAHOGANY(6332, FletchingItems.MAHOGANY_STOCK); @@ -306,26 +306,31 @@ public class Fletching { OGRE_ARROW_SHAFT(2864, 6.4, 5, 4), //Oak logs + OAK_ARROW_SHAFT(52, 10, 15, 30), OAK_SHORTBOW(54, 16.5, 20, 1), OAK_LONGBOW(56,25,25,1), OAK_STOCK(9442, 16, 24, 1), //Willow logs + WILLOW_ARROW_SHAFT(52, 15, 30, 45), WILLOW_SHORTBOW(60, 33.3, 35, 1), WILLOW_LONGBOW(58, 41.5, 40, 1), WILLOW_STOCK(9444, 22, 39, 1), //Maple logs + MAPLE_ARROW_SHAFT(52, 20, 45, 60), MAPLE_SHORTOW(64, 50, 50, 1), MAPLE_LONGBOW(62, 58.3, 55, 1), MAPLE_STOCK(9448, 32, 54, 1), //Yew logs + YEW_ARROW_SHAFT(52, 25, 60, 75), YEW_SHORTBOW(68, 67.5, 65, 1), YEW_LONGBOW(66, 75, 70, 1), YEW_STOCK(9452, 50, 69, 1), //Magic logs + MAGIC_ARROW_SHAFT(52, 30, 75, 90), MAGIC_SHORTBOW(72, 83.3, 80,1), MAGIC_LONGBOW(70, 91.5, 85, 1), From eebcb2527412dcfe30e1e6d65f1fd6a5b8a782f6 Mon Sep 17 00:00:00 2001 From: randy Date: Sun, 17 Nov 2024 14:18:44 -0700 Subject: [PATCH 81/81] Updated fletching message to include the new arrowshaft quantities --- .../content/global/skill/fletching/FletchingPulse.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Server/src/main/content/global/skill/fletching/FletchingPulse.java b/Server/src/main/content/global/skill/fletching/FletchingPulse.java index 9c7d0d638..dbc18af9f 100644 --- a/Server/src/main/content/global/skill/fletching/FletchingPulse.java +++ b/Server/src/main/content/global/skill/fletching/FletchingPulse.java @@ -110,6 +110,16 @@ public final class FletchingPulse extends SkillPulse { switch (fletch) { case ARROW_SHAFT: return "You carefully cut the wood into 15 arrow shafts."; + case OAK_ARROW_SHAFT: + return "You carefully cut the wood into 30 arrow shafts."; + case WILLOW_ARROW_SHAFT: + return "You carefully cut the wood into 45 arrow shafts."; + case MAPLE_ARROW_SHAFT: + return "You carefully cut the wood into 60 arrow shafts."; + case YEW_ARROW_SHAFT: + return "You carefully cut the wood into 75 arrow shafts."; + case MAGIC_ARROW_SHAFT: + return "You carefully cut the wood into 90 arrow shafts."; default: return "You carefully cut the wood into " + (StringUtils.isPlusN(fletch.getItem().getName()) ? "an" : "a") + " " + fletch.getItem().getName().replace("(u)", "").trim() + "."; }