From 86bf59ee76d8e5630277b0d556439b1d835d45f0 Mon Sep 17 00:00:00 2001 From: Copilot Date: Sat, 15 Aug 2026 11:42:02 -0400 Subject: [PATCH 01/14] Added Farquie.kt FredsFarmGoblin.kt --- .../kandarin/tree_gnome_stronghold/Farquie.kt | 14 ++++++++++++ .../lumbridge/farm/FredsFarmGoblin.kt | 22 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 game/src/main/kotlin/content/area/kandarin/tree_gnome_stronghold/Farquie.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/lumbridge/farm/FredsFarmGoblin.kt diff --git a/game/src/main/kotlin/content/area/kandarin/tree_gnome_stronghold/Farquie.kt b/game/src/main/kotlin/content/area/kandarin/tree_gnome_stronghold/Farquie.kt new file mode 100644 index 0000000000..84cfc4bf24 --- /dev/null +++ b/game/src/main/kotlin/content/area/kandarin/tree_gnome_stronghold/Farquie.kt @@ -0,0 +1,14 @@ +package content.area.kandarin.tree_gnome_stronghold + +import content.entity.player.dialogue.Idle +import content.entity.player.dialogue.type.npc +import world.gregs.voidps.engine.Script + +class Farquie : Script { + + init { + npcOperate("Talk-to", "farquie") { + npc("Everyone has gone away on a honeymoon and left me here to clean up their mess.") + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/lumbridge/farm/FredsFarmGoblin.kt b/game/src/main/kotlin/content/area/misthalin/lumbridge/farm/FredsFarmGoblin.kt new file mode 100644 index 0000000000..c549878137 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/lumbridge/farm/FredsFarmGoblin.kt @@ -0,0 +1,22 @@ +package content.area.misthalin.lumbridge.farm + +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.type.npc +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.instruction.handle.interactPlayer +import world.gregs.voidps.engine.entity.character.npc.NPC +import world.gregs.voidps.engine.entity.character.player.Player + +class FredsFarmGoblin : Script { + + init { + npcOperate("Talk-to", "goblin_machete_orange") { (target) -> + talk(target) + } + } + + suspend fun Player.talk(target: NPC) { + npc("I kill you human!") + target.interactPlayer(this, "Attack") + } +} From ea912bedf29d972034e6e6e2521c439f8e83687c Mon Sep 17 00:00:00 2001 From: Copilot Date: Sun, 16 Aug 2026 10:41:29 -0400 Subject: [PATCH 02/14] These npc and spawn changes bring the game closer to how it originally was in 2011 revision 634, along with a few fixes. Changed: draynor.npcs-spawns.toml -Added a new gull_draynor spawn. Source: osrs.world 634. -Adjusted the spawn locations of gull_draynor and gull_draynor_2. Source: osrs.world 634, https://www.youtube.com/watch?v=xY6cIEoNP1A 1:16. falador.npc-spawns.toml -Added 2 missing highwayman. Source: osrs live server, https://www.youtube.com/watch?v=g-KKKt5HV60. -Added missing pigs to Sarah's farm and corrected the existing model that was there previously. Source: osrs.world 634, https://www.youtube.com/watch?v=z7yeZ8ztPqo 0:11, https://www.youtube.com/watch?v=g2EaPwHIavw 0:43. -Adjusted the location of chicken_falador_* spawns to match 2011. Source: osrs.world 634, https://www.youtube.com/watch?v=4lJGZDrfE_0, https://www.youtube.com/watch?v=RGJ8QyKHTmI. -Adjusted the location of rooster_falador to its proper location. Source: https://www.youtube.com/watch?v=4lJGZDrfE_0. -Adjusted the location of dog spawn. Source: osrs.world 634, osrs live server. -Adjusted the amount of ducklings and ducks in the moat to match 2011. Source: osrs live server, https://www.youtube.com/watch?v=AzUMggjzaFU 3:47. -Corrected the number of cows in Sarah's farm. Source: osrs live server (still seems to be using rs2 spawns for most npcs here), https://www.youtube.com/watch?v=jqAmLW2M94o. -Removed 2 swimming duck spawns. It seemed to be in the wrong region and not on the correct tiles. Source: osrs.world 634, https://www.youtube.com/watch?v=4lJGZDrfE_0. freds_farm.npc-spawns.toml -Added goblin_machete_orange after discovering new evidence. Source: https://www.youtube.com/watch?v=BoSFtTZhQds 5:27, https://www.youtube.com/watch?v=EV0xHIihjTo 1:30. -Added goblin_spear_green after discovering new evidence. Source: https://www.youtube.com/watch?v=zJQS-7HNjuE, https://www.youtube.com/watch?v=vs_dYJKvQFg 6:54, https://www.youtube.com/watch?v=XhUMSasgU2s 11:29, https://www.youtube.com/watch?v=EV0xHIihjTo 1:24. The spawn location was implemented using sources and guesswork. -Added a farmer spawn in the potato field. Source: https://www.youtube.com/watch?v=BmxCYmTCFPM 5:05, https://www.youtube.com/watch?v=qAgWJh4wpVc 3:53. The spawn location was implemented using the sources and guesswork. -Added a farmer spawn north of the potato field. Source: osrs live server, https://www.youtube.com/watch?v=vs_dYJKvQFg 4:35. -Removed the ducks in and around the potato field. Source: https://www.youtube.com/watch?v=qAgWJh4wpVc 3:52. lumbridge.npc-spawns.toml -Reverted 2 giant rat spawns behind lumbridge castle after discovering new evidence. The original spawn count of 8 was correct; I wasn't able to confirm until finding this video from early Feb 2011. The number of models and amount of giant rats should now be the same as it was in 2011. Source: https://www.youtube.com/watch?v=9f8r5_Hp0k8 13:22. -Added 2 goblin_turquoise_topless_mohawk spawns east of freds farm after discovering new evidence. Source: https://www.youtube.com/watch?v=JHMftOwD0qY 3:13, https://www.youtube.com/watch?v=gTBLFXMMW14 35:52, https://www.youtube.com/watch?v=GDyiP_yazkE 1:44. -Added 2 giant spider spawns behind lumbridge castle after discovering new evidence. Source: osrs.world, osrs live server, https://www.youtube.com/watch?v=Fn5su5dHtVo 2:19, https://www.youtube.com/watch?v=YonvRnpvadk 2:29. -Added spider spawns around the H.A.M. hideout. Source: osrs.world 634, https://www.youtube.com/watch?v=EV0xHIihjTo 3:33, https://www.youtube.com/watch?v=sbKFCSxhj-Y. -Added a missing unicorn spawn. Source: osrs.world 634, osrs live server, https://www.youtube.com/watch?v=-nbg7kY3OQs, https://www.youtube.com/watch?v=PjiohxXXuXU 0:23. -Adjusted the spawn locations of crows to help their wandering behaviour become closer to how it was in 2011; this also stops them from bunching up and getting stuck outside the northeastern fencing. I've applied the changes with slight guesswork. Source: osrs.world 736 cache, https://www.youtube.com/watch?v=Vh8gZ1oenVQ, https://www.youtube.com/watch?v=aGPeoToyOjs 8:21. -Adjusted the giant spider spawns near the H.A.M. hideout to be closer to 2011. Source: osrs.world 634, youtube videos from 2010-2011. -Adjusted goblin spawns behind lumbridge castle; they should now be the same as early 2011. Their spawn locations moved closer to the campfire once it was added to the map. Sources: https://www.youtube.com/watch?v=w0E4hnEJkGo, https://www.youtube.com/watch?v=31e99OrCjbE 3:33, https://www.youtube.com/watch?v=HpIdOUz4buw, https://www.youtube.com/watch?v=Fn5su5dHtVo. -Adjusted the goblin models and spawn locations south of draynor jail to be closer to 2011. Source: osrs.world 634 was used for spawn locations; https://www.youtube.com/watch?v=w0E4hnEJkGo 3:15 used for accurate models, https://www.youtube.com/watch?v=Fn5su5dHtVo 3:50. varrock.npc-spawns.toml -Added new npc farquie. Source: https://runescape.wiki/w/Farquie_the_Cleaner, https://www.youtube.com/watch?v=riuuozz0FUo The yellow dot doesn't move and is in the same spot that Farquie is in the wiki, so it's safe to assume this is the correct npc placement for Farquie. -Adjusted a few cow_calf_* and cow_* spawns to match 2011. Source: https://www.youtube.com/watch?v=qreoUtJ9A68. -Adjusted many duck_*_swim spawns to match 2011 better. Source: https://www.youtube.com/watch?v=BPefdT8H_YY 0:49, https://www.youtube.com/watch?v=41wY02ass_w 1:28, https://www.youtube.com/watch?v=7gurEiVUWtM 5:19. Other changes: Wander.kt -Updated Wander.kt so NPC wandering can be enabled by data config via wander_range instead of depending only on the cache walkMode. If an NPC has a wander_range entry in npc_ranges, the engine now treats that as the source of truth for whether it should random-walk. This lets data-defined NPCs like the Draynor gulls roam correctly even when their cache walk mode does not mark them as wanderers. Co-Authored by Copilot draynor.npcs.toml -Added collision = "sky" to the gull npc definitions. This fixes draynor gulls never moving, they can now fly around again. Cows.kt -Updated cow idle behavior so the eat_grass timer can trigger while cows are wandering. This fixes cows never mooing or playing the grass-eating animation because the engine was switching them out of EmptyMode before the timer tick ran. Co-Authored by Copilot LumbridgeGuardsmanAttackable.kt -Updated the new giant rat IDs into the list for attackable npc targets. This makes the lumbridge guardsman be able to target and attack giant rats again. goblin_village.npc-spawns.toml -Moved 2 goblin spawns at goblin village. This prevents one from spawning stuck on a tile beneath a flag and the other from spawning in the air. spider.npcs.toml -Corrected the giant spider hitpoints to 67 after discovering new evidence. Source: https://www.youtube.com/watch?v=sbKFCSxhj-Y 0:25. falador.npcs.toml -Added pig_3, pig_4, piglet_4, piglet_5. -Fixed the swan_falador not being able to move by giving it collision = "sea". -Fixed the chicken_falador_* not being able to respawn. -Changed the highwayman_falador hunt_mode to "highwayman". FredsFarmGoblin.kt -Added a dialogue and behaviour similar to rs2. A bit of guess work went into the interaction due to only having one source. Sources: https://runescape.wiki/w/Transcript:Goblin_(Goblin_Village), https://www.youtube.com/watch?v=BoSFtTZhQds. goblin.npcs.toml -Added new goblin type goblin_machete_orange. -Added new goblin type goblin_spear_green. -Changed the goblin hitpoints to 67 after discovering new evidence. Source: https://www.youtube.com/watch?v=-l5y9HL7kCQ. -Changed the goblin_orange_hat_spear hitpoints to 160 after discovering new evidence. Source: https://www.youtube.com/watch?v=plYKgRXXSdY. gnome.npcs.toml -Added new gnome farquie. Source: https://runescape.wiki/w/Farquie_the_Cleaner, https://runescape.wiki/w/Gnomecopter_Tours. cow.npcs.toml -Corrected the cow_default hitpoints to 107 after discovering new evidence. Source: https://www.youtube.com/watch?v=XiV4OX_R7_k 2:11, https://www.youtube.com/watch?v=MxorRK-wJ1Y. -Corrected the cow_calf hitpoints to 69 after discovering new evidence. Source: https://www.youtube.com/watch?v=R1Ikv5I1VmM 1:56. wander_ranges.tables.toml -Added "cow_calf" and gave cow_2, cow_brown_2, cow_calf_2, cow_calf_3, a wander range of 4. This fixes them never moving. -Added wander ranges to pig_3, pig_4, piglet_4, piglet_5. This fixes them never moving. -Added wander ranges to swan_falador. This fixes them never moving. -Added wander ranges to gull_draynor, gull_draynor_2. This fixes them never moving. Highwayman.kt -This makes all highwayman npcs behave closer to how they did in 2011, a very basic implementation. sinclair_mansion.npcs.toml -Changed the highwayman_sinclair_mansion, highwayman_no_hood hunt_mode to "highwayman". freds_farm.npcs.toml -Added farmer_2. hunt_modes.toml -Added [highwayman]. pickpocket.tables.toml -Added farmer_2 with type = farmer. --- .../asgarnia/falador/falador.npc-spawns.toml | 54 ++++++------- data/area/asgarnia/falador/falador.npcs.toml | 22 +++++- .../goblin_village.npc-spawns.toml | 6 +- .../sinclair_mansion.npcs.toml | 4 +- .../misthalin/draynor/draynor.npc-spawns.toml | 3 +- data/area/misthalin/draynor/draynor.npcs.toml | 2 + .../freds_farm/freds_farm.npc-spawns.toml | 13 +-- .../lumbridge/freds_farm/freds_farm.npcs.toml | 4 + .../lumbridge/lumbridge.npc-spawns.toml | 79 ++++++++++++------- .../misthalin/varrock/varrock.npc-spawns.toml | 35 +------- data/entity/npc/animal/cow/cow.npcs.toml | 4 +- data/entity/npc/humanoid/gnomes.npcs.toml | 7 +- data/entity/npc/hunt_modes.toml | 8 ++ .../npc/monster/goblin/goblin.npcs.toml | 16 +++- .../monster/reptile/spider/spider.npcs.toml | 2 +- data/entity/npc/wander_ranges.tables.toml | 44 ++++++----- data/skill/thieving/pickpocket.tables.toml | 3 + .../engine/entity/character/mode/Wander.kt | 6 +- .../area/asgarnia/falador/Highwayman.kt | 23 ++++++ .../castle/LumbridgeGuardsmanAttackble.kt | 8 +- .../area/misthalin/lumbridge/farm/Cows.kt | 10 ++- 21 files changed, 218 insertions(+), 135 deletions(-) create mode 100644 game/src/main/kotlin/content/area/asgarnia/falador/Highwayman.kt diff --git a/data/area/asgarnia/falador/falador.npc-spawns.toml b/data/area/asgarnia/falador/falador.npc-spawns.toml index f1ec5568c1..30f9ea3052 100644 --- a/data/area/asgarnia/falador/falador.npc-spawns.toml +++ b/data/area/asgarnia/falador/falador.npc-spawns.toml @@ -47,13 +47,12 @@ spawns = [ { id = "banker_falador", x = 2948, y = 3366, direction = "NORTH" }, { id = "banker_falador", x = 2949, y = 3366, direction = "NORTH" }, { id = "duck_swim", x = 2992, y = 3383 }, - { id = "duck_swim", x = 2977, y = 3357 }, { id = "duck_swim", x = 2981, y = 3358 }, + { id = "duck_swim", x = 2972, y = 3360 }, { id = "duck_grey_walk", x = 2990, y = 3379 }, { id = "drake", x = 2993, y = 3386 }, { id = "duck_grey_swim", x = 2989, y = 3384 }, { id = "duck_grey_swim", x = 2992, y = 3384 }, - { id = "duck_grey_swim", x = 2978, y = 3356 }, { id = "duck_grey_swim", x = 3982, y = 3357 }, { id = "chicken", x = 2966, y = 3346 }, { id = "sir_vyvin", x = 2983, y = 3335, level = 2 }, @@ -64,15 +63,15 @@ spawns = [ { id = "doric", x = 2952, y = 3451 }, { id = "musician_falador", x = 2967, y = 3412, direction = "SOUTH" }, # 12083 - { id = "cow_calf", x = 3031, y = 3312 }, - { id = "cow_calf", x = 3042, y = 3312 }, - { id = "cow_calf", x = 3029, y = 3309 }, - { id = "cow_default", x = 3025, y = 3307 }, - { id = "cow_default", x = 3029, y = 3305 }, - { id = "cow_default", x = 3033, y = 3305 }, - { id = "cow_default", x = 3037, y = 3306 }, + { id = "cow_calf", x = 3031, y = 3311 }, + { id = "cow_calf", x = 3042, y = 3311 }, + { id = "cow_calf", x = 3027, y = 3308 }, + { id = "cow_default", x = 3026, y = 3307 }, + { id = "cow_default", x = 3029, y = 3301 }, + { id = "cow_default", x = 3030, y = 3305 }, + { id = "cow_default", x = 3034, y = 3306 }, { id = "cow_brown", x = 3040, y = 3311 }, - { id = "cow_brown", x = 3030, y = 3300 }, + { id = "cow_brown", x = 3031, y = 3301 }, { id = "cow_light_spots", x = 3029, y = 3311 }, { id = "rat", x = 3015, y = 3295 }, { id = "rat", x = 3019, y = 3296 }, @@ -98,30 +97,27 @@ spawns = [ { id = "captain_korasi_falador_2", x = 2999, y = 3374, members = true }, { id = "jessika_falador_2", x = 2999, y = 3373, members = true }, { id = "idria", x = 2990, y = 3340, members = true }, - { id = "cow_light_spots", x = 3029, y = 3312, members = true }, { id = "highwayman_sinclair_mansion", x = 2988, y = 3419 }, { id = "sir_tiffy_cashien", x = 2997, y = 3373 }, { id = "sarah", x = 3038, y = 3292, members = true }, { id = "sheepdog", x = 3035, y = 3295 }, - { id = "rooster_falador", x = 3018, y = 3287, members = true }, - { id = "chicken_falador", x = 3022, y = 3284, members = true }, - { id = "chicken_falador", x = 3026, y = 3286, members = true }, + { id = "rooster_falador", x = 3014, y = 3292, members = true }, + { id = "chicken_falador", x = 3027, y = 3288, members = true }, { id = "chicken_falador", x = 3029, y = 3286, members = true }, - { id = "chicken_falador_2", x = 3022, y = 3287, members = true }, - { id = "chicken_falador_2", x = 3023, y = 3285, members = true }, - { id = "chicken_falador_2", x = 3023, y = 3289, members = true }, { id = "chicken_falador_2", x = 3031, y = 3286, members = true }, - { id = "chicken_falador_3", x = 3019, y = 3287 }, - { id = "chicken_falador_3", x = 3031, y = 3288 }, + { id = "chicken_falador_2", x = 3019,y = 3285, members = true }, + { id = "chicken_falador_3", x = 3016, y = 3287, members = true }, + { id = "chicken_falador_3", x = 3031, y = 3288, members = true }, + { id = "chicken_falador", x = 3018, y = 3283, members = true }, + { id = "chicken_falador", x = 3016, y = 3294, members = true }, + { id = "chicken_falador_2", x = 3018, y = 3289 , members = true}, + { id = "chicken_falador_2", x = 3018, y = 3295 , members = true}, { id = "elstan", x = 3053, y = 3308 }, { id = "heskel", x = 3001, y = 3373 }, { id = "mysterious_ghost_falador", x = 3053, y = 3378, level = 1, members = true }, { id = "frog_falador", x = 2918, y = 3319 }, { id = "duck_grey_swim", x = 2968, y = 3359 }, - { id = "duck_grey_swim", x = 2974, y = 3359 }, { id = "duck_grey_swim", x = 2976, y = 3359 }, - { id = "duck_grey_swim", x = 2979, y = 3359 }, - { id = "duck_grey_swim", x = 3020, y = 3284 }, { id = "fire_wizard", x = 3003, y = 3266 }, { id = "water_wizard", x = 3000, y = 3266 }, { id = "earth_wizard", x = 3003, y = 3268 }, @@ -192,7 +188,6 @@ spawns = [ { id = "sir_renitee", x = 2981, y = 3341, level = 1, direction = "WEST", members = true }, { id = "garden_supplier", x = 3014, y = 3382 }, { id = "ambassador_spanfipple_falador", x = 2984, y = 3342, level = 1 }, - { id = "duck_swim", x = 3019, y = 3284 }, { id = "rat", x = 3019, y = 3289 }, { id = "rat", x = 3023, y = 3291 }, { id = "wilfred_falador", x = 2959, y = 3415, members = true }, @@ -204,9 +199,6 @@ spawns = [ { id = "sylas_falador", x = 2912, y = 3379, members = true }, { id = "sir_amik_varze_falador", x = 2960, y = 3336, level = 2 }, { id = "ducklings", x = 2975, y = 3359 }, - { id = "ducklings", x = 2977, y = 3359 }, - { id = "ducklings", x = 2980, y = 3359 }, - { id = "ducklings", x = 2982, y = 3358 }, { id = "town_crier_falador", x = 2952, y = 3380, members = true }, { id = "party_pete", x = 3052, y = 3373 }, { id = "megan_falador", x = 3043, y = 3373, level = 1 }, @@ -232,11 +224,12 @@ spawns = [ { id = "baby_squirrel_grey", x = 2955, y = 3276, members = true }, { id = "baby_squirrel_orange", x = 2947, y = 3265, members = true }, { id = "highwayman_falador", x = 3049, y = 3276 }, + { id = "highwayman_falador", x = 3009, y = 3280 }, + { id = "highwayman_falador", x = 3007, y = 3273 }, { id = "tool_leprechaun_miscellania", x = 3056, y = 3310 }, { id = "tool_leprechaun_rimmington", x = 3004, y = 3376, members = true }, { id = "assistant_falador", x = 2996, y = 3451 }, { id = "brother_bordiss_falador", x = 2996, y = 3450, members = true }, - { id = "cow_default", x = 3027, y = 3307 }, { id = "hazelmere_falador", x = 2997, y = 3341, members = true }, { id = "ghommal_falador", x = 2994, y = 3343, members = true }, { id = "harrallak_menarous_falador", x = 2995, y = 3343, members = true }, @@ -268,9 +261,12 @@ spawns = [ { id = "guard_falador_8", x = 2964, y = 3396 }, { id = "guard_falador_8", x = 2965, y = 3398 }, { id = "guard_falador_8", x = 2967, y = 3396 }, - { id = "dog", x = 3022, y = 3288 }, + { id = "dog", x = 3014, y = 3294 }, { id = "gadrin", x = 3021, y = 3339 }, - { id = "pig_2", x = 3017, y = 3307, members = true }, + { id = "pig_3", x = 3015, y = 3307, members = true }, + { id = "pig_4", x = 3017, y = 3309, members = true }, + { id = "piglet_4", x = 3017, y = 3307, members = true }, + { id = "piglet_5", x = 3017, y = 3304, members = true }, # White Knights' Castle { id = "white_knight", x = 2956, y = 3337 }, { id = "white_knight", x = 2962, y = 3338 }, diff --git a/data/area/asgarnia/falador/falador.npcs.toml b/data/area/asgarnia/falador/falador.npcs.toml index 983b8f45e6..809e162be1 100644 --- a/data/area/asgarnia/falador/falador.npcs.toml +++ b/data/area/asgarnia/falador/falador.npcs.toml @@ -144,24 +144,43 @@ examine = "He rules the, er, roost." [chicken_falador] id = 2313 +clone = "chicken" drop_table = "chicken" combat_def = "chicken" hitpoints = 30 [chicken_falador_2] id = 2314 +clone = "chicken" drop_table = "chicken" combat_def = "chicken" hitpoints = 30 [chicken_falador_3] id = 2315 +clone = "chicken" categories = ["birds"] examine = "Yep. Definitely a chicken." drop_table = "chicken" combat_def = "chicken" hitpoints = 30 +[pig_3] +id = 2316 +examine = "Swine." + +[pig_4] +id = 2317 +examine = "Porker." + +[piglet_4] +id = 2318 +examine = "Hog." + +[piglet_5] +id = 2319 +examine = "I shall call him, Mini Pig." + [elstan] id = 2323 north_patch = "farming_veg_patch_falador_nw" @@ -382,6 +401,7 @@ examine = "A dwarf who looks after the mining guild." [swan_falador] id = 3296 +collision = "sea" examine = "A graceful bird." [zandar_horfyre_falador] @@ -474,7 +494,7 @@ str = 2 def = 4 combat_def = "highwayman" attack_bonus = 6 -hunt_mode = "cowardly" +hunt_mode = "highwayman" respawn_delay = 100 drop_table = "highwayman" examine = "He holds up passers by." diff --git a/data/area/asgarnia/goblin_village/goblin_village.npc-spawns.toml b/data/area/asgarnia/goblin_village/goblin_village.npc-spawns.toml index 026b1fc95e..dd25a12596 100644 --- a/data/area/asgarnia/goblin_village/goblin_village.npc-spawns.toml +++ b/data/area/asgarnia/goblin_village/goblin_village.npc-spawns.toml @@ -25,7 +25,7 @@ spawns = [ { id = "goblin_staff_2_green", x = 2954, y = 3491 }, { id = "goblin_mohawk_staff_green", x = 2954, y = 3503 }, { id = "goblin_mohawk_staff_green", x = 2951, y = 3497 }, - { id = "goblin_mohawk_staff_green", x = 2955, y = 3496, level = 2 }, + { id = "goblin_mohawk_staff_green", x = 2955, y = 3497, level = 2 }, { id = "black_bear", x = 2959, y = 3471 }, { id = "black_bear", x = 2974, y = 3470 }, { id = "monk_of_zamorak_goblin_village", x = 2939, y = 3516, level = 1 }, @@ -42,9 +42,9 @@ spawns = [ { id = "goblin_shield_battleaxe_green", x = 2951, y = 3510, members = true }, { id = "goblin_shield_warhammer_green", x = 2957, y = 3507, members = true }, { id = "goblin_staff_2_green", x = 2956, y = 3499 }, - { id = "goblin_mohawk_staff_green", x = 2950, y = 3496 }, + { id = "goblin_mohawk_staff_green", x = 2950, y = 3498 }, { id = "goblin_mohawk_staff_green", x = 2951, y = 3496 }, - { id = "goblin_mohawk_staff_green", x = 2955, y = 3495, level = 2 }, + { id = "goblin_mohawk_staff_green", x = 2954, y = 3496, level = 2 }, { id = "general_bentnoze_goblin_village", x = 2958, y = 3513, members = true }, { id = "general_wartface_goblin_village", x = 2957, y = 3513 }, { id = "grubfoot_goblin_village", x = 2955, y = 3512, members = true }, diff --git a/data/area/kandarin/sinclair_mansion/sinclair_mansion.npcs.toml b/data/area/kandarin/sinclair_mansion/sinclair_mansion.npcs.toml index c321b30345..2cbe18aabe 100644 --- a/data/area/kandarin/sinclair_mansion/sinclair_mansion.npcs.toml +++ b/data/area/kandarin/sinclair_mansion/sinclair_mansion.npcs.toml @@ -12,7 +12,7 @@ def = 2 style = "stab" max_hit_melee = 10 attack_bonus = 6 -hunt_mode = "cowardly" +hunt_mode = "highwayman" respawn_delay = 100 drop_table = "highwayman" examine = "He holds up passers by." @@ -27,7 +27,7 @@ def = 4 style = "stab" max_hit_melee = 10 attack_bonus = 6 -hunt_mode = "cowardly" +hunt_mode = "highwayman" respawn_delay = 100 drop_table = "highwayman" examine = "He holds up passers by." diff --git a/data/area/misthalin/draynor/draynor.npc-spawns.toml b/data/area/misthalin/draynor/draynor.npc-spawns.toml index 8fb0eb8a8a..c94e8c8bc9 100644 --- a/data/area/misthalin/draynor/draynor.npc-spawns.toml +++ b/data/area/misthalin/draynor/draynor.npc-spawns.toml @@ -86,7 +86,8 @@ spawns = [ { id = "fortunato", x = 3085, y = 3250 }, { id = "wise_old_man_2", x = 3088, y = 3255, members = true }, { id = "gull_draynor", x = 3085, y = 3219, members = true }, - { id = "gull_draynor_2", x = 3079, y = 3229, members = true }, + { id = "gull_draynor", x = 3080, y = 3223, members = true }, + { id = "gull_draynor_2", x = 3077, y = 3234, members = true }, { id = "rat", x = 3101, y = 3355 }, { id = "ava", x = 3093, y = 3357, members = true }, { id = "scout_draynor", x = 3072, y = 3336, members = true }, diff --git a/data/area/misthalin/draynor/draynor.npcs.toml b/data/area/misthalin/draynor/draynor.npcs.toml index 271e7e20da..c3a9be0434 100644 --- a/data/area/misthalin/draynor/draynor.npcs.toml +++ b/data/area/misthalin/draynor/draynor.npcs.toml @@ -162,9 +162,11 @@ examine = "He looks as if he could do with a sip of Amontillado." [gull_draynor] id = 450 +collision = "sky" [gull_draynor_2] id = 451 +collision = "sky" [town_crier_draynor] id = 6136 diff --git a/data/area/misthalin/lumbridge/freds_farm/freds_farm.npc-spawns.toml b/data/area/misthalin/lumbridge/freds_farm/freds_farm.npc-spawns.toml index f324e88a7f..f34c699f87 100644 --- a/data/area/misthalin/lumbridge/freds_farm/freds_farm.npc-spawns.toml +++ b/data/area/misthalin/lumbridge/freds_farm/freds_farm.npc-spawns.toml @@ -49,17 +49,12 @@ spawns = [ { id = "ram_freds_farm_2", x = 3199, y = 3270 }, { id = "ram_freds_farm_3", x = 3195, y = 3265 }, { id = "beefy_bill", x = 3180, y = 3320 }, - { id = "duck_grey_swim", x = 3143, y = 3275 }, - { id = "duckling", x = 3142, y = 3273 }, - { id = "duckling", x = 3145, y = 3270 }, - { id = "duck_swim", x = 3144, y = 3269 }, { id = "black_lamb", x = 3208, y = 3260 }, { id = "larry_farmer", x = 3185, y = 3292, members = true }, - { id = "ducklings", x = 3143, y = 3271 }, - { id = "duck_grey_walk", x = 3137, y = 3274, members = true }, - { id = "duck_grey_walk", x = 3150, y = 3274, members = true }, - { id = "drake", x = 3141, y = 3266 }, - { id = "drake", x = 3146, y = 3279 }, + { id = "goblin_spear_green", x = 3161, y = 3278}, + { id = "goblin_machete_orange", x = 3142, y = 3296 }, + { id = "farmer_2", x = 3149, y = 3276 }, + { id = "farmer", x = 3154, y = 3293 }, { id = "farmer", x = 3193, y = 3323 }, { id = "milk_seller", x = 3189, y = 3293}, ] \ No newline at end of file diff --git a/data/area/misthalin/lumbridge/freds_farm/freds_farm.npcs.toml b/data/area/misthalin/lumbridge/freds_farm/freds_farm.npcs.toml index 6a63653a17..ca0223429f 100644 --- a/data/area/misthalin/lumbridge/freds_farm/freds_farm.npcs.toml +++ b/data/area/misthalin/lumbridge/freds_farm/freds_farm.npcs.toml @@ -38,6 +38,10 @@ id = 5423 id = 7 clone = "farmer_lumbridge" +[farmer_2] +id = 1760 +clone = "farmer_lumbridge" + [hay_bales_2] id = 11625 diff --git a/data/area/misthalin/lumbridge/lumbridge.npc-spawns.toml b/data/area/misthalin/lumbridge/lumbridge.npc-spawns.toml index 5eabb05a8b..7079fe9b0a 100644 --- a/data/area/misthalin/lumbridge/lumbridge.npc-spawns.toml +++ b/data/area/misthalin/lumbridge/lumbridge.npc-spawns.toml @@ -1,10 +1,12 @@ spawns = [ # 12594 - { id = "giant_rat_3", x = 3192, y = 3203 }, + { id = "giant_rat_3", x = 3190, y = 3203 }, { id = "giant_rat_3", x = 3192, y = 3211 }, { id = "giant_rat_4", x = 3197, y = 3202 }, - { id = "giant_rat_3", x = 3194, y = 3201 }, - { id = "giant_rat_4", x = 3192, y = 3208 }, + { id = "giant_rat_3", x = 3193, y = 3203 }, + { id = "giant_rat_4", x = 3194, y = 3201 }, + { id = "giant_rat_5", x = 3194, y = 3211 }, + { id = "giant_rat_5", x = 3192, y = 3208 }, { id = "giant_rat_5", x = 3195, y = 3205 }, { id = "lumbridge_guardsman_attackable", x = 3187, y = 3245 }, { id = "lumbridge_guardsman_attackable2", x = 3192, y = 3207 }, @@ -18,39 +20,60 @@ spawns = [ { id = "sheep_light_5", x = 3197, y = 3263 }, { id = "black_sheep", x = 3195, y = 3263 }, { id = "hank", x = 3195, y = 3254 }, - { id = "giant_spider", x = 3165, y = 3249 }, - { id = "giant_spider", x = 3167, y = 3247 }, - { id = "giant_spider", x = 3170, y = 3248 }, - { id = "giant_spider", x = 3170, y = 3245 }, - { id = "giant_spider", x = 3166, y = 3242 }, - { id = "giant_spider", x = 3162, y = 3225 }, - { id = "giant_spider", x = 3159, y = 3223 }, - { id = "giant_spider", x = 3163, y = 3222 }, + { id = "spider", x = 3162 , y = 3246 }, + { id = "spider", x = 3175 , y = 3248 }, + { id = "spider", x = 3171 , y = 3254 }, + { id = "spider", x = 3156 , y = 3248 }, + { id = "spider", x = 3143 , y = 3241 }, + { id = "spider", x = 3162 , y = 3226 }, + { id = "spider", x = 3157 , y = 3229 }, + { id = "spider", x = 3168 , y = 3222 }, + { id = "spider", x = 3166 , y = 3222 }, + { id = "giant_spider", x = 3164, y = 3242 }, + { id = "giant_spider", x = 3169, y = 3246 }, + { id = "giant_spider", x = 3164, y = 3249 }, + { id = "giant_spider", x = 3170, y = 3250 }, + { id = "giant_spider", x = 3166, y = 3247 }, + { id = "giant_spider", x = 3194, y = 3236 }, + { id = "giant_spider", x = 3200, y = 3238 }, + { id = "giant_spider", x = 3162, y = 3223 }, + { id = "giant_spider", x = 3164, y = 3228 }, + { id = "giant_spider", x = 3165, y = 3223 }, + { id = "giant_spider", x = 3157, y = 3226 }, + { id = "unicorn", x = 3140, y = 3209 }, { id = "rat", x = 3196, y = 3206 }, { id = "rat", x = 3193, y = 3205 }, { id = "rat", x = 3191, y = 3204 }, { id = "rat", x = 3197, y = 3204 }, { id = "goblin_light_grey_bald", x = 3141, y = 3261 }, { id = "goblin_light_grey_bald", x = 3198, y = 3257 }, + { id = "goblin_light_grey_bald", x = 3184, y = 3249 }, + { id = "goblin_light_grey_bald", x = 3184, y = 3259 }, { id = "goblin_turquoise_topless_mohawk", x = 3142, y = 3260 }, - { id = "goblin_turquoise_topless_mohawk", x = 3193, y = 3247 }, + { id = "goblin_turquoise_topless_mohawk", x = 3193, y = 3244 }, + { id = "goblin_turquoise_topless_mohawk", x = 3181, y = 3250 }, { id = "goblin_turquoise_topless_mohawk", x = 3142, y = 3230 }, { id = "goblin_light_brown_bald", x = 3141, y = 3258 }, - { id = "goblin_light_brown_bald", x = 3143, y = 3227 }, - { id = "goblin_light_brown_bald", x = 3194, y = 3248 }, - { id = "goblin_turquoise_grey_ponytail", x = 3145, y = 3229 }, + { id = "goblin_turquoise_grey_ponytail", x = 3143, y = 3234 }, + { id = "goblin_light_brown_bald", x = 3192, y = 3246 }, + { id = "goblin_light_brown_bald", x = 3179, y = 3254 }, + { id = "goblin_light_brown_bald", x = 3144, y = 3228 }, + { id = "goblin_light_brown_mohawk", x = 3184, y = 3252 }, + { id = "goblin_light_brown_mohawk", x = 3187, y = 3243 }, + { id = "goblin_turquoise_grey_ponytail", x = 3181, y = 3248 }, + { id = "goblin_turquoise_grey_ponytail", x = 3181, y = 3254 }, + { id = "goblin_turquoise_grey_ponytail", x = 3184, y = 3254 }, { id = "goblin_light_grey_helmet", x = 3144, y = 3231 }, - { id = "goblin_light_grey_helmet", x = 3185, y = 3246 }, - { id = "goblin_light_grey_helmet", x = 3183, y = 3244 }, - { id = "goblin_light_grey_helmet", x = 3192, y = 3245 }, + { id = "goblin_light_grey_helmet", x = 3182, y = 3252 }, + { id = "goblin_light_grey_helmet", x = 3188, y = 3245 }, { id = "goblin_light_grey_hat", x = 3144, y = 3259 }, { id = "goblin_light_grey_hat", x = 3146, y = 3260 }, - { id = "goblin_light_grey_hat", x = 3144, y = 3233 }, - { id = "goblin_light_grey_hat", x = 3183, y = 3246 }, - { id = "goblin_light_grey_hat", x = 3187, y = 3244 }, - { id = "goblin_light_brown_mohawk", x = 3146, y = 3234 }, - { id = "goblin_light_topless_spiked", x = 3187, y = 3246 }, - { id = "goblin_light_topless_spiked", x = 3185, y = 3244 }, + { id = "goblin_light_grey_hat", x = 3140, y = 3226 }, + { id = "goblin_light_grey_hat", x = 3181, y = 3255 }, + { id = "goblin_light_grey_hat", x = 3185, y = 3246 }, + { id = "goblin_light_brown_mohawk", x = 3140, y = 3230 }, + { id = "goblin_light_topless_spiked", x = 3183, y = 3247 }, + { id = "goblin_light_topless_spiked", x = 3180, y = 3252 }, { id = "goblin_light_grey_bald_spear", x = 3167, y = 3205 }, { id = "goblin_light_grey_bald_spear", x = 3185, y = 3202 }, # 12850 @@ -212,21 +235,23 @@ spawns = [ { id = "crow_2", x = 3260, y = 3317 }, { id = "crow_3", x = 3258, y = 3315 }, { id = "crow_4", x = 3208, y = 3300 }, - { id = "crow_5", x = 3209, y = 3299 }, + { id = "crow_5", x = 3207, y = 3293 }, { id = "goblin_light_grey_bald", x = 3217, y = 3278 }, + { id = "goblin_turquoise_topless_mohawk", x = 3215, y = 3276 }, + { id = "goblin_turquoise_topless_mohawk", x = 3226, y = 3264 }, { id = "gillie_groats", x = 3254, y = 3274 }, { id = "chief_thief_robin_lumbridge", x = 3212, y = 3208, members = true }, { id = "farmer_lumbridge", x = 3233, y = 3308 }, { id = "farmer_lumbridge_3", x = 3262, y = 3325 }, { id = "farmer_lumbridge_2", x = 3250, y = 3310 }, - { id = "crow_4", x = 3208, y = 3301, members = true }, + { id = "crow_4", x = 3204, y = 3298, members = true }, { id = "vasquen", x = 3226, y = 3311 }, { id = "fayeth", x = 3193, y = 3233 }, { id = "tool_leprechaun", x = 3196, y = 3228 }, { id = "dwarf_lumbridge", x = 3224, y = 3286, members = true }, { id = "ham_member_lumbridge", x = 3230, y = 3285, members = true }, { id = "seth_groats_lumbridge", x = 3223, y = 3293, members = true }, - { id = "crow_5", x = 3209, y = 3300, members = true }, + { id = "crow_5", x = 3201, y = 3296, members = true }, { id = "duck_swim", x = 3218, y = 3287 }, { id = "duck_swim", x = 3223, y = 3281 }, { id = "nastroth_lumbridge", x = 3223, y = 3212 }, diff --git a/data/area/misthalin/varrock/varrock.npc-spawns.toml b/data/area/misthalin/varrock/varrock.npc-spawns.toml index c357703e7d..fea7f65de6 100644 --- a/data/area/misthalin/varrock/varrock.npc-spawns.toml +++ b/data/area/misthalin/varrock/varrock.npc-spawns.toml @@ -1,56 +1,29 @@ spawns = [ # 12596 - { id = "duck_swim", x = 3196, y = 3339 }, { id = "duck_swim", x = 3194, y = 3341 }, - { id = "duck_swim", x = 3194, y = 3343 }, { id = "duck_swim", x = 3191, y = 3342 }, { id = "duck_swim", x = 3183, y = 3348 }, { id = "duck_swim", x = 3181, y = 3348 }, - { id = "duck_swim", x = 3170, y = 3347 }, - { id = "duck_swim", x = 3168, y = 3347 }, - { id = "duck_swim", x = 3172, y = 3354 }, - { id = "duck_swim", x = 3171, y = 3355 }, - { id = "duck_swim", x = 3170, y = 3354 }, { id = "duck_swim", x = 3153, y = 3354 }, { id = "duck_swim", x = 3152, y = 3356 }, { id = "duck_swim", x = 3153, y = 3358 }, { id = "duck_swim", x = 3152, y = 3360 }, { id = "duck_swim", x = 3150, y = 3368 }, - { id = "duck_swim", x = 3150, y = 3371 }, { id = "duck_swim", x = 3150, y = 3373 }, - { id = "duck_swim", x = 3148, y = 3372 }, { id = "duck_swim", x = 3146, y = 3382 }, - { id = "duck_swim", x = 3143, y = 3384 }, { id = "duck_swim", x = 3140, y = 3387 }, + { id = "duck_swim", x = 3173, y = 3353 }, + { id = "duck_swim", x = 3162, y = 3350 }, { id = "duck_grey_swim", x = 3152, y = 3386 }, - { id = "duck_grey_swim", x = 3144, y = 3382 }, { id = "duck_grey_swim", x = 3147, y = 3380 }, - { id = "duck_grey_swim", x = 3148, y = 3374 }, { id = "duck_grey_swim", x = 3151, y = 3371 }, - { id = "duck_grey_swim", x = 3150, y = 3370 }, - { id = "duck_grey_swim", x = 3152, y = 3357 }, - { id = "duck_grey_swim", x = 3155, y = 3352 }, - { id = "duck_grey_swim", x = 3169, y = 3355 }, - { id = "duck_grey_swim", x = 3171, y = 3354 }, - { id = "duck_grey_swim", x = 3173, y = 3353 }, - { id = "duck_grey_swim", x = 3173, y = 3351 }, - { id = "duck_grey_swim", x = 3171, y = 3347 }, - { id = "duck_grey_swim", x = 3169, y = 3346 }, + { id = "duck_swim", x = 3152, y = 3357 }, { id = "duck_grey_swim", x = 3167, y = 3346 }, - { id = "duck_grey_swim", x = 3164, y = 3348 }, - { id = "duck_grey_swim", x = 3162, y = 3350 }, - { id = "duck_grey_swim", x = 3161, y = 3351 }, - { id = "cow_calf_2", x = 3159, y = 3340 }, - { id = "cow_calf_2", x = 3164, y = 3338 }, - { id = "cow_calf_3", x = 3159, y = 3335 }, - { id = "cow_calf_3", x = 3167, y = 3337 }, + { id = "farquie", x = 3164, y = 3337 }, { id = "cow_2", x = 3169, y = 3339 }, - { id = "cow_2", x = 3156, y = 3332 }, { id = "cow_brown_2", x = 3156, y = 3343 }, { id = "cow_brown_2", x = 3197, y = 3331 }, { id = "cow_brown_2", x = 3183, y = 3331 }, - { id = "cow_light_spots_2", x = 3155, y = 3337 }, - { id = "cow_light_spots_2", x = 3167, y = 3333 }, { id = "cow_light_spots_2", x = 3180, y = 3338 }, { id = "chicken", x = 3198, y = 3355 }, { id = "chicken", x = 3197, y = 3353 }, diff --git a/data/entity/npc/animal/cow/cow.npcs.toml b/data/entity/npc/animal/cow/cow.npcs.toml index bff657588b..1e65a95d16 100644 --- a/data/entity/npc/animal/cow/cow.npcs.toml +++ b/data/entity/npc/animal/cow/cow.npcs.toml @@ -1,6 +1,6 @@ [cow_default] id = 81 -hitpoints = 80 +hitpoints = 107 attack_bonus = -15 combat_def = "cow" immune_poison = true @@ -21,7 +21,7 @@ id = 1767 [cow_calf] id = 2310 -hitpoints = 60 +hitpoints = 69 attack_bonus = -20 combat_def = "cow" slayer_xp = 6.0 diff --git a/data/entity/npc/humanoid/gnomes.npcs.toml b/data/entity/npc/humanoid/gnomes.npcs.toml index bbe8f7c865..7b218d738b 100644 --- a/data/entity/npc/humanoid/gnomes.npcs.toml +++ b/data/entity/npc/humanoid/gnomes.npcs.toml @@ -17,4 +17,9 @@ examine = "He seems to run the cocktail bar." [captain_daerkin] id = 4595 -examine = "A gnome pilot off duty, he looks a bit drunk." \ No newline at end of file +examine = "A gnome pilot off duty, he looks a bit drunk." + +[farquie] +id = 790 +dialogue = "old" +examine = "A gnome who's supposed to be cleaning up a mess." \ No newline at end of file diff --git a/data/entity/npc/hunt_modes.toml b/data/entity/npc/hunt_modes.toml index 2e5d655560..cabeea2042 100644 --- a/data/entity/npc/hunt_modes.toml +++ b/data/entity/npc/hunt_modes.toml @@ -99,6 +99,14 @@ check_not_combat = true check_not_combat_self = true check_not_busy = false +[highwayman] +type = "player" +check_visual = "line_of_sight" +check_not_too_strong = false +check_not_combat = true +check_not_combat_self = true +check_not_busy = false + # Thieving stalls [guarding] type = "player" diff --git a/data/entity/npc/monster/goblin/goblin.npcs.toml b/data/entity/npc/monster/goblin/goblin.npcs.toml index bf08fdd352..4598359c92 100644 --- a/data/entity/npc/monster/goblin/goblin.npcs.toml +++ b/data/entity/npc/monster/goblin/goblin.npcs.toml @@ -1,6 +1,6 @@ [goblin_orange_hat_spear] id = 3264 -hitpoints = 120 +hitpoints = 160 att = 3 def = 4 attack_bonus = 12 @@ -41,7 +41,7 @@ examine = "An ugly green creature." [goblin_mohawk_blue] id = 4262 attack_bonus = -21 -hitpoints = 50 +hitpoints = 67 combat_def = "goblin" slayer_xp = 5.0 respawn_delay = 35 @@ -86,6 +86,18 @@ id = 4270 clone = "goblin_mohawk_blue" id = 4271 +[goblin_machete_orange] +id = 444 +dialogue = "old" +clone = "goblin_orange_hat_spear" +large_head = false +examine = "An ugly green creature." + +[goblin_spear_green] +id = 445 +clone = "goblin_orange_hat_spear" +examine = "An ugly green creature." + [goblin_shield_battleaxe_red] id = 4479 clone = "goblin_orange_hat_spear" diff --git a/data/entity/npc/monster/reptile/spider/spider.npcs.toml b/data/entity/npc/monster/reptile/spider/spider.npcs.toml index b163f4514a..2d9c96409a 100644 --- a/data/entity/npc/monster/reptile/spider/spider.npcs.toml +++ b/data/entity/npc/monster/reptile/spider/spider.npcs.toml @@ -13,7 +13,7 @@ examine = "Incey wincey." [giant_spider] id = 59 -hitpoints = 50 +hitpoints = 67 attack_bonus = -10 combat_def = "giant_spider" drop_table = "giant_spider" diff --git a/data/entity/npc/wander_ranges.tables.toml b/data/entity/npc/wander_ranges.tables.toml index 37fb8ad3dd..c32020f0c9 100644 --- a/data/entity/npc/wander_ranges.tables.toml +++ b/data/entity/npc/wander_ranges.tables.toml @@ -945,9 +945,11 @@ wander_range = 0 wander_range = 6 [.gull_draynor] +wander_range = 5 max_range = 100 [.gull_draynor_2] +wander_range = 5 max_range = 100 [.sanfew] @@ -5247,10 +5249,10 @@ max_range = 6 max_range = 50 [.pig_2] -wander_range = 0 +wander_range = 3 [.piglet] -wander_range = 0 +wander_range = 3 [.piglet_2] wander_range = 3 @@ -5465,6 +5467,9 @@ max_range = 7 #wander_range = 0 #max_range = 0 +[.cow_calf] +wander_range = 4 + [.sheepdog] wander_range = 0 @@ -5480,21 +5485,21 @@ wander_range = 5 [.chicken_falador_3] wander_range = 5 -#[.2316] -#wander_range = 3 -#max_range = 5 +[.pig_3] +wander_range = 3 +max_range = 5 -#[.2317] -#wander_range = 3 -#max_range = 5 +[.pig_4] +wander_range = 3 +max_range = 5 -#[.2318] -#wander_range = 3 -#max_range = 5 +[.piglet_4] +wander_range = 3 +max_range = 5 -#[.2319] -#wander_range = 3 -#max_range = 5 +[.piglet_5] +wander_range = 3 +max_range = 5 [.blandebir_keldagrim] wander_range = 3 @@ -7716,6 +7721,9 @@ wander_range = 2 [.gadrin] wander_range = 2 +[.swan_falador] +wander_range = 5 + #[.3297] #max_range = 50 @@ -32711,16 +32719,16 @@ wander_range = 8 wander_range = 8 [.cow_2] -wander_range = 2 +wander_range = 4 [.cow_brown_2] -wander_range = 2 +wander_range = 4 [.cow_calf_2] -wander_range = 0 +wander_range = 4 [.cow_calf_3] -wander_range = 0 +wander_range = 4 max_range = 16 [.lumbridge_guardsman_attackable] diff --git a/data/skill/thieving/pickpocket.tables.toml b/data/skill/thieving/pickpocket.tables.toml index 1b274355ff..b5db53c94b 100644 --- a/data/skill/thieving/pickpocket.tables.toml +++ b/data/skill/thieving/pickpocket.tables.toml @@ -89,6 +89,9 @@ type = "workman" [.farmer] type = "farmer" +[.farmer_2] +type = "farmer" + [.farmer_lumbridge] type = "farmer" diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt index 2c0f964bf9..54dd9fcc07 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt @@ -53,6 +53,10 @@ class Wander( return false } val id = npc["transform_id", npc.id] + val configuredRange = Tables.intOrNull("npc_ranges.$id.wander_range") + if (configuredRange != null) { + return configuredRange > 0 + } val def = NPCDefinitions.get(id) return when (def.walkMode.toInt()) { ModeType.WANDER_THROUGH, ModeType.WANDER_SPECIAL, ModeType.WANDER_WATER -> true @@ -60,4 +64,4 @@ class Wander( } } } -} +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/asgarnia/falador/Highwayman.kt b/game/src/main/kotlin/content/area/asgarnia/falador/Highwayman.kt new file mode 100644 index 0000000000..f5fa8c72fa --- /dev/null +++ b/game/src/main/kotlin/content/area/asgarnia/falador/Highwayman.kt @@ -0,0 +1,23 @@ +package content.area.asgarnia.falador + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.instruction.handle.interactPlayer +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.combatLevel + +class Highwayman : Script { + + init { + huntPlayer("highwayman*", "highwayman") { target -> + if (target.combatLevel < 11) { + interactPlayer(target, "Attack") + } + } + + npcCombatStart { target -> + if (id.startsWith("highwayman") && target is Player) { + say("Stand and deliver!") + } + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/lumbridge/castle/LumbridgeGuardsmanAttackble.kt b/game/src/main/kotlin/content/area/misthalin/lumbridge/castle/LumbridgeGuardsmanAttackble.kt index b9c0927d42..3b392c1dbd 100644 --- a/game/src/main/kotlin/content/area/misthalin/lumbridge/castle/LumbridgeGuardsmanAttackble.kt +++ b/game/src/main/kotlin/content/area/misthalin/lumbridge/castle/LumbridgeGuardsmanAttackble.kt @@ -10,8 +10,10 @@ import world.gregs.voidps.engine.queue.queue class LumbridgeGuardsmanAttackble : Script { init { + val ratTargets = setOf("giant_rat", "giant_rat_3", "giant_rat_4", "giant_rat_5") + huntNPC("aggressive_npcs") { target -> - if (id == "lumbridge_guardsman_attackable2" && target.id.endsWith("rat")) { + if (id == "lumbridge_guardsman_attackable2" && (target.id.endsWith("rat") || target.id in ratTargets)) { interactNpc(target, "Attack") } if (id == "lumbridge_guardsman_attackable" && target.id.contains("goblin")) { @@ -19,11 +21,11 @@ class LumbridgeGuardsmanAttackble : Script { } } - npcDeath("goblin*,giant_rat") { + npcDeath("goblin*,giant_rat,giant_rat_3,giant_rat_4,giant_rat_5") { val guard = killer as? NPC ?: return@npcDeath when { // Guard attacked rats and giant rats, but only healed when giant rat was killed https://youtu.be/qC_XoAQK6Cs?si=VH9tOmKXu-_Bgjnr&t=137 - id == ("giant_rat") && guard.id == "lumbridge_guardsman_attackable2" -> { + id in ratTargets && guard.id == "lumbridge_guardsman_attackable2" -> { guard.queue("rat_killer") { guard.delay(2) guard.anim("eat_drink") diff --git a/game/src/main/kotlin/content/area/misthalin/lumbridge/farm/Cows.kt b/game/src/main/kotlin/content/area/misthalin/lumbridge/farm/Cows.kt index 2908ce0226..306cb26def 100644 --- a/game/src/main/kotlin/content/area/misthalin/lumbridge/farm/Cows.kt +++ b/game/src/main/kotlin/content/area/misthalin/lumbridge/farm/Cows.kt @@ -6,6 +6,7 @@ import content.quest.questCompleted import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.mode.EmptyMode +import world.gregs.voidps.engine.entity.character.mode.Wander import world.gregs.voidps.engine.entity.character.player.skill.Skill import world.gregs.voidps.engine.entity.character.player.skill.level.Level import world.gregs.voidps.engine.entity.character.player.skill.level.Level.has @@ -22,15 +23,16 @@ class Cows : Script { } npcTimerStart("eat_grass") { - mode = EmptyMode random.nextInt(50, 200) } npcTimerTick("eat_grass") { - if (mode == EmptyMode) { - say("Moo") - anim("cow_eat_grass") + if (mode != EmptyMode && mode !is Wander) { + return@npcTimerTick Timer.CONTINUE } + mode = EmptyMode + say("Moo") + anim("cow_eat_grass") Timer.CONTINUE } From fd3a3de95b29d6f146f9e79bfccd00a6ac64ea11 Mon Sep 17 00:00:00 2001 From: Copilot Date: Mon, 17 Aug 2026 23:14:45 -0400 Subject: [PATCH 03/14] Changed: draynor.npcs.toml -Added shady_stranger_2 -Added examine text to gull_draynor*. -Corrected dialogue with shady_stranger and suspicious_outsider. Source: https://runescape.wiki/w/Transcript:Suspicious_outsider. draynor.npc-spawns.toml -Added shady_stranger_2. Spawn source: https://www.youtube.com/watch?v=hn5J-yGwnAQ 2:27 -Adjusted gull_draynor and gull_draynor* spawn locations. -Adjusted a shady_stranger spawn location to match rs2. Source: https://www.youtube.com/watch?v=5DlFGDB_d9o 0:47. -Rolled back 1 gull_draynor spawn since the current amount of 2 is already correct. DraynorGulls.kt -DraynorGulls spawns two gull NPCs (gull_draynor, gull_draynor_2) only when the spawn tile matches a patrol's first waypoint, then sets their mode to Patrol using waypoints from PatrolDefinitions. Co-authored by copilot. draynor.patrols.toml -Added the patrol routes for gull_draynor*. wander_range.tables.toml -Changed gull_draynor* wander_range to 0. Wander.kt -Only consecutive ticks on the same tile count as "stuck"; moving should reset the counter. Co-authored by copilot, please don't hesitate to undo this if the change is not needed. --- .../misthalin/draynor/draynor.npc-spawns.toml | 6 ++--- data/area/misthalin/draynor/draynor.npcs.toml | 10 +++++++ .../misthalin/draynor/draynor.patrols.toml | 15 +++++++++++ data/entity/npc/wander_ranges.tables.toml | 4 +-- .../engine/entity/character/mode/Wander.kt | 8 +++--- .../misthalin/draynor_village/DraynorGulls.kt | 26 +++++++++++++++++++ .../draynor_village/ShadyStranger.kt | 8 +++--- 7 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 data/area/misthalin/draynor/draynor.patrols.toml create mode 100644 game/src/main/kotlin/content/area/misthalin/draynor_village/DraynorGulls.kt diff --git a/data/area/misthalin/draynor/draynor.npc-spawns.toml b/data/area/misthalin/draynor/draynor.npc-spawns.toml index c94e8c8bc9..a64ab80a7f 100644 --- a/data/area/misthalin/draynor/draynor.npc-spawns.toml +++ b/data/area/misthalin/draynor/draynor.npc-spawns.toml @@ -86,8 +86,7 @@ spawns = [ { id = "fortunato", x = 3085, y = 3250 }, { id = "wise_old_man_2", x = 3088, y = 3255, members = true }, { id = "gull_draynor", x = 3085, y = 3219, members = true }, - { id = "gull_draynor", x = 3080, y = 3223, members = true }, - { id = "gull_draynor_2", x = 3077, y = 3234, members = true }, + { id = "gull_draynor_2", x = 3081, y = 3234, members = true }, { id = "rat", x = 3101, y = 3355 }, { id = "ava", x = 3093, y = 3357, members = true }, { id = "scout_draynor", x = 3072, y = 3336, members = true }, @@ -100,7 +99,8 @@ spawns = [ { id = "norman", x = 3111, y = 3219 }, { id = "babe", x = 3112, y = 3220 }, { id = "shady_stranger", x = 3080, y = 3240, members = true }, - { id = "shady_stranger", x = 3099, y = 3263, members = true }, + { id = "shady_stranger", x = 3103, y = 3259, members = true }, + { id = "shady_stranger_2", x = 3077, y = 3255, members = true }, { id = "suspicious_outsider", x = 3097, y = 3253, members = true }, { id = "witch", x = 3099, y = 3370, members = true }, ] \ No newline at end of file diff --git a/data/area/misthalin/draynor/draynor.npcs.toml b/data/area/misthalin/draynor/draynor.npcs.toml index c3a9be0434..5a559b891c 100644 --- a/data/area/misthalin/draynor/draynor.npcs.toml +++ b/data/area/misthalin/draynor/draynor.npcs.toml @@ -163,10 +163,12 @@ examine = "He looks as if he could do with a sip of Amontillado." [gull_draynor] id = 450 collision = "sky" +examine = "A sea bird." [gull_draynor_2] id = 451 collision = "sky" +examine = "A sea bird." [town_crier_draynor] id = 6136 @@ -197,6 +199,14 @@ max_hit_crush = 60 examine = "He seems to be trying to watch everyone at once." drop_table = "shady_stranger" +[shady_stranger_2] +id = 8435 +hitpoints = 350 +combat_def = "man" +max_hit_crush = 60 +examine = "He seems to be trying to watch everyone at once." +drop_table = "shady_stranger" + [suspicious_outsider] id = 8436 hitpoints = 440 diff --git a/data/area/misthalin/draynor/draynor.patrols.toml b/data/area/misthalin/draynor/draynor.patrols.toml new file mode 100644 index 0000000000..81c14e93ef --- /dev/null +++ b/data/area/misthalin/draynor/draynor.patrols.toml @@ -0,0 +1,15 @@ +[gull_draynor] +points = [ + { x = 3085, y = 3219 }, + { x = 3085, y = 3224 }, + { x = 3080, y = 3224 }, + { x = 3080, y = 3219 }, +] + +[gull_draynor_2] +points = [ + { x = 3081, y = 3234 }, + { x = 3081, y = 3229 }, + { x = 3076, y = 3229 }, + { x = 3076, y = 3234 }, +] diff --git a/data/entity/npc/wander_ranges.tables.toml b/data/entity/npc/wander_ranges.tables.toml index c32020f0c9..38a11276c8 100644 --- a/data/entity/npc/wander_ranges.tables.toml +++ b/data/entity/npc/wander_ranges.tables.toml @@ -945,11 +945,11 @@ wander_range = 0 wander_range = 6 [.gull_draynor] -wander_range = 5 +wander_range = 0 max_range = 100 [.gull_draynor_2] -wander_range = 5 +wander_range = 0 max_range = 100 [.sanfew] diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt index 54dd9fcc07..855e8745bc 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt @@ -24,9 +24,11 @@ class Wander( override fun tick() { if (npc.tile == lastTile) { - stuckCounter = 0 - } else if (stuckCounter++ >= stuckLimit) { - npc.tele(spawn) + if (stuckCounter++ >= stuckLimit) { + npc.tele(spawn) + stuckCounter = 0 + } + } else { stuckCounter = 0 } lastTile = npc.tile diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/DraynorGulls.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/DraynorGulls.kt new file mode 100644 index 0000000000..96a5d74e62 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/DraynorGulls.kt @@ -0,0 +1,26 @@ +package content.area.misthalin.draynor_village + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.data.definition.PatrolDefinitions +import world.gregs.voidps.engine.entity.character.mode.Patrol + +class DraynorGulls(val patrols: PatrolDefinitions) : Script { + + init { + npcSpawn("gull_draynor") { + val patrol = patrols.get("gull_draynor") + if (tile != patrol.waypoints.first().first) { + return@npcSpawn + } + mode = Patrol(this, patrol.waypoints) + } + + npcSpawn("gull_draynor_2") { + val patrol = patrols.get("gull_draynor_2") + if (tile != patrol.waypoints.first().first) { + return@npcSpawn + } + mode = Patrol(this, patrol.waypoints) + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt index 8d2c1bc2dd..960d575e3a 100644 --- a/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt @@ -1,6 +1,5 @@ package content.area.misthalin.draynor_village -import content.entity.player.dialogue.Confused import content.entity.player.dialogue.Quiz import content.entity.player.dialogue.Shifty import content.entity.player.dialogue.type.npc @@ -9,10 +8,9 @@ import world.gregs.voidps.engine.Script class ShadyStranger : Script { init { - npcOperate("Talk-to", "shady_stranger,suspicious_outsider") { (target) -> - player("Hello there. What are you doing here?") - npc("Oh, nothing much. I'd just heard Draynor was a nice place to visit.") - player("Fair enough.") + npcOperate("Talk-to", "shady_stranger,shady_stranger_2,suspicious_outsider") { (target) -> + player("Hello, what are you doing here?") + npc("Err, nothing much, just in here on business. Heard Draynor's a nice place to visit. Also at the same place great for woodcutting.") } } } From 4d8e2f8f0841bf9477b499ac1ec794dcf0992254 Mon Sep 17 00:00:00 2001 From: Copilot Date: Tue, 18 Aug 2026 03:12:56 -0400 Subject: [PATCH 04/14] draynor.npcs.toml -Added respawn_delay of 50 to shady_stranger* and suspicious_outsider. This makes them able to respawn. ShadyStranger.kt -Added the original "Uh oh, time to go!" shady stranger and suspicious outsider despawn/teleportation behaviour from RS2. They now teleport away from the player if they take direct damage at 100 hitpoints or lower. -Fixed the punctuation on the npc.say message. -Fixed the dialogue (text must've glitched when I was copying and pasting; I didn't notice until after). Unrelated changes: draynor.objs.toml -Added new entry [trinket_chest] with examine text. summoning.objs.toml -Added new entry [small_obelisk] with examine text. --- data/area/misthalin/draynor/draynor.npcs.toml | 3 + data/area/misthalin/draynor/draynor.objs.toml | 4 ++ data/skill/summoning/summoning.objs.toml | 6 +- .../draynor_village/ShadyStranger.kt | 57 ++++++++++++++++++- 4 files changed, 67 insertions(+), 3 deletions(-) diff --git a/data/area/misthalin/draynor/draynor.npcs.toml b/data/area/misthalin/draynor/draynor.npcs.toml index 5a559b891c..658b161b34 100644 --- a/data/area/misthalin/draynor/draynor.npcs.toml +++ b/data/area/misthalin/draynor/draynor.npcs.toml @@ -196,6 +196,7 @@ id = 8339 hitpoints = 300 combat_def = "man" max_hit_crush = 60 +respawn_delay = 50 examine = "He seems to be trying to watch everyone at once." drop_table = "shady_stranger" @@ -204,6 +205,7 @@ id = 8435 hitpoints = 350 combat_def = "man" max_hit_crush = 60 +respawn_delay = 50 examine = "He seems to be trying to watch everyone at once." drop_table = "shady_stranger" @@ -212,6 +214,7 @@ id = 8436 hitpoints = 440 combat_def = "man" max_hit_crush = 60 +respawn_delay = 50 examine = "Haven't seen his sort around here before; what's he doing here?" drop_table = "suspicious_outsider" diff --git a/data/area/misthalin/draynor/draynor.objs.toml b/data/area/misthalin/draynor/draynor.objs.toml index c94eaa81e6..c2d54c5e0b 100644 --- a/data/area/misthalin/draynor/draynor.objs.toml +++ b/data/area/misthalin/draynor/draynor.objs.toml @@ -29,3 +29,7 @@ id = 14012 [cooking_range_draynor_manor] id = 47633 examine = "It smells of fried fish." + +[trinket_chest] +id = 39242 +examine = "Full of bits and bobs." \ No newline at end of file diff --git a/data/skill/summoning/summoning.objs.toml b/data/skill/summoning/summoning.objs.toml index ede2a032a5..51d0372551 100644 --- a/data/skill/summoning/summoning.objs.toml +++ b/data/skill/summoning/summoning.objs.toml @@ -1,3 +1,7 @@ [obelisk] id = 28722 -examine = "Glowing with barely-suppressed energies." \ No newline at end of file +examine = "Glowing with barely-suppressed energies." + +[small_obelisk] +id = 29944 +examine = "Contains traces of summoning energy." \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt index 960d575e3a..491523b1ea 100644 --- a/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt @@ -1,16 +1,69 @@ package content.area.misthalin.draynor_village +import content.entity.combat.attackers +import content.entity.combat.damageDealers +import content.entity.effect.clearTransform import content.entity.player.dialogue.Quiz import content.entity.player.dialogue.Shifty import content.entity.player.dialogue.type.npc import content.entity.player.dialogue.type.player import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.mode.EmptyMode +import world.gregs.voidps.engine.entity.character.mode.PauseMode +import world.gregs.voidps.engine.entity.character.npc.NPC +import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.engine.entity.character.sound +import world.gregs.voidps.engine.queue.queue class ShadyStranger : Script { + private val strangers = "shady_stranger,shady_stranger_2,suspicious_outsider" + private val escapeHealth = 100 + init { - npcOperate("Talk-to", "shady_stranger,shady_stranger_2,suspicious_outsider") { (target) -> + npcOperate("Talk-to", strangers) { (target) -> player("Hello, what are you doing here?") - npc("Err, nothing much, just in here on business. Heard Draynor's a nice place to visit. Also at the same place great for woodcutting.") + npc("Err, nothing much, I'm just here on business. Heard Draynor's a nice place to visit.") + } + + npcCombatDamage(strangers) { attack -> + if (queue.contains("shady_escape") || attack.damage <= 0) { + return@npcCombatDamage + } + val currentHealth = levels.get(Skill.Constitution) + if (currentHealth > escapeHealth && currentHealth - attack.damage <= escapeHealth) { + set("shady_escape_pending", true) + escape(this) + } + } + + npcCanDie(strangers) { + !get("shady_escape_pending", false) + } + } + + private fun escape(npc: NPC) { + for (attacker in npc.attackers) { + attacker.mode = EmptyMode + } + npc.attackers.clear() + npc.damageDealers.clear() + npc.mode = PauseMode + npc.steps.clear() + npc.clearWatch() + npc.queue("shady_escape") { + npc.say("Uh oh, time to go!") + npc.anim("teleport_modern") + npc.gfx("teleport_modern") + npc.sound("teleport") + npc.delay(3) + npc.queue.clear() + npc.attackers.clear() + npc.damageDealers.clear() + npc.softTimers.stopAll() + npc.clearTransform() + npc.hide = true + clear("shady_escape_pending") + respawn(get("respawn_delay", 50)) } } } From 0ffca97ba37cbb5fd401e06edc179d038bd8db40 Mon Sep 17 00:00:00 2001 From: Copilot Date: Tue, 18 Aug 2026 22:13:11 -0400 Subject: [PATCH 05/14] hunt_modes.toml -Reverted all highwayman hunt_mode to "cowardly" and removed the [highwayman] hunt_mode type. The original "cowardly" hunt_mode was correct; there was no need for me to change it. I spent some extra time learning about how hunt_mode works in general. Highwayman.kt -Removed unnecessary lines. Other changes: draynor.item-spawns.toml -Corrected the spawn location of 2 logs. Source: osrs.world 634, osrs live server. draynor.npcs.toml -Corrected the respawn_delay for shady_stranger* and suspicious_outsider to 66. Source: https://www.youtube.com/watch?v=hn5J-yGwnAQ 0:20 - 1:00 -Added missing examine texts draynor.objs.toml -Added some missing objects and examine texts. ShadyStranger.kt -Changed the respawn delay default to match the changes applied to shady_stranger* and suspicious_outsider inside draynor.npcs.toml Unrelated fix: surprise_exam.npcs.toml -Added interacts = false for [mr_mordau]. This prevents mr_mordau from changing the direction he's facing when the player talks to him. --- .../surprise_exam/surprise_exam.npcs.toml | 1 + data/area/asgarnia/falador/falador.npcs.toml | 2 +- .../sinclair_mansion.npcs.toml | 4 +- .../draynor/draynor.item-spawns.toml | 5 +- data/area/misthalin/draynor/draynor.npcs.toml | 8 ++-- data/area/misthalin/draynor/draynor.objs.toml | 46 ++++++++++++++++++- data/entity/npc/hunt_modes.toml | 8 ---- .../area/asgarnia/falador/Highwayman.kt | 8 ---- .../draynor_village/ShadyStranger.kt | 2 +- 9 files changed, 58 insertions(+), 26 deletions(-) diff --git a/data/activity/event/random/surprise_exam/surprise_exam.npcs.toml b/data/activity/event/random/surprise_exam/surprise_exam.npcs.toml index bf100e9c28..e9a07ec3d6 100644 --- a/data/activity/event/random/surprise_exam/surprise_exam.npcs.toml +++ b/data/activity/event/random/surprise_exam/surprise_exam.npcs.toml @@ -8,6 +8,7 @@ examine = "If the mummy is at school, where are the kids?" [mr_mordau] id = 6117 +interacts = false examine = "Professor of Unnatural History." [zombie_surprise_exam] diff --git a/data/area/asgarnia/falador/falador.npcs.toml b/data/area/asgarnia/falador/falador.npcs.toml index 809e162be1..3ee285d548 100644 --- a/data/area/asgarnia/falador/falador.npcs.toml +++ b/data/area/asgarnia/falador/falador.npcs.toml @@ -494,7 +494,7 @@ str = 2 def = 4 combat_def = "highwayman" attack_bonus = 6 -hunt_mode = "highwayman" +hunt_mode = "cowardly" respawn_delay = 100 drop_table = "highwayman" examine = "He holds up passers by." diff --git a/data/area/kandarin/sinclair_mansion/sinclair_mansion.npcs.toml b/data/area/kandarin/sinclair_mansion/sinclair_mansion.npcs.toml index 2cbe18aabe..c321b30345 100644 --- a/data/area/kandarin/sinclair_mansion/sinclair_mansion.npcs.toml +++ b/data/area/kandarin/sinclair_mansion/sinclair_mansion.npcs.toml @@ -12,7 +12,7 @@ def = 2 style = "stab" max_hit_melee = 10 attack_bonus = 6 -hunt_mode = "highwayman" +hunt_mode = "cowardly" respawn_delay = 100 drop_table = "highwayman" examine = "He holds up passers by." @@ -27,7 +27,7 @@ def = 4 style = "stab" max_hit_melee = 10 attack_bonus = 6 -hunt_mode = "highwayman" +hunt_mode = "cowardly" respawn_delay = 100 drop_table = "highwayman" examine = "He holds up passers by." diff --git a/data/area/misthalin/draynor/draynor.item-spawns.toml b/data/area/misthalin/draynor/draynor.item-spawns.toml index 285c407096..516ac3ed2b 100644 --- a/data/area/misthalin/draynor/draynor.item-spawns.toml +++ b/data/area/misthalin/draynor/draynor.item-spawns.toml @@ -2,9 +2,10 @@ spawns = [ # 12338 { id = "cheese", x = 3083, y = 3260, delay = 100 }, { id = "tomato", x = 3085, y = 3261, delay = 100 }, +# 12339 + { id = "logs", x = 3089, y = 3265, delay = 100 }, + { id = "logs", x = 3089, y = 3266, delay = 100 }, # 12340 - { id = "logs", x = 3089, y = 3365, delay = 100 }, - { id = "logs", x = 3089, y = 3366, delay = 100 }, { id = "poison", x = 3100, y = 3364, delay = 100 }, { id = "shears", x = 3126, y = 3358, delay = 6 }, { id = "spade", x = 3121, y = 3361, delay = 100 }, diff --git a/data/area/misthalin/draynor/draynor.npcs.toml b/data/area/misthalin/draynor/draynor.npcs.toml index 658b161b34..25d5126537 100644 --- a/data/area/misthalin/draynor/draynor.npcs.toml +++ b/data/area/misthalin/draynor/draynor.npcs.toml @@ -187,16 +187,18 @@ examine = "A feisty cat." [norman] id = 8203 +examine = "A strong ox, no bones about it." [babe] id = 8204 +examine = "How can an ox without lungs sneeze like that?" [shady_stranger] id = 8339 hitpoints = 300 combat_def = "man" max_hit_crush = 60 -respawn_delay = 50 +respawn_delay = 66 examine = "He seems to be trying to watch everyone at once." drop_table = "shady_stranger" @@ -205,7 +207,7 @@ id = 8435 hitpoints = 350 combat_def = "man" max_hit_crush = 60 -respawn_delay = 50 +respawn_delay = 66 examine = "He seems to be trying to watch everyone at once." drop_table = "shady_stranger" @@ -214,7 +216,7 @@ id = 8436 hitpoints = 440 combat_def = "man" max_hit_crush = 60 -respawn_delay = 50 +respawn_delay = 66 examine = "Haven't seen his sort around here before; what's he doing here?" drop_table = "suspicious_outsider" diff --git a/data/area/misthalin/draynor/draynor.objs.toml b/data/area/misthalin/draynor/draynor.objs.toml index c2d54c5e0b..42e90db593 100644 --- a/data/area/misthalin/draynor/draynor.objs.toml +++ b/data/area/misthalin/draynor/draynor.objs.toml @@ -32,4 +32,48 @@ examine = "It smells of fried fish." [trinket_chest] id = 39242 -examine = "Full of bits and bobs." \ No newline at end of file +examine = "Full of bits and bobs." + +[travelling_box] +id = 39241 +examine = "Full of clothes and collectibles." + +[caravan_draynor] +id = 39237 +examine = "A house on wheels." + +[maggies_cauldron] +id = 39233 +examine = "Something smells...interesting." + +[toy_stall] +id = 5595 +examine = "Diango's Toy Stall." + +[gag_banner] +id = 12110 +examine = "A banner for Group of Advanced Gardeners." + +[aggies_cauldron] +id = 9736 +examine = "Aggie's cooking something, probably best not to think what..." + +[magical_symbol_draynor] +id = 908 +examine = "A magical wall decoration." + +[wardrobe_draynor] +id = 5622 +examine = "I wonder what's inside..." + +[wardrobe_draynor_2] +id = 5623 +examine = "It smells a bit stuffy." + +[wardrobe_draynor_3] +id = 5624 +examine = "It smelly funny in there." + +[broom_draynor] +id = 5561 +examine = "Aggie's broomstick." \ No newline at end of file diff --git a/data/entity/npc/hunt_modes.toml b/data/entity/npc/hunt_modes.toml index cabeea2042..2e5d655560 100644 --- a/data/entity/npc/hunt_modes.toml +++ b/data/entity/npc/hunt_modes.toml @@ -99,14 +99,6 @@ check_not_combat = true check_not_combat_self = true check_not_busy = false -[highwayman] -type = "player" -check_visual = "line_of_sight" -check_not_too_strong = false -check_not_combat = true -check_not_combat_self = true -check_not_busy = false - # Thieving stalls [guarding] type = "player" diff --git a/game/src/main/kotlin/content/area/asgarnia/falador/Highwayman.kt b/game/src/main/kotlin/content/area/asgarnia/falador/Highwayman.kt index f5fa8c72fa..4e168b2cea 100644 --- a/game/src/main/kotlin/content/area/asgarnia/falador/Highwayman.kt +++ b/game/src/main/kotlin/content/area/asgarnia/falador/Highwayman.kt @@ -1,19 +1,11 @@ package content.area.asgarnia.falador import world.gregs.voidps.engine.Script -import world.gregs.voidps.engine.client.instruction.handle.interactPlayer import world.gregs.voidps.engine.entity.character.player.Player -import world.gregs.voidps.engine.entity.character.player.combatLevel class Highwayman : Script { init { - huntPlayer("highwayman*", "highwayman") { target -> - if (target.combatLevel < 11) { - interactPlayer(target, "Attack") - } - } - npcCombatStart { target -> if (id.startsWith("highwayman") && target is Player) { say("Stand and deliver!") diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt index 491523b1ea..7f6f3c6b9e 100644 --- a/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/ShadyStranger.kt @@ -63,7 +63,7 @@ class ShadyStranger : Script { npc.clearTransform() npc.hide = true clear("shady_escape_pending") - respawn(get("respawn_delay", 50)) + respawn(get("respawn_delay", 66)) } } } From a75b3e87fd52e9f8a3859556ce1733187ec12801 Mon Sep 17 00:00:00 2001 From: V0lcanic <171797752+V0lcanic@users.noreply.github.com> Date: Tue, 18 Aug 2026 22:30:34 -0400 Subject: [PATCH 06/14] Fix typo in wardrobe_draynor_3 examine text --- data/area/misthalin/draynor/draynor.objs.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/area/misthalin/draynor/draynor.objs.toml b/data/area/misthalin/draynor/draynor.objs.toml index 42e90db593..44a6a42da6 100644 --- a/data/area/misthalin/draynor/draynor.objs.toml +++ b/data/area/misthalin/draynor/draynor.objs.toml @@ -72,8 +72,8 @@ examine = "It smells a bit stuffy." [wardrobe_draynor_3] id = 5624 -examine = "It smelly funny in there." +examine = "It smells funny in there." [broom_draynor] id = 5561 -examine = "Aggie's broomstick." \ No newline at end of file +examine = "Aggie's broomstick." From e9e08a32f28f7026c4234d23ad64184a7950ecde Mon Sep 17 00:00:00 2001 From: Copilot Date: Wed, 19 Aug 2026 04:54:02 -0400 Subject: [PATCH 07/14] Removed hunt_mode from skoblin and skeleton_catacombs. All monsters in the Lumbridge catacombs only become hostile if a statuette is taken, so a hunt_mode is not needed; none of the other catacombs monsters use hunt_mode, so this adjustment makes the monsters behaviour more consistent. rat.npcs.toml -Removed hunt_mode from the level-2 giant_rat. --- data/entity/npc/animal/rat/rat.npcs.toml | 1 - data/entity/npc/monster/undead/skeleton/skeletons.npcs.toml | 1 - data/entity/npc/monster/undead/skoblin/skoblin.npcs.toml | 3 +-- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/data/entity/npc/animal/rat/rat.npcs.toml b/data/entity/npc/animal/rat/rat.npcs.toml index e2d4669e0d..cfc821068d 100644 --- a/data/entity/npc/animal/rat/rat.npcs.toml +++ b/data/entity/npc/animal/rat/rat.npcs.toml @@ -59,7 +59,6 @@ respawn_delay = 30 drop_table = "giant_rat" categories = ["giant_rats", "rats"] examine = "Overgrown vermin." -hunt_mode = "cowardly" [giant_rat_2] id = 950 diff --git a/data/entity/npc/monster/undead/skeleton/skeletons.npcs.toml b/data/entity/npc/monster/undead/skeleton/skeletons.npcs.toml index 9e6637c025..f9e06f9e23 100644 --- a/data/entity/npc/monster/undead/skeleton/skeletons.npcs.toml +++ b/data/entity/npc/monster/undead/skeleton/skeletons.npcs.toml @@ -176,7 +176,6 @@ str = 17 def = 17 combat_def = "skeleton_catacombs" respawn_delay = 3 -hunt_mode = "cowardly" drop_table = "skeleton_catacombs" categories = ["skeletons", "undead"] examine = "The bones of someone who died in Lumbridge long ago." \ No newline at end of file diff --git a/data/entity/npc/monster/undead/skoblin/skoblin.npcs.toml b/data/entity/npc/monster/undead/skoblin/skoblin.npcs.toml index 6508517af7..2098602558 100644 --- a/data/entity/npc/monster/undead/skoblin/skoblin.npcs.toml +++ b/data/entity/npc/monster/undead/skoblin/skoblin.npcs.toml @@ -6,5 +6,4 @@ max_hit_melee = 28 respawn_delay = 3 drop_table = "skoblin" categories = ["skoblin"] -examine = "A skeletal goblin. It looks like the necromancer didn't animate only human bones." -hunt_mode = "cowardly" \ No newline at end of file +examine = "A skeletal goblin. It looks like the necromancer didn't animate only human bones." \ No newline at end of file From cdc4902e0cee25e78629d1f226de9283704c8cfe Mon Sep 17 00:00:00 2001 From: Copilot Date: Thu, 20 Aug 2026 03:48:25 -0400 Subject: [PATCH 08/14] Made a few changes that are associated with giant rat npcs; this corrects a few mistakes and inconsistencies and makes their behaviour closer to 2011. -Removed the hunt_mode for all level-2 and level-3 giant rats. Only level-6 (or higher) giant rats can become hostile towards the player. Source: https://runescape.wiki/w/Giant_rat?oldid=3790587, https://wiki.darkan.org/Giant_rat -Updated all level-2 and level-3 giant rat hitpoints to 53 after new evidence. Source: https://www.youtube.com/watch?v=_cmaU4JNuuM, https://www.youtube.com/watch?v=tbzA3Gv9yes 0:41. -Updated level-6 giant rat hitpoints to 133 after new evidence. This change does not apply to the giant rats in the wilderness. Source: https://www.youtube.com/watch?v=tbzA3Gv9yes 0:26, https://www.youtube.com/watch?v=prxOEPXoY2k 1:58. -Any other giant_rat_wilderness* that was outside of the wilderness has now been replaced with a mainland npc id variant. More changes: ardougne_sewers.npcs.toml -Changed [giant_rat_ardougne_sewer] hitpoints to 53. -Changed [giant_rat_ardougne_sewer_stubby] hitpoints to 53. edgeville_dungeon.npc-spawns.toml -Replaced "giant_rat_wilderness" with "giant_rat_dark_injured" grand_tree_tunnels.npc-spawns.toml -Replaced 3x "giant_rat_wilderness" with 3x "giant_rat_dark_injured" lumbridge_swamp.npcs.toml -Changed [giant_rat_lumbridge_swamp] hitpoints to 53. meiyerditch_tunnels.npc-spawns.toml -Replaced "giant_rat_wilderness" with "giant_rat_brimhaven" mudskipper_point.npcs.toml -Changed [giant_rat_mudskipper_point] hitpoints to 53. -Changed [giant_rat_mudskipper_point_2] hitpoints to 53. rat.npcs.toml -Changed [giant_rat] hitpoints to 53. -Changed [giant_rat_dark] hitpoints to 133. Source: shadow_dungeon.npc-spawns.toml -Replaced "giant_rat_wilderness" with "giant_rat_dark_injured" spider.npcs.toml -Remove hunt_mode and hunt_range. Only high-level giant spiders are hostile to the player. Source: https://runescape.wiki/w/Giant_spider?oldid=3796625 varrock.npcs.toml -Changed [giant_rat_varrock] hitpoints to 133. wilderness.npc-spawns.toml -Replaced 2x "giant_rat_brimhaven", 1x "giant_rat_dark_injured" with 3x "giant_rat_wilderness_2". This isn't 100% accurate, but the change was made so there weren't any more giant rats with 133 hitpoints or any id conflicts. Source: https://www.youtube.com/watch?v=SJUSGehdeCc. -Moved the lines for giant_rat_wilderness* into the correct region #12855 wilderness.npcs.toml -Changed the [giant_rat_wilderness*] hunt_mode to "aggressive". Source: https://runescape.wiki/w/Giant_rat?oldid=3790587, https://wiki.darkan.org/Giant_rat. -Added a respawn_delay of 30 to [giant_rat_wilderness*]. -The hitpoints for giant_rat_wilderness* remain the same since they're supposed to have 100 according to new evidence. Source: https://www.youtube.com/watch?v=SJUSGehdeCc --- .../mudskipper_point/mudskipper_point.npcs.toml | 6 ++---- .../ardougne/sewers/ardougne_sewers.npcs.toml | 6 ++---- .../grand_tree/grand_tree_tunnels.npc-spawns.toml | 6 +++--- .../dungeon/edgeville_dungeon.npc-spawns.toml | 2 +- .../lumbridge/swamp/lumbridge_swamp.npcs.toml | 3 +-- data/area/misthalin/varrock/varrock.npcs.toml | 2 +- .../tunnels/meiyerditch_tunnels.npc-spawns.toml | 4 ++-- data/area/wilderness/wilderness.npc-spawns.toml | 14 +++++++------- data/area/wilderness/wilderness.npcs.toml | 6 ++++-- data/entity/npc/animal/rat/rat.npcs.toml | 8 ++------ .../npc/monster/reptile/spider/spider.npcs.toml | 2 -- .../desert_treasure/shadow_dungeon.npc-spawns.toml | 2 +- 12 files changed, 26 insertions(+), 35 deletions(-) diff --git a/data/area/asgarnia/mudskipper_point/mudskipper_point.npcs.toml b/data/area/asgarnia/mudskipper_point/mudskipper_point.npcs.toml index b8df16a7f5..01f4e7c2d8 100644 --- a/data/area/asgarnia/mudskipper_point/mudskipper_point.npcs.toml +++ b/data/area/asgarnia/mudskipper_point/mudskipper_point.npcs.toml @@ -19,24 +19,22 @@ id = 446 clone = "giant_rat_lumbridge_swamp" drop_table = "giant_rat" combat_def = "giant_rat" -hitpoints = 50 +hitpoints = 53 att = 2 str = 3 def = 2 max_hit_stab = 10 -hunt_mode = "cowardly" [giant_rat_mudskipper_point_2] id = 4924 clone = "giant_rat_lumbridge_swamp" drop_table = "giant_rat" combat_def = "giant_rat" -hitpoints = 50 +hitpoints = 53 att = 2 str = 3 def = 2 max_hit_stab = 10 -hunt_mode = "cowardly" [mogre] id = 114 diff --git a/data/area/kandarin/ardougne/sewers/ardougne_sewers.npcs.toml b/data/area/kandarin/ardougne/sewers/ardougne_sewers.npcs.toml index 4f6bb64ce2..f65ea111b8 100644 --- a/data/area/kandarin/ardougne/sewers/ardougne_sewers.npcs.toml +++ b/data/area/kandarin/ardougne/sewers/ardougne_sewers.npcs.toml @@ -62,22 +62,20 @@ id = 4922 clone = "giant_rat_lumbridge_swamp" drop_table = "giant_rat" combat_def = "giant_rat" -hitpoints = 50 +hitpoints = 53 att = 2 str = 3 def = 2 max_hit_stab = 10 -hunt_mode = "cowardly" [giant_rat_ardounge_sewer_stubby] id = 4923 clone = "giant_rat_lumbridge_swamp" drop_table = "giant_rat" combat_def = "giant_rat" -hitpoints = 50 +hitpoints = 53 att = 2 str = 3 def = 2 max_hit_stab = 10 -hunt_mode = "cowardly" diff --git a/data/area/kandarin/tree_gnome_stronghold/grand_tree/grand_tree_tunnels.npc-spawns.toml b/data/area/kandarin/tree_gnome_stronghold/grand_tree/grand_tree_tunnels.npc-spawns.toml index 91a4850d42..09d4741bf9 100644 --- a/data/area/kandarin/tree_gnome_stronghold/grand_tree/grand_tree_tunnels.npc-spawns.toml +++ b/data/area/kandarin/tree_gnome_stronghold/grand_tree/grand_tree_tunnels.npc-spawns.toml @@ -22,12 +22,12 @@ spawns = [ { id = "rat", x = 2489, y = 9866, members = true }, { id = "rat", x = 2488, y = 9861, members = true }, { id = "giant_rat_brimhaven", x = 2450, y = 9912, members = true }, - { id = "giant_rat_wilderness", x = 2450, y = 9903, members = true }, + { id = "giant_rat_dark_injured", x = 2450, y = 9903, members = true }, { id = "giant_rat", x = 2456, y = 9910, members = true }, { id = "giant_rat_brimhaven", x = 2464, y = 9908, members = true }, - { id = "giant_rat_wilderness", x = 2482, y = 9914, members = true }, + { id = "giant_rat_dark_injured", x = 2482, y = 9914, members = true }, { id = "giant_rat", x = 2488, y = 9912, members = true }, { id = "giant_rat_brimhaven", x = 2477, y = 9896, members = true }, { id = "giant_rat", x = 2483, y = 9888, members = true }, - { id = "giant_rat_wilderness", x = 2466, y = 9881, members = true }, + { id = "giant_rat_dark_injured", x = 2466, y = 9881, members = true }, ] \ No newline at end of file diff --git a/data/area/misthalin/edgeville/dungeon/edgeville_dungeon.npc-spawns.toml b/data/area/misthalin/edgeville/dungeon/edgeville_dungeon.npc-spawns.toml index 978dd077e9..285ea84d86 100644 --- a/data/area/misthalin/edgeville/dungeon/edgeville_dungeon.npc-spawns.toml +++ b/data/area/misthalin/edgeville/dungeon/edgeville_dungeon.npc-spawns.toml @@ -22,7 +22,7 @@ spawns = [ { id = "giant_rat", x = 3121, y = 9893 }, { id = "giant_rat_brimhaven", x = 3089, y = 9895 }, { id = "giant_rat_brimhaven", x = 3122, y = 9889 }, - { id = "giant_rat_wilderness", x = 3117, y = 9889 }, + { id = "giant_rat_dark_injured", x = 3117, y = 9889 }, { id = "hobgoblin_unarmed", x = 3122, y = 9874 }, { id = "hobgoblin_unarmed", x = 3126, y = 9875 }, { id = "hobgoblin_armed", x = 3118, y = 9871 }, diff --git a/data/area/misthalin/lumbridge/swamp/lumbridge_swamp.npcs.toml b/data/area/misthalin/lumbridge/swamp/lumbridge_swamp.npcs.toml index 27492598fc..2e863680b7 100644 --- a/data/area/misthalin/lumbridge/swamp/lumbridge_swamp.npcs.toml +++ b/data/area/misthalin/lumbridge/swamp/lumbridge_swamp.npcs.toml @@ -4,13 +4,12 @@ att = 2 str = 3 def = 2 combat_def = "giant_rat" -hitpoints = 50 +hitpoints = 53 slayer_xp = 5.0 respawn_delay = 30 drop_table = "giant_rat" categories = ["giant_rats", "rats"] examine = "Overgrown vermin." -hunt_mode = "cowardly" [fremennik_shipmaster_al_kharid] id = 9708 diff --git a/data/area/misthalin/varrock/varrock.npcs.toml b/data/area/misthalin/varrock/varrock.npcs.toml index fb08ed836d..45d18e2fa2 100644 --- a/data/area/misthalin/varrock/varrock.npcs.toml +++ b/data/area/misthalin/varrock/varrock.npcs.toml @@ -194,7 +194,7 @@ id = 2091 att = 6 str = 5 def = 2 -hitpoints = 100 +hitpoints = 133 slayer_xp = 10.0 combat_def = "giant_rat" drop_table = "giant_rat" diff --git a/data/area/morytania/meiyerditch/tunnels/meiyerditch_tunnels.npc-spawns.toml b/data/area/morytania/meiyerditch/tunnels/meiyerditch_tunnels.npc-spawns.toml index ede22fd64c..aea9331406 100644 --- a/data/area/morytania/meiyerditch/tunnels/meiyerditch_tunnels.npc-spawns.toml +++ b/data/area/morytania/meiyerditch/tunnels/meiyerditch_tunnels.npc-spawns.toml @@ -22,7 +22,7 @@ spawns = [ { id = "giant_rat", x = 3495, y = 9812, members = true }, { id = "giant_rat", x = 3502, y = 9806, members = true }, { id = "giant_rat_brimhaven", x = 3463, y = 9813, members = true }, - { id = "giant_rat_wilderness", x = 3469, y = 9816, members = true }, + { id = "giant_rat_brimhaven", x = 3469, y = 9816, members = true }, { id = "goblin_light_grey_bald_spear", x = 3465, y = 9797, members = true }, { id = "hobgoblin_unarmed", x = 3469, y = 9797, members = true }, { id = "hobgoblin_armed", x = 3469, y = 9796, members = true }, @@ -83,7 +83,7 @@ spawns = [ { id = "mutated_bloodveld_meiyerditch_tunnels_2", x = 3600, y = 9740 }, { id = "mutated_bloodveld_meiyerditch_tunnels_2", x = 3605, y = 9738 }, { id = "giant_rat", x = 3479, y = 9832 }, - { id = "giant_rat_wilderness_2", x = 3464, y = 9818, members = true }, + { id = "giant_rat_dark_injured", x = 3464, y = 9818, members = true }, { id = "dog", x = 3469, y = 9806 }, { id = "dog", x = 3470, y = 9804 }, ] diff --git a/data/area/wilderness/wilderness.npc-spawns.toml b/data/area/wilderness/wilderness.npc-spawns.toml index bb601f6779..fe495c0510 100644 --- a/data/area/wilderness/wilderness.npc-spawns.toml +++ b/data/area/wilderness/wilderness.npc-spawns.toml @@ -102,10 +102,14 @@ spawns = [ { id = "giant_spider_mid", x = 3168, y = 3877 }, { id = "giant_spider_mid", x = 3177, y = 3877 }, # 12855 - { id = "giant_rat_brimhaven", x = 3227, y = 3547 }, - { id = "giant_rat_brimhaven", x = 3251, y = 3528 }, - { id = "giant_rat_dark_injured", x = 3237, y = 3549 }, + { id = "giant_rat_wilderness", x = 3227, y = 3547 }, + { id = "giant_rat_wilderness", x = 3251, y = 3528 }, + { id = "giant_rat_wilderness", x = 3237, y = 3549 }, { id = "giant_rat_wilderness", x = 3227, y = 3533 }, + { id = "giant_rat_wilderness", x = 3236, y = 3549 }, + { id = "giant_rat_wilderness_2", x = 3242, y = 3530, members = true }, + { id = "giant_rat_wilderness_2", x = 3248, y = 3553, members = true }, + { id = "giant_rat_wilderness_2", x = 3256, y = 3541, members = true }, # 12857 { id = "rat", x = 3251, y = 3677 }, { id = "rat", x = 3252, y = 3676 }, @@ -280,7 +284,6 @@ spawns = [ { id = "hellhound", x = 3186, y = 3913 }, { id = "hellhound", x = 3193, y = 3926 }, { id = "hellhound", x = 3195, y = 3915 }, - { id = "giant_rat_wilderness", x = 3236, y = 3549 }, { id = "black_salamander", x = 3294, y = 3676 }, { id = "black_salamander", x = 3296, y = 3678 }, { id = "black_salamander", x = 3298, y = 3665 }, @@ -366,9 +369,6 @@ spawns = [ { id = "black_demon", x = 3313, y = 3824, members = true }, { id = "black_demon", x = 3314, y = 3814, members = true }, { id = "black_demon", x = 3320, y = 3823, members = true }, - { id = "giant_rat_wilderness_2", x = 3242, y = 3530, members = true }, - { id = "giant_rat_wilderness_2", x = 3248, y = 3553, members = true }, - { id = "giant_rat_wilderness_2", x = 3256, y = 3541, members = true }, { id = "goblin_musician", x = 3140, y = 3642 }, { id = "green_dragon", x = 2982, y = 3618 }, { id = "green_dragon", x = 3118, y = 3820 }, diff --git a/data/area/wilderness/wilderness.npcs.toml b/data/area/wilderness/wilderness.npcs.toml index da7d6957a7..7940e17411 100644 --- a/data/area/wilderness/wilderness.npcs.toml +++ b/data/area/wilderness/wilderness.npcs.toml @@ -104,7 +104,8 @@ combat_def = "giant_rat" drop_table = "giant_rat" categories = ["giant_rats", "rats"] examine = "Overgrown vermin." -hunt_mode = "cowardly" +hunt_mode = "aggressive" +respawn_delay = 30 [black_salamander] id = 5116 @@ -214,7 +215,8 @@ att = 6 str = 5 def = 2 max_hit_stab = 10 -hunt_mode = "cowardly" +hunt_mode = "aggressive" +respawn_delay = 30 [battle_mage_zamorak] id = 912 diff --git a/data/entity/npc/animal/rat/rat.npcs.toml b/data/entity/npc/animal/rat/rat.npcs.toml index cfc821068d..eb7614486f 100644 --- a/data/entity/npc/animal/rat/rat.npcs.toml +++ b/data/entity/npc/animal/rat/rat.npcs.toml @@ -53,7 +53,7 @@ att = 2 str = 3 def = 2 combat_def = "giant_rat" -hitpoints = 50 +hitpoints = 53 slayer_xp = 5.0 respawn_delay = 30 drop_table = "giant_rat" @@ -64,32 +64,28 @@ examine = "Overgrown vermin." id = 950 categories = ["giant_rats", "rats"] clone = "giant_rat" -hunt_mode = "cowardly" [giant_rat_3] id = 12349 categories = ["giant_rats", "rats"] clone = "giant_rat" -hunt_mode = "cowardly" [giant_rat_4] id = 4924 categories = ["giant_rats", "rats"] clone = "giant_rat" -hunt_mode = "cowardly" [giant_rat_5] id = 12351 categories = ["giant_rats", "rats"] clone = "giant_rat" -hunt_mode = "cowardly" [giant_rat_dark] id = 8828 att = 6 str = 5 def = 2 -hitpoints = 100 +hitpoints = 133 slayer_xp = 10.0 respawn_delay = 30 combat_def = "giant_rat" diff --git a/data/entity/npc/monster/reptile/spider/spider.npcs.toml b/data/entity/npc/monster/reptile/spider/spider.npcs.toml index 2d9c96409a..a5a3eed8f2 100644 --- a/data/entity/npc/monster/reptile/spider/spider.npcs.toml +++ b/data/entity/npc/monster/reptile/spider/spider.npcs.toml @@ -17,8 +17,6 @@ hitpoints = 67 attack_bonus = -10 combat_def = "giant_spider" drop_table = "giant_spider" -hunt_mode = "cowardly" -hunt_range = 1 slayer_xp = 5.0 respawn_delay = 45 categories = ["giant_spiders", "spiders"] diff --git a/data/quest/members/desert_treasure/shadow_dungeon.npc-spawns.toml b/data/quest/members/desert_treasure/shadow_dungeon.npc-spawns.toml index 47ab11d04a..dab94f76cb 100644 --- a/data/quest/members/desert_treasure/shadow_dungeon.npc-spawns.toml +++ b/data/quest/members/desert_treasure/shadow_dungeon.npc-spawns.toml @@ -13,7 +13,7 @@ spawns = [ { id = "rat", x = 2700, y = 5061, members = true }, { id = "rat", x = 2713, y = 5061, members = true }, { id = "giant_rat", x = 2721, y = 5102, members = true }, - { id = "giant_rat_wilderness", x = 2737, y = 5062, members = true }, + { id = "giant_rat_dark_injured", x = 2737, y = 5062, members = true }, { id = "giant_skeleton_shadow_dungeon", x = 2626, y = 5065, members = true }, { id = "giant_skeleton_shadow_dungeon", x = 2637, y = 5099, members = true }, { id = "giant_skeleton_shadow_dungeon", x = 2638, y = 5058, members = true }, From 2dca2bfcbd703d580834683d8253e7d6f1a8ebe0 Mon Sep 17 00:00:00 2001 From: GregHib Date: Thu, 20 Aug 2026 19:16:40 +0100 Subject: [PATCH 09/14] Fix lumbridge beginner task test --- .../kotlin/content/achievement/LumbridgeBeginnerTasksTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/test/kotlin/content/achievement/LumbridgeBeginnerTasksTest.kt b/game/src/test/kotlin/content/achievement/LumbridgeBeginnerTasksTest.kt index 953509aed8..d9f915474e 100644 --- a/game/src/test/kotlin/content/achievement/LumbridgeBeginnerTasksTest.kt +++ b/game/src/test/kotlin/content/achievement/LumbridgeBeginnerTasksTest.kt @@ -1179,7 +1179,7 @@ internal class LumbridgeBeginnerTasksTest : WorldTest() { skeleton.levels.set(Skill.Constitution, 150) player.npcOption(skeleton, "Attack") - tick(2) + tick(1) player.levels.drain(Skill.Constitution, 5) tick(30) From 00bf94a5fffa5554f11b733a0a30e761dbe5e7ac Mon Sep 17 00:00:00 2001 From: GregHib Date: Thu, 20 Aug 2026 19:29:51 +0100 Subject: [PATCH 10/14] Fix teleport take off overrides break ladder climbing anims --- .../entity/character/player/Teleport.kt | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Teleport.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Teleport.kt index 38464f6cf3..4ed46e9139 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Teleport.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/player/Teleport.kt @@ -79,8 +79,33 @@ interface Teleport { } suspend fun takeOff(player: Player, target: GameObject, option: String): Int { - val handler = objectTakeOff["$option:${target.id}"] ?: objectTakeOff["*:${target.id}"] ?: objectTakeOff["$option:*"] ?: objectTakeOff["*:*"] ?: return CONTINUE - return handler.invoke(player, target, option) + var handler = objectTakeOff["$option:${target.id}"] + var result = CONTINUE + if (handler != null) { + result = handler.invoke(player, target, option) + } + if (result != CONTINUE) { + return result + } + handler = objectTakeOff["*:${target.id}"] + if (handler != null) { + result = handler.invoke(player, target, option) + } + if (result != CONTINUE) { + return result + } + handler = objectTakeOff["$option:*"] + if (handler != null) { + result = handler.invoke(player, target, option) + } + if (result != CONTINUE) { + return result + } + handler = objectTakeOff["*:*"] + if (handler != null) { + result = handler.invoke(player, target, option) + } + return result } suspend fun land(player: Player, target: GameObject, option: String) { From fc998e81cd8f4a33bfeae96793f844976ad9e167 Mon Sep 17 00:00:00 2001 From: GregHib Date: Thu, 20 Aug 2026 19:36:47 +0100 Subject: [PATCH 11/14] Switch hunt mode test npc with different cowardly npc --- .../voidps/engine/entity/character/mode/Wander.kt | 10 ++++------ .../kotlin/content/entity/npc/combat/HuntModeTest.kt | 6 +++--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt index 855e8745bc..98346641ae 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt @@ -23,12 +23,10 @@ class Wander( private var lastTile = Tile.EMPTY override fun tick() { - if (npc.tile == lastTile) { - if (stuckCounter++ >= stuckLimit) { - npc.tele(spawn) - stuckCounter = 0 - } - } else { + if (npc.tile != lastTile) { + stuckCounter = 0 + } else if (stuckCounter++ >= stuckLimit) { + npc.tele(spawn) stuckCounter = 0 } lastTile = npc.tile diff --git a/game/src/test/kotlin/content/entity/npc/combat/HuntModeTest.kt b/game/src/test/kotlin/content/entity/npc/combat/HuntModeTest.kt index 1e6da0da01..9d75c0b926 100644 --- a/game/src/test/kotlin/content/entity/npc/combat/HuntModeTest.kt +++ b/game/src/test/kotlin/content/entity/npc/combat/HuntModeTest.kt @@ -25,7 +25,7 @@ internal class HuntModeTest : WorldTest() { @Test fun `Cowardly attack low level player when in range`() { val player = createPlayer(emptyTile) - val npc = createNPC("giant_spider", emptyTile.addY(2)) + val npc = createNPC("highwayman_no_hood", emptyTile.addY(2)) assertFalse(player.underAttack) assertTrue(Settings["world.npcs.aggression", false]) @@ -39,8 +39,8 @@ internal class HuntModeTest : WorldTest() { @Test fun `Cowardly doesn't attack high level player when in range`() { val player = createPlayer(emptyTile) - val npc = createNPC("giant_spider", emptyTile.addY(1)) - player.combatLevel = 5 + val npc = createNPC("highwayman_no_hood", emptyTile.addY(1)) + player.combatLevel = 11 assertFalse(player.underAttack) tick(6) From d0c9bb65592144a19a61df9a12804241b501e59e Mon Sep 17 00:00:00 2001 From: GregHib Date: Thu, 20 Aug 2026 20:10:14 +0100 Subject: [PATCH 12/14] Stop from wander range from bypassing cache walk values --- .../world/gregs/voidps/engine/entity/character/mode/Wander.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt index 98346641ae..4e0e34fe2e 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/mode/Wander.kt @@ -53,10 +53,6 @@ class Wander( return false } val id = npc["transform_id", npc.id] - val configuredRange = Tables.intOrNull("npc_ranges.$id.wander_range") - if (configuredRange != null) { - return configuredRange > 0 - } val def = NPCDefinitions.get(id) return when (def.walkMode.toInt()) { ModeType.WANDER_THROUGH, ModeType.WANDER_SPECIAL, ModeType.WANDER_WATER -> true From bd3a67fb648664239fb2ac3d1cd8a7e89370ad70 Mon Sep 17 00:00:00 2001 From: GregHib Date: Thu, 20 Aug 2026 20:10:32 +0100 Subject: [PATCH 13/14] Fix getDefinition type warning --- .../engine/client/instruction/handle/ObjectOptionHandler.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt index be95045b30..6470167de0 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt @@ -1,6 +1,8 @@ package world.gregs.voidps.engine.client.instruction.handle import com.github.michaelbull.logging.InlineLogger +import world.gregs.voidps.cache.Definition +import world.gregs.voidps.cache.definition.Parameterized import world.gregs.voidps.cache.definition.Transforms import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.ui.closeInterfaces @@ -78,7 +80,7 @@ class ObjectOptionHandler : InstructionHandler() { return variable.values.toInt(value) } - fun > getDefinition(player: Player, definitions: D, definition: T, def: Transforms): T { + fun > getDefinition(player: Player, definitions: D, definition: T, def: Transforms): T where T : Definition, T : Parameterized { val transforms = def.transforms ?: return definition val varbit = def.varbit if (varbit != -1) { From 7833a0d8d9dae79d234706ad4dead2004ccab276 Mon Sep 17 00:00:00 2001 From: GregHib Date: Thu, 20 Aug 2026 20:12:15 +0100 Subject: [PATCH 14/14] Fix zogre flesh eaters test broken from climb-up ladder fixes --- .../quest/member/zogre_flesh_eaters/ZogreFleshEatersTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/test/kotlin/content/quest/member/zogre_flesh_eaters/ZogreFleshEatersTest.kt b/game/src/test/kotlin/content/quest/member/zogre_flesh_eaters/ZogreFleshEatersTest.kt index 448ff8c82b..7e67a4111b 100644 --- a/game/src/test/kotlin/content/quest/member/zogre_flesh_eaters/ZogreFleshEatersTest.kt +++ b/game/src/test/kotlin/content/quest/member/zogre_flesh_eaters/ZogreFleshEatersTest.kt @@ -197,7 +197,7 @@ class ZogreFleshEatersTest : WorldTest() { player.tele(2597, 3108, 0) val ladder = GameObjects.find(Tile(2597, 3107), "basic_ladder_bottom") player.objectOption(ladder, "Climb-up") - tick(2) + tick(4) assertEquals(1, player["thzfe_sithik_transformed", 0]) player.tele(2593, 3103, 1)