From 39cb9b6492cd3d074aab98e2d1ffeb0d6846c20e Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sat, 31 Jan 2026 18:05:54 +0200 Subject: [PATCH 01/17] Added stronghold of player safety npc:s dialogue --- .../ProfessorHenry.kt | 22 +++++++ .../StrongholdOfPlayerSafetyGuard.kt | 48 ++++++++++++++ .../StrongholdOfPlayerSafetyStudents.kt | 65 +++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt new file mode 100644 index 0000000000..1bc6cbc3c3 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt @@ -0,0 +1,22 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import world.gregs.voidps.engine.Script +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Neutral + +class ProfessorHenry : Script { + init { + npcOperate("Talk-to", "professor_henry") { + player("Hello!") + npc("Good day!") + npc("Did you want to know about the old jail block? We always need adventurers to keep the cockroaches in check.") + player("Do I need to do your exam?") + npc("No, the exam isn't really for adventurers like you. Are you looking for the jail block?") + player("Sure, tell me about the jail.") + npc("In the cells downstairs there's a secret passage into the old prison. I hear that fame and fortune awaits a suitably skilled adventurer.") + player("Thanks, I'll look into that.") + } + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt new file mode 100644 index 0000000000..784ced16dc --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt @@ -0,0 +1,48 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import world.gregs.voidps.engine.Script +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.type.choice +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import world.gregs.voidps.engine.client.ui.closeDialogue +import world.gregs.voidps.engine.client.ui.open +import world.gregs.voidps.engine.queue.queue + + +class StrongholdOfPlayerSafetyGuard : Script { + init { + npcOperate("Talk-to", "guard_stronghold_of_player_safety") { + npc("Can I help you?") + player("I hope so. What is this place?") + npc("Above us is the Misthalin Training Centre of Excellence, where young adventurers are taught things that will help keep themselves safe.") + npc("They say that hidden away somewhere here is the entrance to the old jail, which no doubt has fabulous treasures for those willing to search for them.") + npc("Together they're called the Stronghold of Player Safety, for historical reasons.") + player("So what do you do?") + npc("I guard this stairway to make sure that prospective students are ready, and to explain the Report Abusive function.") + choice { + option("What is this Report Abuse thing?") { + npc("Should you find a player who acts in a way that breaks one of our rules, you should report them.") + npc("Reporting is very simple and easy to do. Simply click the Report Abuse button at the bottom of the screen and you will be shown the following screens:") + open("report_abuse_select") + interfaceOpened("report_abuse_select") { + closeDialogue() + } + interfaceClosed("report_abuse_select") { + queue("guard_chat") { + npc("On the first page, simply enter the player's name in the box and then click 'Next'") + npc("On the following page, click on the offence that the player has commited.") + npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") + player("Thank you. I'll bear that in mind.") + closeDialogue() + } + } + } + option("That's interesting. Goodbye.") + } + } + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt new file mode 100644 index 0000000000..05bcf2cae6 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt @@ -0,0 +1,65 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import world.gregs.voidps.engine.Script +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Confused +import content.entity.player.dialogue.Blink +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Shock +import content.entity.player.dialogue.Sad +import world.gregs.voidps.engine.entity.character.player.Player + +class StrongholdOfPlayerSafetyStudents : Script { + init { + npcOperate("Talk-to", "student_barbarian_village") { + player("How are you doing with the exam?") + npc("...") + player("That good, huh?") + noTalking() + } + npcOperate("Talk-to", "student_barbarian_village_2") { + player("How's the exam going at the moment?") + npc("What exam?") + player("Uh...the exam you're taking?") + npc("I'm not taking an exam. I'm drawing pictures.") + player("Oh.I...er...see.") + cheatingExam() + } + npcOperate("Talk-to", "student_barbarian_village_3") { + npc("What's 769 x 426?") + player("What? Er...I don't know.") + npc("Me neither.") + noTalking() + } + npcOperate("Talk-to", "student_barbarian_village_4") { + npc("I broke my pencil. Do you have a spare one?") + player("No, I don't.") + cheatingExam() + } + npcOperate("Talk-to", "student_edgeville") { + npc("Bah! I hate maths.") + player("I thought this was a Player Safety exam?") + npc("Yes, it is - but i just hate maths.") + player("Ah, okay.") + cheatingExam() + } + npcOperate("Talk-to", "student_edgeville_2") { + npc("*Sob!* I'm going to fail! I hate exams.") + player("Cheer up! I'm sure you'll do fine. Try to concentrate.") + noTalking() + } + } + + suspend fun Player.noTalking() { + npc("professor_henry", "No talking in the exam, please.") + player("Sorry!") + } + + suspend fun Player.cheatingExam() { + npc("professor_henry","Please leave the students alone while they take their exams. We don't want any cheating in here.") + player("Oh! Sorry about that.") + } +} \ No newline at end of file From c3b1598627ad5cb46bad2b3628f1323c57945344 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Tue, 3 Feb 2026 22:33:41 +0200 Subject: [PATCH 02/17] Added objects, npc dialogue and scripts to the stronghold --- .../barbarian_village.npc-spawns.toml | 8 +- ...tronghold_of_player_safety.npc-spawns.toml | 14 +-- .../edgeville/edgeville.npc-spawns.toml | 4 +- .../misthalin/edgeville/edgeville.teles.toml | 9 +- ...tronghold_of_player_safety.obj-spawns.toml | 3 + .../stronghold_of_player_safety.objs.toml | 107 ++++++++++++++++++ .../stronghold_of_player_safety.teles.toml | 21 +++- .../stronghold_of_player_safety.varbits.toml | 9 ++ .../stronghold_of_player_safety.vars.toml | 3 + .../tutorial_island.teles.toml | 4 - data/entity/obj/stairs_ladders.objs.toml | 50 +++++++- .../ProfessorHenry.kt | 8 +- .../StrongholdOfPlayerSafety.kt | 65 +++++++++++ .../StrongholdOfPlayerSafetyGuard.kt | 9 +- .../StrongholdOfPlayerSafetyRewards.kt | 63 +++++++++++ .../StrongholdOfPlayerSafetyShelf.kt | 19 ++++ .../StrongholdOfPlayerSafetyStudents.kt | 18 +-- 17 files changed, 365 insertions(+), 49 deletions(-) create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.obj-spawns.toml create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml create mode 100644 game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyShelf.kt diff --git a/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml b/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml index 7aa91c62a8..d64a90c9ec 100644 --- a/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml +++ b/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml @@ -58,10 +58,10 @@ spawns = [ { id = "baby_raccoon_grey", x = 3055, y = 3432, members = true }, { id = "baby_raccoon_grey", x = 3059, y = 3421, members = true }, { id = "baby_raccoon_grey", x = 3061, y = 3429, members = true }, - { id = "student_barbarian_village", x = 3081, y = 3455, direction = "NORTH" }, - { id = "student_barbarian_village_2", x = 3081, y = 3453, direction = "NORTH" }, - { id = "student_barbarian_village_3", x = 3079, y = 3455, direction = "NORTH" }, - { id = "student_barbarian_village_4", x = 3077, y = 3453, direction = "NORTH" }, + { id = "student_barbarian_village", x = 3081, y = 3455, direction = "EAST" }, + { id = "student_barbarian_village_2", x = 3081, y = 3453, direction = "EAST" }, + { id = "student_barbarian_village_3", x = 3079, y = 3455, direction = "EAST" }, + { id = "student_barbarian_village_4", x = 3077, y = 3453, direction = "EAST" }, { id = "lakki_the_delivery_dwarf", x = 3008, y = 3434, members = true }, { id = "unicorn", x = 3090, y = 3450 }, ] \ No newline at end of file diff --git a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npc-spawns.toml b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npc-spawns.toml index 1b364269ec..1146df3c83 100644 --- a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npc-spawns.toml +++ b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npc-spawns.toml @@ -1,12 +1,12 @@ spawns = [ { id = "guard_stronghold_of_player_safety", x = 3083, y = 4246 }, - { id = "gublinch_jailmate_stronghold_of_player_safety", x = 3085, y = 4230 }, - { id = "gublinchette_jailmate_stronghold_of_player_safety", x = 3081, y = 4252 }, - { id = "gublinchette_jailmate_stronghold_of_player_safety_2", x = 3078, y = 4240 }, - { id = "gublinch_jailmate_stronghold_of_player_safety_2", x = 3079, y = 4245 }, - { id = "gublinch_jailmate_stronghold_of_player_safety_3", x = 3077, y = 4229 }, - { id = "gublinch_jailmate_stronghold_of_player_safety_4", x = 3085, y = 4235 }, - { id = "gublinch_jailmate_stronghold_of_player_safety_5", x = 3085, y = 4240 }, + { id = "gublinch_jailmate_stronghold_of_player_safety", x = 3085, y = 4230, direction = "WEST" }, + { id = "gublinchette_jailmate_stronghold_of_player_safety", x = 3081, y = 4252, direction = "SOUTH_EAST" }, + { id = "gublinchette_jailmate_stronghold_of_player_safety_2", x = 3078, y = 4240, direction = "EAST" }, + { id = "gublinch_jailmate_stronghold_of_player_safety_2", x = 3079, y = 4245, direction = "EAST" }, + { id = "gublinch_jailmate_stronghold_of_player_safety_3", x = 3077, y = 4229, direction = "EAST" }, + { id = "gublinch_jailmate_stronghold_of_player_safety_4", x = 3085, y = 4235, direction = "EAST" }, + { id = "gublinch_jailmate_stronghold_of_player_safety_5", x = 3085, y = 4240, direction = "WEST" }, { id = "cockroach_drone", x = 3142, y = 4240, level = 1 }, { id = "cockroach_drone", x = 3143, y = 4231, level = 1 }, { id = "cockroach_drone", x = 3143, y = 4236, level = 1 }, diff --git a/data/area/misthalin/edgeville/edgeville.npc-spawns.toml b/data/area/misthalin/edgeville/edgeville.npc-spawns.toml index 7083555706..6757fd0e38 100644 --- a/data/area/misthalin/edgeville/edgeville.npc-spawns.toml +++ b/data/area/misthalin/edgeville/edgeville.npc-spawns.toml @@ -65,8 +65,8 @@ spawns = [ { id = "imp", x = 3073, y = 3498 }, { id = "imp", x = 3078, y = 3499 }, { id = "professor_henry", x = 3084, y = 3458 }, - { id = "student_edgeville", x = 3079, y = 3457 }, - { id = "student_edgeville_2", x = 3077, y = 3457 }, + { id = "student_edgeville", x = 3079, y = 3457, direction = "EAST" }, + { id = "student_edgeville_2", x = 3077, y = 3457, direction = "EAST" }, { id = "cockroach_drone", x = 3077, y = 3461 }, { id = "cockroach_drone", x = 3078, y = 3464 }, { id = "oracle", x = 3013, y = 3501 }, diff --git a/data/area/misthalin/edgeville/edgeville.teles.toml b/data/area/misthalin/edgeville/edgeville.teles.toml index c824505f27..5293c2869c 100644 --- a/data/area/misthalin/edgeville/edgeville.teles.toml +++ b/data/area/misthalin/edgeville/edgeville.teles.toml @@ -130,7 +130,7 @@ tile = { x = 3046, y = 3483 } delta = { level = 1 } # 12342 edgeville -[29592] +[stronghold_of_player_safety_stairs_down] option = "Climb-down" tile = { x = 3084, y = 3452 } to = { x = 3086, y = 4247 } @@ -140,12 +140,7 @@ option = "Pull" tile = { x = 3090, y = 3474 } to = { x = 3154, y = 3924 } -[29728] -option = "Enter" -tile = { x = 3076, y = 3463 } -to = { x = 3157, y = 4279, level = 3 } - -[29603] +[stronghold_of_player_safety_jail_entrance_down] option = "Use" tile = { x = 3075, y = 3456 } to = { x = 3082, y = 4229 } diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.obj-spawns.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.obj-spawns.toml new file mode 100644 index 0000000000..824dbc3fb6 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.obj-spawns.toml @@ -0,0 +1,3 @@ +spawns = [ + { id = "player_safety_poster", x = 3077, y = 4235, type = 4, rotation = 0}, +] \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml new file mode 100644 index 0000000000..5fa8a65ec0 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml @@ -0,0 +1,107 @@ +[player_safety_poster] +id = 29586 +examine = "It looks like there's a small hole in the centre of this poster." + +[player_safety_bow_and_arrow] +id = 8773 +examine = "A useful ranging device." + +[player_safety_big_desk] +id = 29588 +examine = "The examiner's desk, covered in past papers." + +[player_safety_coat_of_arms] +id = 29584 +examine = "It says 'Playeri eruditi sunt'" + +[player_safety_shelf] +id = 18156 +examine = "Some shelves." + +[player_safety_desk] +id = 29587 +examine = "A desk for sitting at and writing on." + +[player_safety_satchel] +id = 29583 +examine = "Professor Henry's satchel. There's some sort of cup in here." + +[stronghold_of_player_safety_crevice] +id = 29728 +examine = "It looks like a bit of a squeeze." + +[stronghold_of_player_safety_jail_bed] +id = 29593 +examine = "A dirty bed." + +[stronghold_of_player_safety_jail_bed_2] +id = 29594 +examine = "This tiny rock hammer must have been used to create the chess set here." + +[stronghold_of_player_safety_panning_tray] +id = 17560 +examine = "Fill it with things." + +[stronghold_of_player_safety_broken_plaque] +id = 29608 +examine = "The writing on this plaque is too faded to read." + +[stronghold_of_player_safety_jail_entrance_up] +id = 29602 +examine = "The jail entrance." + +[stronghold_of_player_safety_jail_entrance_down] +id = 29603 +examine = "The jail entrance." + +[stronghold_of_player_safety_bookcase] +id = 29581 +examine = "A good source of books." + +[stronghold_of_player_safety_jail_door] +id = 21001 +examine = "A plaque details this gublinch's crimes." + +[stronghold_of_player_safety_jail_door_2] +id = 21008 +examine = "A plaque details this gublinch's crimes." + +[stronghold_of_player_safety_tunnel] +id = 29623 +examine = "This appears to lead back to the jail cell." + +[stronghold_of_player_safety_slimy_skulls] +id = 29579 +examine = "Skulls covered in bug slime." + +[stronghold_of_player_safety_rocks] +id = 29726 +examine = "Yuck. They are covered in bug slime." + +[stronghold_of_player_safety_rocks_2] +id = 29727 +examine = "Yuck. They are covered in bug slime." + +[stronghold_of_player_safety_rope] +id = 29729 +examine = "I wonder where this leads?" + +[stronghold_of_player_safety_an_old_lever_closed] +id = 29730 +examine = "I wonder what it does." + +[stronghold_of_player_safety_an_old_lever_opened] +id = 29731 +examine = "I wonder what it does." + +[stronghold_of_player_safety_jail_door_locked] +id = 29624 +examine = "It looks pretty dark behind there." + +[stronghold_of_player_safety_treasure_chest_closed] +id = 29577 +examine = "The chest is closed." + +[stronghold_of_player_safety_treasure_chest_opened] +id = 29578 +examine = "The chest is open." \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml index 4724ce5652..7126eee8ad 100644 --- a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml @@ -4,7 +4,7 @@ option = "Climb-down" tile = { x = 3088, y = 3571 } to = { x = 3089, y = 9971 } -[29589] +[stronghold_of_player_safety_stairs_up] option = "Climb-up" tile = { x = 3086, y = 4244 } to = { x = 3083, y = 3452 } @@ -15,11 +15,6 @@ option = "Pull" tile = { x = 3153, y = 3923 } to = { x = 2562, y = 3311 } -[29729] -option = "Climb" -tile = { x = 3159, y = 4280, level = 3 } -to = { x = 3077, y = 3462 } - [29660] option = "Climb-up" tile = { x = 3147, y = 4249, level = 1 } @@ -65,3 +60,17 @@ option = "Climb-up" tile = { x = 3171, y = 4273, level = 2 } delta = { x = -3, y = -2, level = 1 } +[stronghold_of_player_safety_tunnel] +option = "Use" +tile = { x = 3139, y = 4230, level = 2} +to = { x = 3077, y = 4235 } + +[stronghold_of_player_safety_jail_entrance_up] +option = "Leave" +tile = { x = 3082, y = 4228 } +to = { x = 3074, y = 3456 } + +[stronghold_of_player_safety_jail_door_locked_2] +option = "Open" +tile = { x = 3178, y = 4266 } +to = { x = 3177, y = 4269, level = 2 } \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml new file mode 100644 index 0000000000..06b96ea957 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml @@ -0,0 +1,9 @@ +[stronghold_of_player_safety_chest] +id = 4499 +persist = true +format = "boolean" + +[stronghold_of_player_safety_lever] +id = 4500 +persist = true +format = "boolean" \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml new file mode 100644 index 0000000000..6a0f4b6442 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml @@ -0,0 +1,3 @@ +[safety_rope_climbed] +format = "boolean" +persist = true \ No newline at end of file diff --git a/data/area/misthalin/tutorial_island/tutorial_island.teles.toml b/data/area/misthalin/tutorial_island/tutorial_island.teles.toml index 28b02e51aa..a708faf89f 100644 --- a/data/area/misthalin/tutorial_island/tutorial_island.teles.toml +++ b/data/area/misthalin/tutorial_island/tutorial_island.teles.toml @@ -60,10 +60,6 @@ tile = { x = 3082, y = 3124, level = 1 } delta = { level = -1 } # 12436 tutorial_island -[29602] -option = "Leave" -tile = { x = 3082, y = 4228 } -to = { x = 3074, y = 3456 } [3028] option = "Climb-up" diff --git a/data/entity/obj/stairs_ladders.objs.toml b/data/entity/obj/stairs_ladders.objs.toml index 41efbfc652..fa3de0b2f6 100644 --- a/data/entity/obj/stairs_ladders.objs.toml +++ b/data/entity/obj/stairs_ladders.objs.toml @@ -172,4 +172,52 @@ examine = "I can climb down this." [lumbridge_church_3rd_floor_ladder_down_west] id = 36991 -examine = "I can climb down this." \ No newline at end of file +examine = "I can climb down this." + +[stronghold_of_player_safety_stairs_up] +id = 29589 +examine = "The guard is watching these stairs." + +[stronghold_of_player_safety_stairs_down] +id = 29592 +examine = "They help one to rise up or down" + +[29671] +id = 29671 +examine = "I wonder where they will take me." + +[29672] +id = 29672 +examine = "I wonder where they will take me." + +[29660] +id = 29660 +examine = "I wonder where they will take me." + +[29663] +id = 29663 +examine = "I wonder where they will take me." + +[29664] +id = 29664 +examine = "I wonder where they will take me." + +[29667] +id = 29667 +examine = "I wonder where they will take me." + +[29668] +id = 29668 +examine = "I wonder where they will take me." + +[29655] +id = 29655 +examine = "I wonder where they will take me." + +[29656] +id = 29656 +examine = "I wonder where they will take me." + +[29659] +id = 29659 +examine = "I wonder where they will take me." \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt index 1bc6cbc3c3..8f745635d4 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/ProfessorHenry.kt @@ -1,10 +1,10 @@ package content.area.misthalin.edgeville.stronghold_of_player_safety -import world.gregs.voidps.engine.Script -import content.entity.player.dialogue.type.npc -import content.entity.player.dialogue.type.player import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import world.gregs.voidps.engine.Script class ProfessorHenry : Script { init { @@ -19,4 +19,4 @@ class ProfessorHenry : Script { player("Thanks, I'll look into that.") } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt new file mode 100644 index 0000000000..0289328b77 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt @@ -0,0 +1,65 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import content.entity.player.dialogue.type.statement +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.move.tele +import world.gregs.voidps.engine.entity.obj.replace +import world.gregs.voidps.type.Tile + +class StrongholdOfPlayerSafety : Script { + + init { + playerSpawn { + sendVariable("stronghold_of_player_safety_lever") + } + + objectOperate("Pull-back", "player_safety_poster") { + statement("There appears to be a tunnel behind the poster.") + tele(3140, 4230, 2) + } + + objectOperate("Climb", "stronghold_of_player_safety_rope") { + set("safety_rope_climbed", true) + tele(3077, 3462, 0) + } + objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_closed") { (target) -> + arriveDelay() + anim("8804") + target.anim("8802") + delay(3) + target.replace("stronghold_of_player_safety_an_old_lever_opened") + set("stronghold_of_player_safety_lever", true) + message("You hear cogs and gears moving and a distant unlocking sound.") + } + objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_opened") { (target) -> + arriveDelay() + anim("8805") + target.anim("8803") + delay(2) + target.replace("stronghold_of_player_safety_an_old_lever_closed") + set("stronghold_of_player_safety_lever", false) + message("You hear cogs and gears moving and the sound of heavy locks falling into place.") + } + + objectOperate("Enter", "stronghold_of_player_safety_crevice") { + if (get("safety_rope_climbed", false)) { + tele(3157, 4279, 3) + } else { + message("You're not sure if you should go in there; perhaps you should find another way in.") + } + } + objectOperate("Open", "stronghold_of_player_safety_jail_door_locked") { (target) -> + if (get("stronghold_of_player_safety_lever", false)) { + when (target.tile) { + Tile(3178, 4266, 0) -> tele(3177, 4269, 2) + Tile(3178, 4269, 2) -> tele(3177, 4266, 0) + Tile(3142, 4270, 0) -> tele(3142, 4272, 1) + Tile(3141, 4272, 1) -> tele(3143, 4270, 0) + } + } else { + message("The door seems to be locked by some kind of mechanism.") + } + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt index 784ced16dc..e62b784fdf 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt @@ -1,18 +1,17 @@ package content.area.misthalin.edgeville.stronghold_of_player_safety -import world.gregs.voidps.engine.Script +import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Neutral -import content.entity.player.dialogue.Shifty import content.entity.player.dialogue.Quiz -import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Shifty import content.entity.player.dialogue.type.choice 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.client.ui.closeDialogue import world.gregs.voidps.engine.client.ui.open import world.gregs.voidps.engine.queue.queue - class StrongholdOfPlayerSafetyGuard : Script { init { npcOperate("Talk-to", "guard_stronghold_of_player_safety") { @@ -45,4 +44,4 @@ class StrongholdOfPlayerSafetyGuard : Script { } } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt new file mode 100644 index 0000000000..4ae19334aa --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt @@ -0,0 +1,63 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import content.entity.player.bank.bank +import content.entity.player.dialogue.type.item +import content.entity.player.dialogue.type.skillLamp +import content.entity.player.dialogue.type.statement +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.player.skill.exp.exp +import world.gregs.voidps.engine.entity.obj.replace +import world.gregs.voidps.engine.inv.add +import world.gregs.voidps.engine.inv.holdsItem +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove + +class StrongholdOfPlayerSafetyRewards : Script { + + init { + playerSpawn { + sendVariable("stronghold_of_player_safety_chest") + } + + objectOperate("Open", "stronghold_of_player_safety_treasure_chest_closed") { (target) -> + if (inventory.isFull()) { + // https://youtu.be/eSZY9zdBAwg?si=UlMwKzgDA51IZ7TF&t=203 + statement("You don't have any room in your inventory for the treasure.") + message("You don't have any room in your inventory for the treasure.") + return@objectOperate + } + target.replace("stronghold_of_player_safety_treasure_chest_opened") + set("stronghold_of_player_safety_chest", true) + inventory.add("coins", 10000) + inventory.add("safety_gloves") + inventory.add("antique_lamp_misthalin_training_centre_of_excellence") + inventory.add("antique_lamp_misthalin_training_centre_of_excellence_2") + set("unlocked_emote_safety_first", true) + item("safety_gloves", 400, "You open the chest to find a large pile of gold, along with a pair of safety gloves and two antique lamps. Also in the chest is the secret of the 'Safety First' emote.") + } + + itemOption("Rub", "antique_lamp_misthalin_training_centre_of_excellence*") { (item, slot) -> + val skill = skillLamp() + if (inventory.remove(slot, item.id)) { + exp(skill, 500.0) + statement("Your wish has been granted!
You have been awarded 500 ${skill.name} experience!") + } + } + objectOperate("Search", "stronghold_of_player_safety_treasure_chest_opened") { + if (get("unlocked_emote_safety_first", false)) { + if (bank.contains("safety_gloves") || (inventory.contains("safety_gloves") || (holdsItem("safety_gloves")))) { + statement("The chest appears to be empty.") + message("The chest is already open and empty.") + } else { + if (inventory.isFull()) { + message("There are some gloves in the chest, but you have no space for them in your inventory.") + return@objectOperate + } + inventory.add("safety_gloves") + message("You find another pair of gloves in the chest.") + } + } + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyShelf.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyShelf.kt new file mode 100644 index 0000000000..f4c104341a --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyShelf.kt @@ -0,0 +1,19 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.type.random + +class StrongholdOfPlayerSafetyShelf : Script { + init { + objectOperate("Search", "player_safety_shelf") { + message("You search the books...") + delay(2) + when (random.nextInt(0, 3)) { + 0 -> message("None of them look very interesting.") + 1 -> message("You find nothing to interest you.") + 2 -> message("You don't find anything that you'd ever want to read.") + } + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt index 05bcf2cae6..a15049cb63 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyStudents.kt @@ -1,15 +1,15 @@ package content.area.misthalin.edgeville.stronghold_of_player_safety -import world.gregs.voidps.engine.Script -import content.entity.player.dialogue.type.npc -import content.entity.player.dialogue.type.player +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Blink +import content.entity.player.dialogue.Confused import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Quiz -import content.entity.player.dialogue.Confused -import content.entity.player.dialogue.Blink -import content.entity.player.dialogue.Angry -import content.entity.player.dialogue.Shock import content.entity.player.dialogue.Sad +import content.entity.player.dialogue.Shock +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.player.Player class StrongholdOfPlayerSafetyStudents : Script { @@ -59,7 +59,7 @@ class StrongholdOfPlayerSafetyStudents : Script { } suspend fun Player.cheatingExam() { - npc("professor_henry","Please leave the students alone while they take their exams. We don't want any cheating in here.") + npc("professor_henry", "Please leave the students alone while they take their exams. We don't want any cheating in here.") player("Oh! Sorry about that.") } -} \ No newline at end of file +} From 5f64d3ac53376ca132165c5f9c7f13c44a437e1f Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Tue, 3 Feb 2026 22:41:04 +0200 Subject: [PATCH 03/17] Added ground lever anim names --- .../stronghold_of_player_safety.anims.toml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.anims.toml diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.anims.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.anims.toml new file mode 100644 index 0000000000..88d3001be0 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.anims.toml @@ -0,0 +1,11 @@ +[pull_ground_lever] +id = 8804 + +[push_ground_lever] +id = 8805 + +[lever_down] +id = 8802 + +[lever_up] +id = 8803 \ No newline at end of file From def96e4bfb6d22ac14e20b64ee094bb15bd3682c Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Thu, 5 Feb 2026 23:04:50 +0200 Subject: [PATCH 04/17] Adding cockroaches anim, drops and combat --- .../stronghold_of_player_safety.npcs.toml | 15 +++- .../misthalin/edgeville/edgeville.npcs.toml | 7 ++ .../cockroach.anims.toml | 31 ++++++++ .../cockroach.combat.toml | 39 ++++++++++ .../cockroach.drops.toml | 72 +++++++++++++++++++ .../cockroach.gfx.toml | 7 ++ .../CockroachSoldier.kt | 13 ++++ 7 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.anims.toml create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.drops.toml create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.gfx.toml create mode 100644 game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt diff --git a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml index c295537eca..dfb3014fce 100644 --- a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml +++ b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml @@ -32,13 +32,27 @@ examine = "An imprisoned gublinch." [cockroach_worker] id = 7159 +hitpoints = 540 +att = 22 +str = 22 +def = 22 categories = ["cockroaches"] examine = "Eurgh! A big bug." +respawn_delay = 60 +combat_def = "cockroach_worker" +drop_table = "cockroach_worker" [cockroach_soldier] id = 7160 +hitpoints = 960 +att = 50 +str = 50 +def = 50 +range = 50 categories = ["cockroaches"] examine = "Euww! A giant bug." +respawn_delay = 60 +drop_table = "cockroach_soldier" [mugger_stronghold_of_player_safety] id = 7161 @@ -48,7 +62,6 @@ str = 5 def = 5 style = "crush" max_hit_melee = 10 -hunt_mode = "cowardly" drop_table = "mugger" examine = "He jumps out and attacks people." diff --git a/data/area/misthalin/edgeville/edgeville.npcs.toml b/data/area/misthalin/edgeville/edgeville.npcs.toml index a0b94ef5ba..a21903b1fb 100644 --- a/data/area/misthalin/edgeville/edgeville.npcs.toml +++ b/data/area/misthalin/edgeville/edgeville.npcs.toml @@ -151,8 +151,15 @@ examine = "A person sitting an exam." [cockroach_drone] id = 7158 +hitpoints = 110 +att = 3 +str = 3 +def = 3 categories = ["cockroaches"] examine = "A household pest." +combat_def = "cockroach_drone" +respawn_delay = 60 +drop_table = "cockroach_drone" [oracle] id = 746 diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.anims.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.anims.toml new file mode 100644 index 0000000000..201d5d5e8e --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.anims.toml @@ -0,0 +1,31 @@ +[cockroach_drone_attack] +id = 8785 + +[cockroach_soldier_attack] +id = 8786 + +[cockroach_worker_attack] +id = 8787 + +[cockroach_drone_death] +id = 8788 + +[cockroach_soldier_death] +id = 8789 + +[cockroach_worker_death] +id = 8790 + +[cokroach_drone_defend] +id = 8791 + +[cockroach_soldier_defend] +id = 8792 + +[cockroach_worker_defend] +id = 8793 + +[cockroach_soldier_ranged] +id = 8799 + + diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml new file mode 100644 index 0000000000..15e1427598 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml @@ -0,0 +1,39 @@ +[cockroach_drone] +attack_speed = 4 +defend_anim = "cokroach_drone_defend" +death_anim = "cockroach_drone_death" + +[cockroach_drone.attack] +anim = "cockroach_drone_attack" +range = 1 +target_hit = { offense = "melee", max = 20 } + +[cockroach_worker] +defend_anim = "cockroach_worker_defend" +death_anim = "cockroach_worker_death" +attack_speed = 4 + +[cockroach_worker.attack] +anim = "cockroach_worker_attack" +range = 1 +target_hit = { offense = "melee", max = 60 } + +[cockroach_soldier] +defend_anim = "cockroach_soldier_defend" +death_anim = "cockroach_soldier_death" +attack_speed = 4 + +[cockroach_soldier.melee] +anim = "cockroach_soldier_attack" +range = 1 +target_hit = { offense = "melee", max = 90 } + + +[cockroach_soldier.ranged] +anim = "cockroach_soldier_ranged" +projectile = "cockroach_soldier_ranged" +range = 8 +projectile_origin_y = 1 +projectile_origin_x = 1 +target_hit = { offense = "range", max = 110 } +condition = "ranged_only" diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.drops.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.drops.toml new file mode 100644 index 0000000000..7308563366 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.drops.toml @@ -0,0 +1,72 @@ +[cockroach_drone_drop_table] +type = "all" +drops = [ + { table = "cockroach_drone_secondary" }, +] + +[cockroach_drone_secondary] +roll = 128 +drops = [ + { id = "nothing", chance = 13 }, + { id = "bronze_dagger", chance = 4}, + { id = "bronze_med_helm", chance = 4 }, + { id = "air_rune", min = 1, max = 10, chance = 11 }, + { id = "fire_rune", min = 1, max = 11, chance = 6 }, + { id = "water_rune", min = 1, max = 8, chance = 18 }, + { id = "coins", min = 10, max = 30, chance = 53 }, + { id = "limpwurt_root", chance = 3 }, + { id = "red_spiders_eggs", chance = 2 }, + { id = "coal_noted", amount = 2, chance = 15 }, + { table = "gem_drop_table", chance = 6 }, + { table = "herb_drop_table", chance = 20, members = true } +] + +[cockroach_worker_drop_table] +type = "all" +drops = [ + { table = "cockroach_worker_secondary"}, + { table = "easy_clue_scroll", roll = 128 }, +] + +[cockroach_worker_secondary] +roll = 128 +drops = [ + { id = "mithril_platebody" }, + { id = "mithril_sq_shield", chance = 4 }, + { id = "mithril_ore_noted", amount = 2, chance = 2 }, + { id = "coal_noted", min = 1, max = 2, chance = 10 }, + { id = "coins", min = 30, max = 130, chance = 47 }, + { id = "black_full_helm", chance = 2 }, + { id = "cosmic_rune", min = 1, max = 2, chance = 10 }, + { id = "earth_rune", min = 1, max = 22, chance = 10 }, + { id = "nature_rune", min = 1, max = 20, chance = 10 }, + { id = "chaos_rune", min = 1, max = 18, chance = 10 }, + { id = "battlestaff", members = true }, + { table = "herb_drop_table", chance = 13, members = true }, + { table = "gem_drop_table", chance = 5 }, +] + +[cockroach_soldier_drop_table] +type = "all" +drops = [ + { table = "cockroach_soldier_secondary"}, + { table = "medium_clue_scroll", roll = 128 }, +] + +[cockroach_soldier_secondary] +roll = 128 +drops = [ + { id = "rune_scimitar"}, + { id = "rune_sq_shield"}, + { id = "mithril_med_helm", chance = 4 }, + { id = "death_rune", min = 1, max = 15, chance = 10}, + { id = "law_rune", min = 1, max = 20, chance = 10 }, + { id = "fire_rune", min = 2, max = 59, chance = 10}, + { id = "blood_rune", min = 2, max = 11, chance = 10, members = true }, + { id = "mithril_ore_noted", amount = 3, chance = 10 }, + { id = "adamantite_ore_noted", chance = 4 }, + { id = "coins", min = 100, max = 400, chance = 62}, + { id = "bittercap_mushroom", min = 1, max = 3, chance = 3 }, + { table = "uncommon_seed_drop_table", chance = 8, members = true }, + { table = "gem_drop_table", chance = 7 }, +] \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.gfx.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.gfx.toml new file mode 100644 index 0000000000..f20713d337 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.gfx.toml @@ -0,0 +1,7 @@ +[cockroach_soldier_ranged] +id = 1554 +height = 15 +curve = 5 +end_height = 0 +delay = 10 +time_offset = 20 \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt new file mode 100644 index 0000000000..6cc3821dba --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt @@ -0,0 +1,13 @@ +package content.area.misthalin.edgeville.stronghold_of_player_safety + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.player.Player + +class CockroachSoldier : Script { + + init { + npcCondition("ranged_only") { target -> + target is Player && tile.distanceTo(target.tile) > 1 + } + } +} \ No newline at end of file From 0f2cf7b19f8c58f61b263922a8223854dc7ac907 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sat, 7 Feb 2026 08:29:04 +0200 Subject: [PATCH 05/17] Names for sounds --- .../StrongholdOfPlayerSafety.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt index 0289328b77..311aba7c43 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt @@ -6,6 +6,7 @@ import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.obj.replace import world.gregs.voidps.type.Tile +import world.gregs.voidps.engine.entity.character.areaSound class StrongholdOfPlayerSafety : Script { @@ -25,8 +26,11 @@ class StrongholdOfPlayerSafety : Script { } objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_closed") { (target) -> arriveDelay() - anim("8804") - target.anim("8802") + anim("pull_ground_lever") + target.anim("lever_down") + areaSound("lever", target.tile) + delay(2) + areaSound("unlock", target.tile) delay(3) target.replace("stronghold_of_player_safety_an_old_lever_opened") set("stronghold_of_player_safety_lever", true) @@ -34,8 +38,11 @@ class StrongholdOfPlayerSafety : Script { } objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_opened") { (target) -> arriveDelay() - anim("8805") - target.anim("8803") + anim("push_ground_lever") + target.anim("lever_up") + areaSound("lever", target.tile) + delay(1) + areaSound("unlock", target.tile) delay(2) target.replace("stronghold_of_player_safety_an_old_lever_closed") set("stronghold_of_player_safety_lever", false) From 3f9f354ce64ba25047e55e3b05f29966244014dc Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sat, 7 Feb 2026 22:47:22 +0200 Subject: [PATCH 06/17] Made changes to poster and added more dialogue to guard --- .../misthalin/edgeville/edgeville.teles.toml | 5 -- ...tronghold_of_player_safety.obj-spawns.toml | 3 - .../stronghold_of_player_safety.objs.toml | 8 +-- .../stronghold_of_player_safety.varbits.toml | 5 ++ .../stronghold_of_player_safety.vars.toml | 4 ++ .../StrongholdOfPlayerSafety.kt | 6 ++ .../StrongholdOfPlayerSafetyGuard.kt | 62 ++++++++++++------- 7 files changed, 58 insertions(+), 35 deletions(-) delete mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.obj-spawns.toml diff --git a/data/area/misthalin/edgeville/edgeville.teles.toml b/data/area/misthalin/edgeville/edgeville.teles.toml index 5293c2869c..74256b1b70 100644 --- a/data/area/misthalin/edgeville/edgeville.teles.toml +++ b/data/area/misthalin/edgeville/edgeville.teles.toml @@ -140,11 +140,6 @@ option = "Pull" tile = { x = 3090, y = 3474 } to = { x = 3154, y = 3924 } -[stronghold_of_player_safety_jail_entrance_down] -option = "Use" -tile = { x = 3075, y = 3456 } -to = { x = 3082, y = 4229 } - [trapdoor_80_opened] option = "Climb-down" tile = { x = 3097, y = 3468 } diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.obj-spawns.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.obj-spawns.toml deleted file mode 100644 index 824dbc3fb6..0000000000 --- a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.obj-spawns.toml +++ /dev/null @@ -1,3 +0,0 @@ -spawns = [ - { id = "player_safety_poster", x = 3077, y = 4235, type = 4, rotation = 0}, -] \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml index 5fa8a65ec0..5dbcada5de 100644 --- a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml @@ -1,3 +1,7 @@ +[player_safety_poster_without_entrance] +id = 29585 +examine = "A pin-up gublinch. Gross!" + [player_safety_poster] id = 29586 examine = "It looks like there's a small hole in the centre of this poster." @@ -86,10 +90,6 @@ examine = "Yuck. They are covered in bug slime." id = 29729 examine = "I wonder where this leads?" -[stronghold_of_player_safety_an_old_lever_closed] -id = 29730 -examine = "I wonder what it does." - [stronghold_of_player_safety_an_old_lever_opened] id = 29731 examine = "I wonder what it does." diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml index 06b96ea957..f0b5207d24 100644 --- a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.varbits.toml @@ -6,4 +6,9 @@ format = "boolean" [stronghold_of_player_safety_lever] id = 4500 persist = true +format = "boolean" + +[stronghold_of_player_safety_poster] +id = 6278 +persist = true format = "boolean" \ No newline at end of file diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml index 6a0f4b6442..05b984714f 100644 --- a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.vars.toml @@ -1,3 +1,7 @@ [safety_rope_climbed] format = "boolean" +persist = true + +[safety_prison_guard_talked] +format = "boolean" persist = true \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt index 311aba7c43..0f909f65b4 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt @@ -12,9 +12,15 @@ class StrongholdOfPlayerSafety : Script { init { playerSpawn { + sendVariable("stronghold_of_player_safety_poster") sendVariable("stronghold_of_player_safety_lever") } + objectOperate("Use", "stronghold_of_player_safety_jail_entrance_down") { + tele(3082, 4229, 0) + set("stronghold_of_player_safety_poster", true) + } + objectOperate("Pull-back", "player_safety_poster") { statement("There appears to be a tunnel behind the poster.") tele(3140, 4230, 2) diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt index e62b784fdf..edd53c6456 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt @@ -10,37 +10,53 @@ import content.entity.player.dialogue.type.player import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.ui.closeDialogue import world.gregs.voidps.engine.client.ui.open +import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.queue.queue class StrongholdOfPlayerSafetyGuard : Script { init { npcOperate("Talk-to", "guard_stronghold_of_player_safety") { - npc("Can I help you?") - player("I hope so. What is this place?") - npc("Above us is the Misthalin Training Centre of Excellence, where young adventurers are taught things that will help keep themselves safe.") - npc("They say that hidden away somewhere here is the entrance to the old jail, which no doubt has fabulous treasures for those willing to search for them.") - npc("Together they're called the Stronghold of Player Safety, for historical reasons.") - player("So what do you do?") - npc("I guard this stairway to make sure that prospective students are ready, and to explain the Report Abusive function.") - choice { - option("What is this Report Abuse thing?") { - npc("Should you find a player who acts in a way that breaks one of our rules, you should report them.") - npc("Reporting is very simple and easy to do. Simply click the Report Abuse button at the bottom of the screen and you will be shown the following screens:") - open("report_abuse_select") - interfaceOpened("report_abuse_select") { - closeDialogue() + if (get("safety_prison_guard_talked", false)) { + npc("Hello again. Did you want me to tell you about the Report Abuse button?") + choice { + option("Yes, please.") { + reportAbuse() } - interfaceClosed("report_abuse_select") { - queue("guard_chat") { - npc("On the first page, simply enter the player's name in the box and then click 'Next'") - npc("On the following page, click on the offence that the player has commited.") - npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") - player("Thank you. I'll bear that in mind.") - closeDialogue() - } + option("No thanks.") + } + } else { + npc("Can I help you?") + player("I hope so. What is this place?") + npc("Above us is the Misthalin Training Centre of Excellence, where young adventurers are taught things that will help keep themselves safe.") + npc("They say that hidden away somewhere here is the entrance to the old jail, which no doubt has fabulous treasures for those willing to search for them.") + npc("Together they're called the Stronghold of Player Safety, for historical reasons.") + player("So what do you do?") + npc("I guard this stairway to make sure that prospective students are ready, and to explain the Report Abusive function.") + set("safety_prison_guard_talked", true) + choice { + option("What is this Report Abuse thing?") { + reportAbuse() } + option("That's interesting. Goodbye.") } - option("That's interesting. Goodbye.") + } + } + } + + suspend fun Player.reportAbuse() { + npc("Should you find a player who acts in a way that breaks one of our rules, you should report them.") + npc("Reporting is very simple and easy to do. Simply click the Report Abuse button at the bottom of the screen and you will be shown the following screens:") + open("report_abuse_select") + interfaceOpened("report_abuse_select") { + closeDialogue() + } + interfaceClosed("report_abuse_select") { + queue("guard_chat") { + npc("On the first page, simply enter the player's name in the box and then click 'Next'") + npc("On the following page, click on the offence that the player has commited.") + npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") + player("Thank you. I'll bear that in mind.") + closeDialogue() } } } From b1c06a20ffcbee49cf1108585144c796a54cc295 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sat, 7 Feb 2026 22:50:06 +0200 Subject: [PATCH 07/17] Added cockroach sounds and combat (took way too long to find sound ids) --- .../cockroach.combat.toml | 12 +++++++- .../cockroach.sounds.toml | 29 +++++++++++++++++++ .../CockroachSoldier.kt | 2 +- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.sounds.toml diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml index 15e1427598..3d8927a3f1 100644 --- a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.combat.toml @@ -1,32 +1,41 @@ [cockroach_drone] attack_speed = 4 defend_anim = "cokroach_drone_defend" +defend_sound = "cockroach_drone_defend" death_anim = "cockroach_drone_death" +death_sound = "cockroach_drone_death" [cockroach_drone.attack] anim = "cockroach_drone_attack" range = 1 target_hit = { offense = "melee", max = 20 } +target_sound = "cockroach_drone_attack" [cockroach_worker] defend_anim = "cockroach_worker_defend" +defend_sound = "cockroach_worker_defend" death_anim = "cockroach_worker_death" +death_sound = "cockroach_worker_death" attack_speed = 4 [cockroach_worker.attack] anim = "cockroach_worker_attack" range = 1 target_hit = { offense = "melee", max = 60 } +target_sound = "cockroach_worker_attack" [cockroach_soldier] defend_anim = "cockroach_soldier_defend" +defend_sound = "cockroach_soldier_defend" death_anim = "cockroach_soldier_death" +death_sound = "cockroach_soldier_death" attack_speed = 4 [cockroach_soldier.melee] anim = "cockroach_soldier_attack" -range = 1 +range = 2 target_hit = { offense = "melee", max = 90 } +target_sound = "cockroach_soldier_attack" [cockroach_soldier.ranged] @@ -37,3 +46,4 @@ projectile_origin_y = 1 projectile_origin_x = 1 target_hit = { offense = "range", max = 110 } condition = "ranged_only" +target_sound = "cockroach_soldier_range" diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.sounds.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.sounds.toml new file mode 100644 index 0000000000..fa07fdce99 --- /dev/null +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/cockroach.sounds.toml @@ -0,0 +1,29 @@ +[cockroach_worker_death] +id = 4546 + +[cockroach_drone_death] +id = 4547 + +[cockroach_drone_defend] +id = 4548 + +[cockroach_soldier_death] +id = 4549 + +[cockroach_drone_attack] +id = 4550 + +[cockroach_soldier_attack] +id = 4551 + +[cockroach_worker_defend] +id = 4552 + +[cockroach_worker_attack] +id = 4553 + +[cockroach_soldier_defend] +id = 4554 + +[cockroach_soldier_range] +id = 4555 \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt index 6cc3821dba..73f6e5cd6a 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt @@ -7,7 +7,7 @@ class CockroachSoldier : Script { init { npcCondition("ranged_only") { target -> - target is Player && tile.distanceTo(target.tile) > 1 + target is Player && tile.distanceTo(target.tile) > 2 } } } \ No newline at end of file From 889847fc4deba729a7d53e71a5bbf2c26d5e668c Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sat, 7 Feb 2026 22:50:25 +0200 Subject: [PATCH 08/17] Fix to mugger --- .../stronghold_of_player_safety.npcs.toml | 2 +- data/entity/npc/humanoid/mugger/mugger.combat.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml index dfb3014fce..60665ec2d7 100644 --- a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml +++ b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml @@ -61,7 +61,7 @@ att = 5 str = 5 def = 5 style = "crush" -max_hit_melee = 10 +combat_def = "mugger" drop_table = "mugger" examine = "He jumps out and attacks people." diff --git a/data/entity/npc/humanoid/mugger/mugger.combat.toml b/data/entity/npc/humanoid/mugger/mugger.combat.toml index 7117c08696..699f9a2ab3 100644 --- a/data/entity/npc/humanoid/mugger/mugger.combat.toml +++ b/data/entity/npc/humanoid/mugger/mugger.combat.toml @@ -9,4 +9,4 @@ death_sound = "mugger_death" range = 1 anim = "mugger_attack" target_sound = "mugger_attack" -target_hit = { offense = "slash", max = 1 } +target_hit = { offense = "slash", max = 10 } From 2068ff903c8d985154b8cd6af8a1e9e5c5970eff Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sat, 7 Feb 2026 22:50:47 +0200 Subject: [PATCH 09/17] Fix to lumbridge guard attackable animations --- .../misthalin/lumbridge/lumbridge.combat.toml | 18 ++++++++++++++---- .../misthalin/lumbridge/lumbridge.npcs.toml | 4 ++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/data/area/misthalin/lumbridge/lumbridge.combat.toml b/data/area/misthalin/lumbridge/lumbridge.combat.toml index 5a6c60680a..faac3fdf46 100644 --- a/data/area/misthalin/lumbridge/lumbridge.combat.toml +++ b/data/area/misthalin/lumbridge/lumbridge.combat.toml @@ -1,17 +1,27 @@ -[lumbridge_guardsman] -clone = "man" +[lumbridge_guardsman_attackable] attack_speed = 5 defend_anim = "sword_defend" +death_anim = "human_death" -[lumbridge_guardsman.melee] +[lumbridge_guardsman_attackable.melee] range = 1 anim = "sword_slash" target_hit = { offense = "slash", max = 16 } +[lumbridge_guardsman_attackable2] +attack_speed = 5 +defend_anim = "sword_defend" +death_anim = "human_death" + +[lumbridge_guardsman_attackable2.melee] +range = 1 +anim = "sword_lunge" +target_hit = { offense = "slash", max = 16 } + [farmer] -clone = "man" attack_speed = 6 defend_anim = "farmer_defend" +death_anim = "human_death" [farmer.melee] range = 1 diff --git a/data/area/misthalin/lumbridge/lumbridge.npcs.toml b/data/area/misthalin/lumbridge/lumbridge.npcs.toml index 20c73faf6a..4fde4f253d 100644 --- a/data/area/misthalin/lumbridge/lumbridge.npcs.toml +++ b/data/area/misthalin/lumbridge/lumbridge.npcs.toml @@ -312,7 +312,7 @@ id = 12367 hitpoints = 100 att = 4 def = 4 -combat_def = "lumbridge_guardsman" +combat_def = "lumbridge_guardsman_attackable" categories = ["human"] hunt_mode = "aggressive_npcs" respawn_delay = 35 @@ -324,7 +324,7 @@ id = 12368 hitpoints = 100 att = 4 def = 4 -combat_def = "lumbridge_guardsman" +combat_def = "lumbridge_guardsman_attackable2" categories = ["human"] hunt_mode = "aggressive_npcs" respawn_delay = 35 From 08f6301e1fe627fa08c90f916bfad99efc090b1b Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sat, 7 Feb 2026 23:00:35 +0200 Subject: [PATCH 10/17] Added combat def to soldier --- .../stronghold_of_player_safety.npcs.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml index 60665ec2d7..196c135c78 100644 --- a/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml +++ b/data/area/misthalin/barbarian_village/stronghold_of_player_safety/stronghold_of_player_safety.npcs.toml @@ -53,6 +53,7 @@ categories = ["cockroaches"] examine = "Euww! A giant bug." respawn_delay = 60 drop_table = "cockroach_soldier" +combat_def = "cockroach_soldier" [mugger_stronghold_of_player_safety] id = 7161 From 10f60e97e24e5bc9dcfaf9ed87a3f98300d5a645 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sat, 7 Feb 2026 23:04:52 +0200 Subject: [PATCH 11/17] Spotless --- .../edgeville/stronghold_of_player_safety/CockroachSoldier.kt | 2 +- .../stronghold_of_player_safety/StrongholdOfPlayerSafety.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt index 73f6e5cd6a..4081bc2b39 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/CockroachSoldier.kt @@ -10,4 +10,4 @@ class CockroachSoldier : Script { target is Player && tile.distanceTo(target.tile) > 2 } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt index 0f909f65b4..93a93fe918 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt @@ -3,10 +3,10 @@ package content.area.misthalin.edgeville.stronghold_of_player_safety import content.entity.player.dialogue.type.statement import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.areaSound import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.obj.replace import world.gregs.voidps.type.Tile -import world.gregs.voidps.engine.entity.character.areaSound class StrongholdOfPlayerSafety : Script { From 04ad65fec3d3f4c65b645c0668cd04e50be43946 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sun, 8 Feb 2026 11:16:17 +0200 Subject: [PATCH 12/17] Added delays to objects --- .../StrongholdOfPlayerSafety.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt index 93a93fe918..b9011f3d9e 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt @@ -17,16 +17,19 @@ class StrongholdOfPlayerSafety : Script { } objectOperate("Use", "stronghold_of_player_safety_jail_entrance_down") { + arriveDelay() tele(3082, 4229, 0) set("stronghold_of_player_safety_poster", true) } - objectOperate("Pull-back", "player_safety_poster") { + objectOperate("Pull-back", "player_safety_poster") { (target) -> + walkToDelay(target.tile) statement("There appears to be a tunnel behind the poster.") tele(3140, 4230, 2) } - objectOperate("Climb", "stronghold_of_player_safety_rope") { + objectOperate("Climb", "stronghold_of_player_safety_rope") { (target) -> + walkToDelay(target.tile) set("safety_rope_climbed", true) tele(3077, 3462, 0) } @@ -56,6 +59,7 @@ class StrongholdOfPlayerSafety : Script { } objectOperate("Enter", "stronghold_of_player_safety_crevice") { + arriveDelay() if (get("safety_rope_climbed", false)) { tele(3157, 4279, 3) } else { @@ -63,6 +67,7 @@ class StrongholdOfPlayerSafety : Script { } } objectOperate("Open", "stronghold_of_player_safety_jail_door_locked") { (target) -> + arriveDelay() if (get("stronghold_of_player_safety_lever", false)) { when (target.tile) { Tile(3178, 4266, 0) -> tele(3177, 4269, 2) From 5433e2f4f8cb7c84aaaaf15703c9605bddaff2a2 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sun, 8 Feb 2026 16:37:44 +0200 Subject: [PATCH 13/17] Forgot to block entrance to the training center, only opens when talking to guard first time --- data/entity/obj/door/door.objs.toml | 4 ++-- .../StrongholdOfPlayerSafety.kt | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/data/entity/obj/door/door.objs.toml b/data/entity/obj/door/door.objs.toml index a25fc049d9..156be10daf 100644 --- a/data/entity/obj/door/door.objs.toml +++ b/data/entity/obj/door/door.objs.toml @@ -2955,10 +2955,10 @@ examine = "A strong metal door." id = 29320 examine = "A strong metal door." -[door_514_opened] +[misthalin_exam_door_opened] id = 29733 -[door_514_closed] +[misthalin_exam_door_closed] id = 29732 examine = "The door is closed." diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt index b9011f3d9e..fdbc9e4134 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt @@ -1,5 +1,6 @@ package content.area.misthalin.edgeville.stronghold_of_player_safety +import content.entity.obj.door.enterDoor import content.entity.player.dialogue.type.statement import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message @@ -16,6 +17,16 @@ class StrongholdOfPlayerSafety : Script { sendVariable("stronghold_of_player_safety_lever") } + objectOperate("Open", "misthalin_exam_door_closed") { (target) -> + // From wiki: The main door into the Training Centre, which is locked, preventing players from opening it from the outside, until they talk to the Guard in the jail and go through the entire conversation about reporting rule-breakers + if (get("safety_prison_guard_talked", false)) { + enterDoor(target) + } else { + message("The door is locked.") + return@objectOperate + } + } + objectOperate("Use", "stronghold_of_player_safety_jail_entrance_down") { arriveDelay() tele(3082, 4229, 0) @@ -33,6 +44,7 @@ class StrongholdOfPlayerSafety : Script { set("safety_rope_climbed", true) tele(3077, 3462, 0) } + objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_closed") { (target) -> arriveDelay() anim("pull_ground_lever") @@ -45,6 +57,7 @@ class StrongholdOfPlayerSafety : Script { set("stronghold_of_player_safety_lever", true) message("You hear cogs and gears moving and a distant unlocking sound.") } + objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_opened") { (target) -> arriveDelay() anim("push_ground_lever") @@ -66,6 +79,7 @@ class StrongholdOfPlayerSafety : Script { message("You're not sure if you should go in there; perhaps you should find another way in.") } } + objectOperate("Open", "stronghold_of_player_safety_jail_door_locked") { (target) -> arriveDelay() if (get("stronghold_of_player_safety_lever", false)) { From 85d79ca09fa89661356d04a100922d538b82c6d6 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Sat, 14 Feb 2026 18:07:35 +0200 Subject: [PATCH 14/17] Fixed all except the lever animation (maybe authentic varbit anim back in this revision?) --- .../stronghold_of_player_safety.objs.toml | 4 ++ .../stronghold_of_player_safety.teles.toml | 18 ++++----- data/entity/obj/stairs_ladders.objs.toml | 20 +++++----- .../free/swept_away/swept_away.teles.toml | 2 +- .../StrongholdOfPlayerSafety.kt | 15 +++---- .../StrongholdOfPlayerSafetyGuard.kt | 40 ++++++++++++------- .../StrongholdOfPlayerSafetyRewards.kt | 7 +--- 7 files changed, 58 insertions(+), 48 deletions(-) diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml index 5dbcada5de..36e4b54532 100644 --- a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.objs.toml @@ -90,6 +90,10 @@ examine = "Yuck. They are covered in bug slime." id = 29729 examine = "I wonder where this leads?" +[stronghold_of_player_safety_an_old_lever_closed] +id = 29730 +examine = "I wonder what it does." + [stronghold_of_player_safety_an_old_lever_opened] id = 29731 examine = "I wonder what it does." diff --git a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml index 7126eee8ad..9d5eb27d49 100644 --- a/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml +++ b/data/area/misthalin/edgeville/stronghold_of_player_safety/stronghold_of_player_safety.teles.toml @@ -15,47 +15,47 @@ option = "Pull" tile = { x = 3153, y = 3923 } to = { x = 2562, y = 3311 } -[29660] +[player_safety_stairs_1st_floor_up_north_west] option = "Climb-up" tile = { x = 3147, y = 4249, level = 1 } delta = { x = 3, y = 2, level = 1 } -[29659] +[player_safety_stairs_2nd_floor_down_north_west] option = "Climb-down" tile = { x = 3149, y = 4250, level = 2 } delta = { x = -3, y = -2, level = -1 } -[29656] +[player_safety_stairs_1st_floor_up_south_west] option = "Climb-up" tile = { x = 3147, y = 4246, level = 1 } delta = { x = 3, y = -2, level = 1 } -[29655] +[player_safety_stairs_2nd_floor_down_south_west] option = "Climb-down" tile = { x = 3149, y = 4245, level = 2 } delta = { x = -3, y = 2, level = -1 } -[29664] +[player_safety_stairs_1st_floor_up_south_east] option = "Climb-up" tile = { x = 3157, y = 4246, level = 1 } delta = { x = -3, y = -2, level = 1 } -[29663] +[player_safety_stairs_2nd_floor_down_south_east] option = "Climb-down" tile = { x = 3157, y = 4245, level = 2 } delta = { x = 3, y = 2, level = -1 } -[29668] +[player_safety_stairs_1st_floor_up_north_east] option = "Climb-up" tile = { x = 3157, y = 4249, level = 1 } delta = { x = -3, y = 2, level = 1 } -[29667] +[player_safety_stairs_2nd_floor_down_north_east] option = "Climb-down" tile = { x = 3157, y = 4250, level = 2 } delta = { x = 3, y = -2, level = -1 } -[29672] +[player_safety_stairs_2nd_floor_up_north] option = "Climb-up" tile = { x = 3171, y = 4273, level = 2 } delta = { x = -3, y = -2, level = 1 } diff --git a/data/entity/obj/stairs_ladders.objs.toml b/data/entity/obj/stairs_ladders.objs.toml index fa3de0b2f6..b3d9377f68 100644 --- a/data/entity/obj/stairs_ladders.objs.toml +++ b/data/entity/obj/stairs_ladders.objs.toml @@ -182,42 +182,42 @@ examine = "The guard is watching these stairs." id = 29592 examine = "They help one to rise up or down" -[29671] +[player_safety_stairs_3rd_floor_down_north] id = 29671 examine = "I wonder where they will take me." -[29672] +[player_safety_stairs_2nd_floor_up_north] id = 29672 examine = "I wonder where they will take me." -[29660] +[player_safety_stairs_1st_floor_up_north_west] id = 29660 examine = "I wonder where they will take me." -[29663] +[player_safety_stairs_2nd_floor_down_south_east] id = 29663 examine = "I wonder where they will take me." -[29664] +[player_safety_stairs_1st_floor_up_south_east] id = 29664 examine = "I wonder where they will take me." -[29667] +[player_safety_stairs_2nd_floor_down_north_east] id = 29667 examine = "I wonder where they will take me." -[29668] +[player_safety_stairs_1st_floor_up_north_east] id = 29668 examine = "I wonder where they will take me." -[29655] +[player_safety_stairs_2nd_floor_down_south_west] id = 29655 examine = "I wonder where they will take me." -[29656] +[player_safety_stairs_1st_floor_up_south_west] id = 29656 examine = "I wonder where they will take me." -[29659] +[player_safety_stairs_2nd_floor_down_north_west] id = 29659 examine = "I wonder where they will take me." \ No newline at end of file diff --git a/data/quest/free/swept_away/swept_away.teles.toml b/data/quest/free/swept_away/swept_away.teles.toml index e2bfa58746..0508dcff2c 100644 --- a/data/quest/free/swept_away/swept_away.teles.toml +++ b/data/quest/free/swept_away/swept_away.teles.toml @@ -1,5 +1,5 @@ # 12614 swept_away -[29671] +[player_safety_stairs_3rd_floor_down_north] option = "Climb-down" tile = { x = 3171, y = 4272, level = 3 } to = { x = 3174, y = 4273, level = 2 } diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt index fdbc9e4134..dd583c6615 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt @@ -6,7 +6,6 @@ import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.areaSound import world.gregs.voidps.engine.entity.character.move.tele -import world.gregs.voidps.engine.entity.obj.replace import world.gregs.voidps.type.Tile class StrongholdOfPlayerSafety : Script { @@ -47,28 +46,26 @@ class StrongholdOfPlayerSafety : Script { objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_closed") { (target) -> arriveDelay() - anim("pull_ground_lever") + animDelay("pull_ground_lever") target.anim("lever_down") areaSound("lever", target.tile) delay(2) areaSound("unlock", target.tile) - delay(3) - target.replace("stronghold_of_player_safety_an_old_lever_opened") - set("stronghold_of_player_safety_lever", true) + delay(1) message("You hear cogs and gears moving and a distant unlocking sound.") + set("stronghold_of_player_safety_lever", true) } objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_opened") { (target) -> arriveDelay() - anim("push_ground_lever") + animDelay("push_ground_lever") target.anim("lever_up") areaSound("lever", target.tile) delay(1) areaSound("unlock", target.tile) - delay(2) - target.replace("stronghold_of_player_safety_an_old_lever_closed") - set("stronghold_of_player_safety_lever", false) + delay(1) message("You hear cogs and gears moving and the sound of heavy locks falling into place.") + set("stronghold_of_player_safety_lever", false) } objectOperate("Enter", "stronghold_of_player_safety_crevice") { diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt index edd53c6456..8d94616fac 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt @@ -21,6 +21,19 @@ class StrongholdOfPlayerSafetyGuard : Script { choice { option("Yes, please.") { reportAbuse() + open("report_abuse_select") + interfaceOpened("report_abuse_select") { + closeDialogue() + } + interfaceClosed("report_abuse_select") { + queue("guard_chat") { + npc("On the first page, simply enter the player's name in the box and then click 'Next'") + npc("On the following page, click on the offence that the player has commited.") + npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") + player("Thank you. I'll bear that in mind.") + closeDialogue() + } + } } option("No thanks.") } @@ -36,28 +49,27 @@ class StrongholdOfPlayerSafetyGuard : Script { choice { option("What is this Report Abuse thing?") { reportAbuse() + open("report_abuse_select") + interfaceOpened("report_abuse_select") { + closeDialogue() + } + interfaceClosed("report_abuse_select") { + queue("guard_chat") { + npc("On the first page, simply enter the player's name in the box and then click 'Next'") + npc("On the following page, click on the offence that the player has commited.") + npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") + player("Thank you. I'll bear that in mind.") + closeDialogue() + } + } } option("That's interesting. Goodbye.") } } } } - suspend fun Player.reportAbuse() { npc("Should you find a player who acts in a way that breaks one of our rules, you should report them.") npc("Reporting is very simple and easy to do. Simply click the Report Abuse button at the bottom of the screen and you will be shown the following screens:") - open("report_abuse_select") - interfaceOpened("report_abuse_select") { - closeDialogue() - } - interfaceClosed("report_abuse_select") { - queue("guard_chat") { - npc("On the first page, simply enter the player's name in the box and then click 'Next'") - npc("On the following page, click on the offence that the player has commited.") - npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") - player("Thank you. I'll bear that in mind.") - closeDialogue() - } - } } } diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt index 4ae19334aa..f79a45f02d 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyRewards.kt @@ -1,15 +1,13 @@ package content.area.misthalin.edgeville.stronghold_of_player_safety -import content.entity.player.bank.bank +import content.entity.player.bank.ownsItem import content.entity.player.dialogue.type.item import content.entity.player.dialogue.type.skillLamp import content.entity.player.dialogue.type.statement import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.player.skill.exp.exp -import world.gregs.voidps.engine.entity.obj.replace import world.gregs.voidps.engine.inv.add -import world.gregs.voidps.engine.inv.holdsItem import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove @@ -27,7 +25,6 @@ class StrongholdOfPlayerSafetyRewards : Script { message("You don't have any room in your inventory for the treasure.") return@objectOperate } - target.replace("stronghold_of_player_safety_treasure_chest_opened") set("stronghold_of_player_safety_chest", true) inventory.add("coins", 10000) inventory.add("safety_gloves") @@ -46,7 +43,7 @@ class StrongholdOfPlayerSafetyRewards : Script { } objectOperate("Search", "stronghold_of_player_safety_treasure_chest_opened") { if (get("unlocked_emote_safety_first", false)) { - if (bank.contains("safety_gloves") || (inventory.contains("safety_gloves") || (holdsItem("safety_gloves")))) { + if (ownsItem("safety_gloves")) { statement("The chest appears to be empty.") message("The chest is already open and empty.") } else { From d80f3e1eabbaa394f668fa8d3eeb9556a6a5ad20 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:07:47 +0200 Subject: [PATCH 15/17] Removed lever animations --- .../stronghold_of_player_safety/StrongholdOfPlayerSafety.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt index dd583c6615..283c0e9eb8 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafety.kt @@ -21,7 +21,7 @@ class StrongholdOfPlayerSafety : Script { if (get("safety_prison_guard_talked", false)) { enterDoor(target) } else { - message("The door is locked.") + message("The door appears to be locked. You'll have to find another way in.") return@objectOperate } } @@ -47,7 +47,6 @@ class StrongholdOfPlayerSafety : Script { objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_closed") { (target) -> arriveDelay() animDelay("pull_ground_lever") - target.anim("lever_down") areaSound("lever", target.tile) delay(2) areaSound("unlock", target.tile) @@ -59,7 +58,6 @@ class StrongholdOfPlayerSafety : Script { objectOperate("Pull", "stronghold_of_player_safety_an_old_lever_opened") { (target) -> arriveDelay() animDelay("push_ground_lever") - target.anim("lever_up") areaSound("lever", target.tile) delay(1) areaSound("unlock", target.tile) From f487a858b3176ed1a6ff991072729720eb00d6f7 Mon Sep 17 00:00:00 2001 From: GregHib Date: Tue, 17 Feb 2026 23:52:16 +0000 Subject: [PATCH 16/17] Use dummy report abuse interface --- data/social/report/report.ifaces.toml | 13 ++++++- .../voidps/engine/queue/ActionPriority.kt | 2 +- .../StrongholdOfPlayerSafetyGuard.kt | 38 +++++-------------- .../content/social/report/ReportAbuse.kt | 2 +- 4 files changed, 23 insertions(+), 32 deletions(-) diff --git a/data/social/report/report.ifaces.toml b/data/social/report/report.ifaces.toml index 6d43bb5103..9a4eb0b0cc 100644 --- a/data/social/report/report.ifaces.toml +++ b/data/social/report/report.ifaces.toml @@ -1,6 +1,15 @@ -[report_abuse_name] +[report_abuse_player_security] id = 593 -[report_abuse_select] +[.name] +id = 32 + +[.abuse] +id = 97 + +[.ignore] +id = 110 + +[report_abuse] id = 594 diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionPriority.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionPriority.kt index 6ce01041e0..74dd347f4a 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionPriority.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionPriority.kt @@ -19,7 +19,7 @@ enum class ActionPriority( Strong(closeInterfaces = true), /** - * Closes interfaces and can't be paused or canceled by anything other than suspensions + * Closes interfaces and can't be paused or cancelled by anything other than suspensions */ Soft(closeInterfaces = true), } diff --git a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt index 8d94616fac..6fdf76aef6 100644 --- a/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt +++ b/game/src/main/kotlin/content/area/misthalin/edgeville/stronghold_of_player_safety/StrongholdOfPlayerSafetyGuard.kt @@ -8,10 +8,9 @@ import content.entity.player.dialogue.type.choice 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.client.ui.closeDialogue +import world.gregs.voidps.engine.client.ui.closeMenu import world.gregs.voidps.engine.client.ui.open import world.gregs.voidps.engine.entity.character.player.Player -import world.gregs.voidps.engine.queue.queue class StrongholdOfPlayerSafetyGuard : Script { init { @@ -21,19 +20,6 @@ class StrongholdOfPlayerSafetyGuard : Script { choice { option("Yes, please.") { reportAbuse() - open("report_abuse_select") - interfaceOpened("report_abuse_select") { - closeDialogue() - } - interfaceClosed("report_abuse_select") { - queue("guard_chat") { - npc("On the first page, simply enter the player's name in the box and then click 'Next'") - npc("On the following page, click on the offence that the player has commited.") - npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") - player("Thank you. I'll bear that in mind.") - closeDialogue() - } - } } option("No thanks.") } @@ -49,27 +35,23 @@ class StrongholdOfPlayerSafetyGuard : Script { choice { option("What is this Report Abuse thing?") { reportAbuse() - open("report_abuse_select") - interfaceOpened("report_abuse_select") { - closeDialogue() - } - interfaceClosed("report_abuse_select") { - queue("guard_chat") { - npc("On the first page, simply enter the player's name in the box and then click 'Next'") - npc("On the following page, click on the offence that the player has commited.") - npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") - player("Thank you. I'll bear that in mind.") - closeDialogue() - } - } } option("That's interesting. Goodbye.") } } } } + suspend fun Player.reportAbuse() { npc("Should you find a player who acts in a way that breaks one of our rules, you should report them.") npc("Reporting is very simple and easy to do. Simply click the Report Abuse button at the bottom of the screen and you will be shown the following screens:") + open("report_abuse_player_security") + npc("On the first page, simply enter the player's name in the box and then click 'Next'") + interfaces.sendVisibility("report_abuse_player_security", "name", false) + interfaces.sendVisibility("report_abuse_player_security", "abuse", true) + npc("On the following page, click on the offence that the player has commited.") + closeMenu() + npc("Finally, you'll be given the option to temporarily ignore the player you've reported. That will last until you next log out.") + player("Thank you. I'll bear that in mind.") } } diff --git a/game/src/main/kotlin/content/social/report/ReportAbuse.kt b/game/src/main/kotlin/content/social/report/ReportAbuse.kt index fbba2cc8c8..26650def55 100644 --- a/game/src/main/kotlin/content/social/report/ReportAbuse.kt +++ b/game/src/main/kotlin/content/social/report/ReportAbuse.kt @@ -13,7 +13,7 @@ class ReportAbuse : Script { message("Please finish what you're doing first.") return@interfaceOption } - open("report_abuse_select") + open("report_abuse_player_security") } } } From bcfd7d78179881f81fea560055b458ed427d714e Mon Sep 17 00:00:00 2001 From: GregHib Date: Wed, 18 Feb 2026 00:17:55 +0000 Subject: [PATCH 17/17] Fix weird object timing bug #893 --- game/src/test/kotlin/content/entity/obj/ObjectTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/test/kotlin/content/entity/obj/ObjectTest.kt b/game/src/test/kotlin/content/entity/obj/ObjectTest.kt index d742b8be74..47f30015fa 100644 --- a/game/src/test/kotlin/content/entity/obj/ObjectTest.kt +++ b/game/src/test/kotlin/content/entity/obj/ObjectTest.kt @@ -41,7 +41,7 @@ internal class ObjectTest : WorldTest() { val door = GameObjects.getLayer(Tile(3226, 3214), ObjectLayer.WALL)!! player.objectOption(door, "Open") - tick() + tick(2) handler.walk(Walk(3226, 3214), player) tick(2)