From e7a4f09a7defa3d17e6caa630738d25cca49b1f4 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:37:33 +0300 Subject: [PATCH 1/2] Barbarian village cleanup --- .../barbarian_outpost.npc-spawns.toml | 14 +- .../barbarian_outpost.npcs.toml | 30 ++-- .../barbarian_village.combat.toml | 96 ++++++++++++- .../barbarian_village.item-spawns.toml | 10 ++ .../barbarian_village.npc-spawns.toml | 33 ++--- .../barbarian_village.npcs.toml | 56 ++++---- .../barbarian_village.objs.toml | 128 ++++++++++++++++++ .../humanoid/Barbarian/barbarian.sounds.toml | 14 ++ .../npc/monster/unicorn/unicorn.anims.toml | 8 ++ .../npc/monster/unicorn/unicorn.combat.toml | 13 ++ .../npc/monster/unicorn/unicorn.sounds.toml | 8 ++ data/entity/obj/obj.sounds.toml | 3 + data/entity/player/combat/weapon.anims.toml | 6 + .../misthalin/barbarian_village/Barbarian.kt | 29 +++- .../BarbarianVillageChest.kt | 31 +++++ .../misthalin/barbarian_village/Hunding.kt | 38 ++++++ .../misthalin/barbarian_village/Litara.kt | 29 ++++ .../area/misthalin/barbarian_village/Peksa.kt | 24 ++++ .../kotlin/content/skill/crafting/Pottery.kt | 2 +- 19 files changed, 506 insertions(+), 66 deletions(-) create mode 100644 data/area/misthalin/barbarian_village/barbarian_village.item-spawns.toml create mode 100644 data/entity/npc/humanoid/Barbarian/barbarian.sounds.toml create mode 100644 data/entity/npc/monster/unicorn/unicorn.anims.toml create mode 100644 data/entity/npc/monster/unicorn/unicorn.combat.toml create mode 100644 data/entity/npc/monster/unicorn/unicorn.sounds.toml create mode 100644 game/src/main/kotlin/content/area/misthalin/barbarian_village/BarbarianVillageChest.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/barbarian_village/Hunding.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/barbarian_village/Litara.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/barbarian_village/Peksa.kt diff --git a/data/area/kandarin/barbarian_outpost/barbarian_outpost.npc-spawns.toml b/data/area/kandarin/barbarian_outpost/barbarian_outpost.npc-spawns.toml index b4159d44c6..0ffa85a566 100644 --- a/data/area/kandarin/barbarian_outpost/barbarian_outpost.npc-spawns.toml +++ b/data/area/kandarin/barbarian_outpost/barbarian_outpost.npc-spawns.toml @@ -7,13 +7,13 @@ spawns = [ { id = "fishing_spot_barbarian_outpost", x = 2498, y = 3547, members = true }, { id = "fishing_spot_barbarian_outpost", x = 2511, y = 3562, members = true }, { id = "fishing_spot_barbarian_outpost", x = 2516, y = 3575, members = true }, - { id = "barbarian_barbarian_outpost", x = 2546, y = 3560 }, - { id = "barbarian_barbarian_outpost_2", x = 2546, y = 3565 }, - { id = "barbarian_barbarian_outpost_3", x = 2549, y = 3566 }, - { id = "barbarian_barbarian_outpost_4", x = 2549, y = 3570 }, - { id = "barbarian_barbarian_outpost_5", x = 2544, y = 3577 }, - { id = "barbarian_barbarian_outpost_6", x = 2550, y = 3563 }, - { id = "barbarian_barbarian_outpost_7", x = 2548, y = 3558 }, + { id = "barbarian_alberich", x = 2546, y = 3560 }, + { id = "barbarian_fafner", x = 2546, y = 3565 }, + { id = "barbarian_fasolt", x = 2549, y = 3566 }, + { id = "barbarian_siegfried", x = 2549, y = 3570 }, + { id = "barbarian_minarch", x = 2544, y = 3577 }, + { id = "barbarian_brunnhilde", x = 2550, y = 3563 }, + { id = "barbarian_edelschwarz", x = 2548, y = 3558 }, { id = "kharid_scorpion_barbarian_outpost", x = 2552, y = 3570, members = true }, { id = "commander_connad_barbarian_outpost", x = 2536, y = 3577, members = true }, { id = "captain_cain_barbarian_outpost", x = 2534, y = 3568, members = true }, diff --git a/data/area/kandarin/barbarian_outpost/barbarian_outpost.npcs.toml b/data/area/kandarin/barbarian_outpost/barbarian_outpost.npcs.toml index 7f0e330b35..bf5d7b35d8 100644 --- a/data/area/kandarin/barbarian_outpost/barbarian_outpost.npcs.toml +++ b/data/area/kandarin/barbarian_outpost/barbarian_outpost.npcs.toml @@ -14,38 +14,38 @@ examine = "He maintains this agility course." [fishing_spot_barbarian_outpost] id = 2724 -[barbarian_barbarian_outpost] +[barbarian_alberich] id = 3246 hitpoints = 240 att = 15 str = 14 def = 10 style = "crush" -max_hit_melee = 30 attack_bonus = 9 respawn_delay = 50 drop_table = "barbarian_high" +combat_def = "barbarian_two_hand_axe_high" examine = "Alberich, a fierce barbarian warrior." -[barbarian_barbarian_outpost_2] +[barbarian_fafner] id = 3247 hitpoints = 180 att = 8 str = 7 def = 3 style = "crush" -max_hit_melee = 20 attack_bonus = 9 respawn_delay = 50 drop_table = "barbarian_low" +combat_def = "barbarian_two_hand_sword_low" examine = "Fafner, a tough barbarian warrior." -[barbarian_barbarian_outpost_3] +[barbarian_fasolt] id = 3248 -clone = "barbarian_barbarian_outpost" +clone = "barbarian_alberich" examine = "Fasolt, a strong barbarian warrior." -[barbarian_barbarian_outpost_4] +[barbarian_siegfried] id = 3250 hitpoints = 180 att = 8 @@ -56,21 +56,25 @@ max_hit_melee = 20 attack_bonus = 9 respawn_delay = 50 drop_table = "barbarian_low" +combat_def = "barbarian_two_hand_axe_low" examine = "Siegfried, a young guard in the Barbarian Village." -[barbarian_barbarian_outpost_5] +[barbarian_minarch] id = 3253 -clone = "barbarian_barbarian_outpost" +clone = "barbarian_alberich" +combat_def = "barbarian_two_hand_mace_high" examine = "Minarch, a barbarian who likes his beer." -[barbarian_barbarian_outpost_6] +[barbarian_brunnhilde] id = 3260 -clone = "barbarian_barbarian_outpost" +clone = "barbarian_alberich" +combat_def = "barbarian_spear_high" examine = "Brunnhilde, a fierce barbarian warrior." -[barbarian_barbarian_outpost_7] +[barbarian_edelschwarz] id = 3262 -clone = "barbarian_barbarian_outpost_4" +clone = "barbarian_siegfried" +combat_def = "barbarian_spear_low" examine = "Edelschwarz, a barbarian warrior with a spear." [kharid_scorpion_barbarian_outpost] diff --git a/data/area/misthalin/barbarian_village/barbarian_village.combat.toml b/data/area/misthalin/barbarian_village/barbarian_village.combat.toml index 447d355fe5..a445e25435 100644 --- a/data/area/misthalin/barbarian_village/barbarian_village.combat.toml +++ b/data/area/misthalin/barbarian_village/barbarian_village.combat.toml @@ -1,8 +1,102 @@ [haakon_the_champion] -clone = "human" +defend_anim = "human_defend" +defend_sound = "barbarian_defend" +death_anim = "human_death" +death_sound = "barbarian_death" attack_speed = 6 [haakon_the_champion.melee] clone = "human.melee" anim = "2h_smash" target_hit = { offense = "crush", max = 42 } + +[barbarian_two_hand_axe_low] +attack_speed = 6 +defend_anim = "barbarian_unarmed_defend" +defend_sound = "barbarian_defend" +death_anim = "human_death" +death_sound = "barbarian_death" + +[barbarian_two_hand_axe_low.melee] +range = 1 +anim = "dharoks_greataxe_smash" +target_sound = "dharok_axe_crush" +target_hit = { offense = "crush", max = 20 } + +[barbarian_two_hand_axe_high] +clone = "barbarian_two_hand_axe_low" + +[barbarian_two_hand_axe_high.melee] +range = 1 +anim = "dharoks_greataxe_smash" +target_sound = "dharok_axe_crush" +target_hit = { offense = "crush", max = 30 } + +[barbarian_two_hand_mace_low] +attack_speed = 6 +defend_anim = "hammer_defend" +defend_sound = "barbarian_defend" +death_anim = "human_death" +death_sound = "barbarian_death" + +[barbarian_two_hand_mace_low.melee] +range = 1 +anim = "hammer_pound" +target_sound = "warhammer_crush" +target_hit = { offense = "crush", max = 20 } + +[barbarian_two_hand_mace_high] +clone = "barbarian_two_hand_mace_low" + +[barbarian_two_hand_mace_high.melee] +range = 1 +anim = "hammer_pound" +target_sound = "warhammer_crush" +target_hit = { offense = "crush", max = 30 } + +[barbarian_two_hand_sword_low] +attack_speed = 6 +defend_anim = "1h_defend" +defend_sound = "barbarian_defend" +death_anim = "human_death" +death_sound = "barbarian_death" + +[barbarian_two_hand_sword_low.melee] +range = 1 +anim = "sword_slash" +target_hit = { offense = "crush", max = 20 } + +[barbarian_spear_low] +attack_speed = 6 +defend_anim = "spear_defend" +defend_sound = "barbarian_female_defend" +death_anim = "human_death" +death_sound = "woman_death" + +[barbarian_spear_low.melee] +range = 1 +anim = "spear_pound" +target_sound = "staff_stab" +target_hit = { offense = "crush", max = 20 } + +[barbarian_spear_high] +clone = "barbarian_spear_low" + +[barbarian_spear_high.melee] +range = 1 +anim = "spear_pound" +target_sound = "staff_stab" +target_hit = { offense = "crush", max = 30 } + +[barbarian_bow] +attack_speed = 4 +death_anim = "human_death" +death_sound = "barbarian_death" +defend_anim = "bow_defend" +defend_sound = "barbarian_defend" + +[barbarian_bow.range] +range = 8 +anim = "bow_accurate" +projectile = "bronze_arrow" +target_hit = { offense = "range", max = 10 } \ No newline at end of file diff --git a/data/area/misthalin/barbarian_village/barbarian_village.item-spawns.toml b/data/area/misthalin/barbarian_village/barbarian_village.item-spawns.toml new file mode 100644 index 0000000000..49fa681263 --- /dev/null +++ b/data/area/misthalin/barbarian_village/barbarian_village.item-spawns.toml @@ -0,0 +1,10 @@ +spawns = [ +# 12341 + { id = "empty_pot", x = 3074, y = 3431, delay = 100 }, + { id = "bronze_pickaxe", x = 3081, y = 3429, delay = 228 }, + { id = "beer", x = 3077, y = 3439, delay = 100 }, + { id = "cooked_meat", x = 3077, y = 3441, delay = 100 }, + { id = "beer", x = 3077, y = 3443, delay = 100 }, + { id = "cooked_meat", x = 3080, y = 3443, delay = 100 }, + { id = "beer", x = 3080, y = 3441, delay = 100 }, +] \ No newline at end of file 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 855810ee82..e5b97f69cd 100644 --- a/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml +++ b/data/area/misthalin/barbarian_village/barbarian_village.npc-spawns.toml @@ -11,23 +11,23 @@ spawns = [ { id = "haakon_the_champion", x = 3081, y = 3444 }, { id = "kjell", x = 3079, y = 3414, direction = "NORTH_EAST" }, { id = "tassie_slipcast", x = 3084, y = 3408, members = true }, - { id = "barbarian_barbarian_outpost", x = 3079, y = 3444 }, - { id = "barbarian_barbarian_outpost_2", x = 3079, y = 3409 }, - { id = "barbarian_barbarian_outpost_3", x = 3079, y = 3437 }, - { id = "barbarian_barbarian_village", x = 3078, y = 3436 }, - { id = "barbarian_barbarian_outpost_4", x = 3083, y = 3429 }, - { id = "barbarian_barbarian_village_2", x = 3080, y = 3423 }, - { id = "barbarian_barbarian_village_3", x = 3078, y = 3419 }, - { id = "barbarian_barbarian_outpost_5", x = 3075, y = 3445 }, + { id = "barbarian_alberich", x = 3079, y = 3444 }, + { id = "barbarian_fafner", x = 3079, y = 3409 }, + { id = "barbarian_fasolt", x = 3079, y = 3437 }, + { id = "barbarian_siegmund", x = 3078, y = 3436 }, + { id = "barbarian_siegfried", x = 3083, y = 3429 }, + { id = "barbarian_lydspor", x = 3080, y = 3423 }, + { id = "barbarian_hagen", x = 3078, y = 3419 }, + { id = "barbarian_minarch", x = 3075, y = 3445 }, { id = "hunding_barbarian_village", x = 3096, y = 3428, level = 2 }, - { id = "barbarian_barbarian_village_4", x = 3076, y = 3414 }, - { id = "barbarian_barbarian_village_5", x = 3085, y = 3409 }, - { id = "barbarian_barbarian_village_6", x = 3096, y = 3432 }, - { id = "barbarian_barbarian_village_7", x = 3086, y = 3440 }, - { id = "barbarian_barbarian_village_8", x = 3078, y = 3442 }, - { id = "barbarian_barbarian_outpost_6", x = 3078, y = 3440 }, - { id = "barbarian_barbarian_village_9", x = 3084, y = 3426 }, - { id = "barbarian_barbarian_outpost_7", x = 3077, y = 3422 }, + { id = "barbarian_wotan", x = 3076, y = 3414 }, + { id = "barbarian_acelin", x = 3085, y = 3409 }, + { id = "barbarian_adelino", x = 3096, y = 3432 }, + { id = "barbarian_adolpho", x = 3086, y = 3440 }, + { id = "barbarian_aitan", x = 3078, y = 3442 }, + { id = "barbarian_brunnhilde", x = 3078, y = 3440 }, + { id = "barbarian_gutrune", x = 3084, y = 3426 }, + { id = "barbarian_edelschwarz", x = 3077, y = 3422 }, { id = "barbarian_sieglinde", x = 3086, y = 3419 }, { id = "goblin_barbarian_village", x = 3126, y = 3431 }, { id = "goblin_barbarian_village_2", x = 3118, y = 3432 }, @@ -64,4 +64,5 @@ spawns = [ { 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 }, + { id = "unicorn", x = 3097, y = 3458 }, ] \ No newline at end of file diff --git a/data/area/misthalin/barbarian_village/barbarian_village.npcs.toml b/data/area/misthalin/barbarian_village/barbarian_village.npcs.toml index 8f5cb0f73e..43922a815f 100644 --- a/data/area/misthalin/barbarian_village/barbarian_village.npcs.toml +++ b/data/area/misthalin/barbarian_village/barbarian_village.npcs.toml @@ -91,79 +91,82 @@ examine = "His furs look very damp." id = 1793 examine = "A hard-working potter." -[barbarian_barbarian_village] +[barbarian_siegmund] id = 3249 hitpoints = 240 att = 15 str = 14 def = 10 -style = "crush" -max_hit_melee = 30 attack_bonus = 9 respawn_delay = 50 +combat_def = "barbarian_two_hand_mace_high" drop_table = "barbarian_high" examine = "Siegmund, a guard in the Barbarian Village." -[barbarian_barbarian_village_2] +##fun fact sword barbarians: patch 1 February 2011 (Update): +# +# Barbarians no longer swing two-handed swords with one hand. +#so authentic that they hit with their one hand +[barbarian_lydspor] id = 3251 hitpoints = 180 att = 8 str = 7 def = 3 style = "crush" -max_hit_melee = 20 attack_bonus = 9 respawn_delay = 50 +drop_table = "barbarian_low" +combat_def = "barbarian_two_hand_sword_low" examine = "Lydspor, a well-travelled barbarian warrior." -[barbarian_barbarian_village_3] +[barbarian_hagen] id = 3252 -clone = "barbarian_barbarian_village_2" +clone = "barbarian_lydspor" +combat_def = "barbarian_two_hand_axe_low" examine = "Hagen, a guard in the Barbarian Village." [hunding_barbarian_village] id = 3254 examine = "Likes a good fight." -[barbarian_barbarian_village_4] +[barbarian_wotan] id = 3255 -clone = "barbarian_barbarian_village_2" +clone = "barbarian_lydspor" +combat_def = "barbarian_two_hand_mace_low" examine = "Wotan, a sturdy barbarian warrior." -[barbarian_barbarian_village_5] +[barbarian_acelin] id = 3256 -clone = "barbarian_barbarian_village_2" +clone = "barbarian_lydspor" examine = "Acelin, a guard in the Barbarian Village." -[barbarian_barbarian_village_6] +[barbarian_adelino] id = 3257 -clone = "barbarian_barbarian_village_2" +clone = "barbarian_hagen" examine = "Adelino, a barbarian warrior with a big axe." -[barbarian_barbarian_village_7] +[barbarian_adolpho] id = 3258 -clone = "barbarian_barbarian_village_2" +clone = "barbarian_wotan" examine = "Adolpho, a barbarian warrior with a warhammer." -[barbarian_barbarian_village_8] +[barbarian_aitan] id = 3259 hitpoints = 240 att = 15 str = 3 def = 10 range = 15 -style = "range" -weapon_style = "bow" -ammo = "bronze_arrow" -attack_range = 8 -max_hit_range = 10 attack_bonus = 9 respawn_delay = 50 +combat_def = "barbarian_bow" +drop_table = "barbarian_high" examine = "Aitan, a barbarian archer." -[barbarian_barbarian_village_9] +[barbarian_gutrune] id = 3261 -clone = "barbarian_barbarian_village_2" +clone = "barbarian_sieglinde" examine = "Gutrune, a mighty barbarian warrior." [barbarian_sieglinde] @@ -172,10 +175,10 @@ hitpoints = 200 att = 6 str = 7 def = 3 -style = "crush" -max_hit_melee = 20 attack_bonus = 9 respawn_delay = 50 +combat_def = "barbarian_spear_low" +drop_table = "barbarian_low" examine = "Sieglinde, a muscular barbarian warrior." [goblin_barbarian_village] @@ -242,8 +245,7 @@ hitpoints = 190 att = 11 str = 13 def = 13 -style = "stab" -max_hit_melee = 20 +combat_def = "unicorn" respawn_delay = 90 drop_table = "unicorn" examine = "Horse with a horn." diff --git a/data/area/misthalin/barbarian_village/barbarian_village.objs.toml b/data/area/misthalin/barbarian_village/barbarian_village.objs.toml index 8f820cf399..192f1849e0 100644 --- a/data/area/misthalin/barbarian_village/barbarian_village.objs.toml +++ b/data/area/misthalin/barbarian_village/barbarian_village.objs.toml @@ -9,3 +9,131 @@ examine = "The entrance to the Stronghold of Security." [spinning_wheel_barbarian_village] id = 5707 examine = "Used for spinning thread." + +[barrel_barbarian_village] +id = 11589 +examine = "A wooden barrel for storage." + +[barrel_barbarian_village_2] +id = 364 +examine = "It's got ale in it." + +[barrel_barbarian_village_3] +id = 5698 +examine = "A wooden barrel for storage." + +[closed_chest_barbarian_village] +id = 375 +examine = "I wonder what's inside." + +[opened_chest_barbarian_village] +id = 378 +examine = "Perhaps I should search it." + +[boxes_barbarian_village] +id = 361 +examine = "A pile of boxes for storage." + +[sacks_barbarian_village] +id = 365 +examine = "These may have something in them." + +[sacks_barbarian_village_2] +id = 7512 +examine = "A pair of sacks." + +[stool_barbarian_village] +id = 1102 +examine = "Good for sitting on." + +[wooden_pieces_barbarian_village] +id = 28645 +examine = "These are never going to be fixed." + +[shelves_barbarian_village] +id = 1015 +examine = "Storage for all needs." + +[shelves_barbarian_village_2] +id = 1016 +examine = "Storage for all needs." + +[shelves_barbarian_village_3] +id = 1017 +examine = "Storage for all needs." + +[shelves_barbarian_village_4] +id = 1018 +examine = "Storage for all needs." + +[shelves_barbarian_village_5] +id = 5704 +examine = "Storage for all needs." + +[shelves_barbarian_village_6] +id = 5705 +examine = "Storage for all needs." + +[shelves_barbarian_village_7] +id = 5706 +examine = "Storage for all needs." + +[anvil_barbarian_village] +id = 25349 +examine = "A barbarian's anvil" + +[stool_barbarian_viallge] +id = 5701 +examine = "A wooden stool." + +[small_table_barbarian_village] +id = 5703 +examine = "A small wooden table." + +[counter_barbarian_village] +id = 11626 +examine = "Items are for sale here." + +[crates_barbarian_village] +id = 5699 +examine = "Convenient for storage." + +[crates_barbarian_village_2] +id = 11600 +examine = "Convenient for storage." + +[bed_barbarian_village] +id = 422 +examine = "Technically a bed." + +[bear_rug_barbarian_village] +id = 5712 +examine = "Roooooaarrrrr!" + +[bear_rug_barbarian_village_2] +id = 5713 +examine = "Roooooaarrrrr!" + +[bear_rug_barbarian_village_3] +id = 5714 +examine = "Roooooaarrrrr!" + +[bear_rug_barbarian_village_4] +id = 5715 +examine = "Roooooaarrrrr!" + +[bear_rug_barbarian_village_5] +id = 5716 +examine = "Roooooaarrrrr!" + +[bear_rug_barbarian_village_6] +id = 5717 +examine = "Roooooaarrrrr!" + +[bulls_head_barbarian_village] +id = 906 +examine = "Looks like the bull lost." + +[table_barbarian_village] +id = 5702 +examine = "Generally used for putting things on." \ No newline at end of file diff --git a/data/entity/npc/humanoid/Barbarian/barbarian.sounds.toml b/data/entity/npc/humanoid/Barbarian/barbarian.sounds.toml new file mode 100644 index 0000000000..e347c7a3e2 --- /dev/null +++ b/data/entity/npc/humanoid/Barbarian/barbarian.sounds.toml @@ -0,0 +1,14 @@ +[barbarian_defend] +id = 504 + +[barbarian_death] +id = 502 + +[barbarian_female_defend] +id = 501 + +[staff_stab] +id = 2562 + +[warhammer_crush] +id = 2567 \ No newline at end of file diff --git a/data/entity/npc/monster/unicorn/unicorn.anims.toml b/data/entity/npc/monster/unicorn/unicorn.anims.toml new file mode 100644 index 0000000000..1c91930537 --- /dev/null +++ b/data/entity/npc/monster/unicorn/unicorn.anims.toml @@ -0,0 +1,8 @@ +[unicorn_death] +id = 6377 + +[unicorn_attack] +id = 6376 + +[unicorn_defend] +id = 6375 diff --git a/data/entity/npc/monster/unicorn/unicorn.combat.toml b/data/entity/npc/monster/unicorn/unicorn.combat.toml new file mode 100644 index 0000000000..1ef825267d --- /dev/null +++ b/data/entity/npc/monster/unicorn/unicorn.combat.toml @@ -0,0 +1,13 @@ +[unicorn] +attack_speed = 4 +retreat_range = 8 +defend_anim = "unicorn_defend" +defend_sound = "unicorn_defend" +death_anim = "unicorn_death" +death_sound = "unicorn_death" + +[unicorn.melee] +range = 1 +anim = "unicorn_attack" +target_sound = "unicorn_attack" +target_hit = { offense = "stab", max = 20 } \ No newline at end of file diff --git a/data/entity/npc/monster/unicorn/unicorn.sounds.toml b/data/entity/npc/monster/unicorn/unicorn.sounds.toml new file mode 100644 index 0000000000..456d807f5b --- /dev/null +++ b/data/entity/npc/monster/unicorn/unicorn.sounds.toml @@ -0,0 +1,8 @@ +[unicorn_death] +id = 5496 + +[unicorn_attack] +id = 5499 + +[unicorn_defend] +id = 5495 \ No newline at end of file diff --git a/data/entity/obj/obj.sounds.toml b/data/entity/obj/obj.sounds.toml index 590e16b869..71a851ebe6 100644 --- a/data/entity/obj/obj.sounds.toml +++ b/data/entity/obj/obj.sounds.toml @@ -1,3 +1,6 @@ +[chest_close] +id = 51 + [chest_open] id = 52 diff --git a/data/entity/player/combat/weapon.anims.toml b/data/entity/player/combat/weapon.anims.toml index 3656687845..828cf2a4bd 100644 --- a/data/entity/player/combat/weapon.anims.toml +++ b/data/entity/player/combat/weapon.anims.toml @@ -82,6 +82,9 @@ id = 390 [sword_defend] id = 388 +[1h_defend] +id = 387 + [2h_chop] id = 7041 @@ -94,6 +97,9 @@ id = 7042 [2h_block] id = 7041 +[2h_battle_axe_pummel] +id = 7048 + [2h_defend] id = 7050 diff --git a/game/src/main/kotlin/content/area/misthalin/barbarian_village/Barbarian.kt b/game/src/main/kotlin/content/area/misthalin/barbarian_village/Barbarian.kt index 4ca0df5d4a..7a6b0bd0e5 100644 --- a/game/src/main/kotlin/content/area/misthalin/barbarian_village/Barbarian.kt +++ b/game/src/main/kotlin/content/area/misthalin/barbarian_village/Barbarian.kt @@ -1,14 +1,17 @@ package content.area.misthalin.barbarian_village +import content.entity.combat.inCombat import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Quiz 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.timer.Timer import world.gregs.voidps.type.random class Barbarian : Script { init { - npcOperate("Talk-to", "barbarian_barbarian_village*") { + npcOperate("Talk-to", "barbarian_*") { (target) -> when (random.nextInt(5)) { 0 -> npc("Wanna fight?") 1 -> npc("Ah, you come for fight, ja?") @@ -17,6 +20,30 @@ class Barbarian : Script { 4 -> npc("What you want?") else -> npc("Go Away!") } + target.interactPlayer(this, "Attack") + } + npcCombatStart { + if (!id.startsWith("barbarian")) { + return@npcCombatStart + } + softTimers.start("barbarian_war_cry") + } + + npcTimerStart("barbarian_war_cry") { + random.nextInt(5, 20) + } + + npcTimerTick("barbarian_war_cry") { + if (!inCombat) { + softTimers.stop("barbarian_war_cry") + return@npcTimerTick Timer.CANCEL + } + say("FOR GUNNAR!") + Timer.CONTINUE + } + + npcDeath { + softTimers.stop("barbarian_war_cry") } } } diff --git a/game/src/main/kotlin/content/area/misthalin/barbarian_village/BarbarianVillageChest.kt b/game/src/main/kotlin/content/area/misthalin/barbarian_village/BarbarianVillageChest.kt new file mode 100644 index 0000000000..742208a864 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/barbarian_village/BarbarianVillageChest.kt @@ -0,0 +1,31 @@ +package content.area.misthalin.barbarian_village + +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.obj.replace +import world.gregs.voidps.engine.timer.toTicks +import java.util.concurrent.TimeUnit + +class BarbarianVillageChest : Script { + + init { + objectOperate("Open", "closed_chest_barbarian_village") { (target) -> + anim("open_chest") + areaSound("chest_open", target.tile) + delay(1) + target.replace(target.id.replace("closed", "opened"), ticks = TimeUnit.MINUTES.toTicks(3)) + } + + objectOperate("Shut", "opened_chest_barbarian_village") { (target) -> + anim("close_chest") + areaSound("chest_close", target.tile) + delay(1) + target.replace(target.id.replace("opened", "closed"), ticks = TimeUnit.MINUTES.toTicks(3)) + } + + objectOperate("Search", "opened_chest_barbarian_village") { + message("You search the chest but find nothing.") + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/barbarian_village/Hunding.kt b/game/src/main/kotlin/content/area/misthalin/barbarian_village/Hunding.kt new file mode 100644 index 0000000000..646eb29875 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/barbarian_village/Hunding.kt @@ -0,0 +1,38 @@ +package content.area.misthalin.barbarian_village + +import content.entity.player.dialogue.* +import content.entity.player.dialogue.type.* +import world.gregs.voidps.engine.Script + +class Hunding : Script { + + // Had to use Rs3 source for this. I could not find the 2011 source so not sure if authentic. Osrs had the old Gunthor and not Haakon, which they replaced when Gunnar's Ground quest was released. + init { + npcOperate("Talk-to", "hunding_barbarian_village") { + npc("What business do you have in our village, outerlander?") + choice { + option("I'm just exploring.") { + npc("What have you found is powerful tribe to make your soft people tremble.") + choice { + option("Tell me about your people.") { + npc("We are the Fremennik. We came from the west a century ago in righteous war to purge the heresy of magic form this decadent land.") + npc("Now we await the call to march to war once more! We are always ready for that day!") + } + option("You look like primitive savages.") { + npc("You look like an arrogant fool. Which of us is the primitive.") + } + goodBye() + } + } + option("I'm looking for a fight!") { + npc("Go down to the longhouse and you'll find all the fighting you can handle, outerlander. Haakon will give you a rousing welcome!") + } + goodBye() + } + } + } + + fun ChoiceOption.goodBye() { + option("Goodbye.") + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/barbarian_village/Litara.kt b/game/src/main/kotlin/content/area/misthalin/barbarian_village/Litara.kt new file mode 100644 index 0000000000..ad73b35eeb --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/barbarian_village/Litara.kt @@ -0,0 +1,29 @@ +package content.area.misthalin.barbarian_village + +import content.entity.player.dialogue.* +import content.entity.player.dialogue.type.* +import world.gregs.voidps.engine.Script + +class Litara : Script { + + // https://www.youtube.com/watch?v=SDxhq3iCiH0 + init { + npcOperate("Talk-to", "litara_barbarian_village") { + npc("Hello there. You look lost - are you okay?") + choice { + option("I'm looking for a stronghold, or something.") { + npc("Ahh, the Stronghold of Security. It's down there.") + statement("Litara points to the hole in the ground that looks like you could squeeze through.") + player("Looks kind of..deep and dark.") + npc("Yeah, tell that to my brother. He still hasn't come back.") + player("Your brother?") + npc("He's an explorer too. When the miner fell down that hole he'd made and came back babbling about treasure, my brother went to explore. No one has seen him since.") + player("Oh, that's not good.") + npc("Lots of people have been down there, but none of them have seen him. Let me know if you do, will you?") + player("I'll certainly keep my eyes open.") + } + option("I'm fine, just passing through.") + } + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/barbarian_village/Peksa.kt b/game/src/main/kotlin/content/area/misthalin/barbarian_village/Peksa.kt new file mode 100644 index 0000000000..e45792e5da --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/barbarian_village/Peksa.kt @@ -0,0 +1,24 @@ +package content.area.misthalin.barbarian_village + +import content.entity.npc.shop.openShop +import content.entity.player.dialogue.* +import content.entity.player.dialogue.type.* +import world.gregs.voidps.engine.Script + +class Peksa : Script { + + // Both Rs3 / OSRS had same dialogue + init { + npcOperate("Talk-to", "peksa_barbarian_village") { + npc("Are you interested in buying or selling a helmet?") + choice { + option("I could be, yes") { + openShop("peksas_helmet_shop") + } + option("No, I'll pass on that.") { + npc("Well, come back if you change your mind.") + } + } + } + } +} diff --git a/game/src/main/kotlin/content/skill/crafting/Pottery.kt b/game/src/main/kotlin/content/skill/crafting/Pottery.kt index 8c4114838f..27e2c1971a 100644 --- a/game/src/main/kotlin/content/skill/crafting/Pottery.kt +++ b/game/src/main/kotlin/content/skill/crafting/Pottery.kt @@ -25,7 +25,7 @@ class Pottery : Script { } itemOnObjectOperate(obj = "pottery_oven*", arrive = false) { (target, item) -> - if (!item.def.contains("pottery")) { + if (!item.id.contains("unfired")) { return@itemOnObjectOperate } if (item.id != "soft_clay") { From d6e1b389d307e4f5b6d0eb92492027e1c065ce33 Mon Sep 17 00:00:00 2001 From: M1krofin <207991987+M1krofin@users.noreply.github.com> Date: Wed, 22 Apr 2026 19:19:21 +0300 Subject: [PATCH 2/2] Fixed pottery --- game/src/main/kotlin/content/skill/crafting/Pottery.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/game/src/main/kotlin/content/skill/crafting/Pottery.kt b/game/src/main/kotlin/content/skill/crafting/Pottery.kt index 27e2c1971a..c5ce2b608c 100644 --- a/game/src/main/kotlin/content/skill/crafting/Pottery.kt +++ b/game/src/main/kotlin/content/skill/crafting/Pottery.kt @@ -25,9 +25,7 @@ class Pottery : Script { } itemOnObjectOperate(obj = "pottery_oven*", arrive = false) { (target, item) -> - if (!item.id.contains("unfired")) { - return@itemOnObjectOperate - } + Rows.getOrNull("pottery.${item.id}") ?: return@itemOnObjectOperate if (item.id != "soft_clay") { make(target, "cook_range", item) }