diff --git a/.github/workflows/test-with-coverage.yml b/.github/workflows/test-with-coverage.yml index fd225ad30d..2b4cd92cd2 100644 --- a/.github/workflows/test-with-coverage.yml +++ b/.github/workflows/test-with-coverage.yml @@ -76,6 +76,8 @@ jobs: - name: Run all tests if: steps.check-cache-files.outputs.cache_exists == 'true' run: ./gradlew test + env: + GRADLE_OPTS: -Xmx5g -Xms1g -XX:MaxMetaspaceSize=1g - name: Run unit tests if: steps.check-cache-files.outputs.cache_exists != 'true' diff --git a/build.gradle.kts b/build.gradle.kts index 2044103ed7..822e0eafca 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -51,7 +51,7 @@ allprojects { if (name != "tools") { tasks.test { - maxHeapSize = "4096m" + maxHeapSize = "5120m" useJUnitPlatform() failFast = true testLogging { diff --git a/config/src/main/kotlin/world/gregs/config/ConfigReader.kt b/config/src/main/kotlin/world/gregs/config/ConfigReader.kt index 88307ed446..59beddb8a6 100644 --- a/config/src/main/kotlin/world/gregs/config/ConfigReader.kt +++ b/config/src/main/kotlin/world/gregs/config/ConfigReader.kt @@ -91,9 +91,12 @@ class ConfigReader( } private fun skipEquals() { + var found = false while (byte == SPACE || byte == TAB || byte == EQUALS) { + found = found || byte == EQUALS byte = input.read() } + require(found) { "Expected equals after key. ${exception()}" } } /** diff --git a/config/src/test/kotlin/world/gregs/config/ConfigReaderTest.kt b/config/src/test/kotlin/world/gregs/config/ConfigReaderTest.kt index b83870a69c..4c22ada931 100644 --- a/config/src/test/kotlin/world/gregs/config/ConfigReaderTest.kt +++ b/config/src/test/kotlin/world/gregs/config/ConfigReaderTest.kt @@ -94,15 +94,22 @@ internal class ConfigReaderTest { @Test fun `Read key`() { - Config.stringReader("bare-key") { + Config.stringReader("bare_key ") { assertTrue(nextPair()) - assertEquals("bare-key", key()) + val exception = assertThrows { + key() + } + assertEquals("Expected equals after key. line=1 char=''", exception.message) + } + Config.stringReader("bare_key = 0") { + assertTrue(nextPair()) + assertEquals("bare_key", key()) } - Config.stringReader("\"quoted \\n key\"") { + Config.stringReader("\"quoted \\n key\" = 0") { assertTrue(nextPair()) assertEquals("quoted \\n key", key()) } - Config.stringReader("'literal \n key'") { + Config.stringReader("'literal \n key' = 0") { assertTrue(nextPair()) assertEquals("literal \n key", key()) } diff --git a/data/activity/event/easter/easter.npcs.toml b/data/activity/event/easter/easter.npcs.toml index e39323a18a..a2d061f62c 100644 --- a/data/activity/event/easter/easter.npcs.toml +++ b/data/activity/event/easter/easter.npcs.toml @@ -15,7 +15,7 @@ examine = "A cute, cuddly, little squirrel - with teeth." [goblin_courier] id = 9683 -categories = ["goblin"] +categories = ["goblins"] examine = "An ugly green creature. He seems to be waiting for something." [a_strange_courier] @@ -35,7 +35,7 @@ examine = "A squirrel wearing weird face paint." [easter_bunny_2010] id = 9687 -categories = ["bird"] +categories = ["rabbit"] examine = "The loveable protector of Easter." [easta_buni_spawn] @@ -43,5 +43,5 @@ id = 9688 [easter_bird_2010] id = 9696 -categories = ["bird"] +categories = ["birds"] examine = "The bird looks awake and alert." \ No newline at end of file diff --git a/data/area/asgarnia/port_sarim/port_sarim.npc-spawns.toml b/data/area/asgarnia/port_sarim/port_sarim.npc-spawns.toml index b6516a2810..4e3cea0524 100644 --- a/data/area/asgarnia/port_sarim/port_sarim.npc-spawns.toml +++ b/data/area/asgarnia/port_sarim/port_sarim.npc-spawns.toml @@ -13,6 +13,9 @@ spawns = [ { id = "rat", x = 3011, y = 3189 }, { id = "rat", x = 3013, y = 3183 }, { id = "rat", x = 3015, y = 3182 }, + { id = "trader_crewmember_blue", x = 3039, y = 3193, members = true }, + { id = "trader_crewmember_hat", x = 3042, y = 3192, members = true }, + { id = "trader_stan", x = 3033, y = 3192, members = true }, # 12082 { id = "man", x = 3017, y = 3238 }, { id = "bartender_rusty_anchor", x = 3045, y = 3257 }, diff --git a/data/area/kandarin/catherby/catherby.npc-spawns.toml b/data/area/kandarin/catherby/catherby.npc-spawns.toml index 801ec10d65..26fd48de19 100644 --- a/data/area/kandarin/catherby/catherby.npc-spawns.toml +++ b/data/area/kandarin/catherby/catherby.npc-spawns.toml @@ -8,8 +8,8 @@ spawns = [ { id = "banker_4", x = 2811, y = 3443, direction = "SOUTH", members = true }, { id = "candle_maker", x = 2799, y = 3438, members = true }, { id = "arheins", x = 2803, y = 3430, members = true }, - { id = "trader_crewmember_1", x = 2794, y = 3414, members = true }, - { id = "trader_crewmember_2", x = 2795, y = 3414, members = true }, + { id = "trader_crewmember_hat", x = 2794, y = 3414, members = true }, + { id = "trader_crewmember_blue", x = 2795, y = 3414, members = true }, { id = "sir_mordred", x = 1695, y = 4258, level = 2, members = true }, { id = "renegade_knight", x = 2766, y = 3397, members = true }, { id = "renegade_knight", x = 2767, y = 3399, members = true }, @@ -19,7 +19,6 @@ spawns = [ { id = "renegade_knight", x = 2770, y = 3396, level = 1, members = true }, { id = "renegade_knight", x = 2771, y = 3402, level = 1, members = true }, { id = "renegade_knight", x = 2774, y = 3405, level = 1, members = true }, - # 11317 { id = "man_3", x = 2818, y = 3443, members = true }, { id = "woman_2", x = 2817, y = 3447, members = true }, diff --git a/data/area/kandarin/feldip_hills/oo_glog/oo_glog.npc-spawns.toml b/data/area/kandarin/feldip_hills/oo_glog/oo_glog.npc-spawns.toml index 60b4d7568b..9c7d6fd5ba 100644 --- a/data/area/kandarin/feldip_hills/oo_glog/oo_glog.npc-spawns.toml +++ b/data/area/kandarin/feldip_hills/oo_glog/oo_glog.npc-spawns.toml @@ -40,4 +40,6 @@ spawns = [ { id = "penelope_platypus_3", x = 2610, y = 2865, members = true }, { id = "peter_platypus_3", x = 2611, y = 2862, members = true }, { id = "peanut_platypus_3", x = 2611, y = 2864, members = true }, + { id = "trader_crewmember_black", x = 2619, y = 2856, members = true }, + { id = "trader_crewmember_pink", x = 2621, y = 2857, members = true }, ] \ No newline at end of file diff --git a/data/area/kandarin/ourania/ourania.npcs.toml b/data/area/kandarin/ourania/ourania.npcs.toml index c29b9795ee..d37c066385 100644 --- a/data/area/kandarin/ourania/ourania.npcs.toml +++ b/data/area/kandarin/ourania/ourania.npcs.toml @@ -13,6 +13,6 @@ attack_radius = 11 wander_radius = 5 max_hit_melee = 50 hunt_mode = "aggressive" -drop_table = "empty" respawn_delay = 50 +combat_anims = "gecko" examine = "A cave dweller." diff --git a/data/area/kandarin/port_khazard/port_khazard.npc-spawns.toml b/data/area/kandarin/port_khazard/port_khazard.npc-spawns.toml index 10ef2f9d90..8488604d5b 100644 --- a/data/area/kandarin/port_khazard/port_khazard.npc-spawns.toml +++ b/data/area/kandarin/port_khazard/port_khazard.npc-spawns.toml @@ -1,4 +1,6 @@ spawns = [ # 10545 { id = "musician_port_khazard", x = 2630, y = 3196, direction = "WEST", members = true }, + { id = "trader_crewmember_grey", x = 2673, y = 3144, members = true }, + { id = "trader_crewmember_pink", x = 2675, y = 3144, members = true }, ] \ No newline at end of file diff --git a/data/area/kandarin/tree_gnome_village/tree_gnome_village.teles.toml b/data/area/kandarin/tree_gnome_village/tree_gnome_village.teles.toml index cbd96e64a1..4a119434a9 100644 --- a/data/area/kandarin/tree_gnome_village/tree_gnome_village.teles.toml +++ b/data/area/kandarin/tree_gnome_village/tree_gnome_village.teles.toml @@ -5,7 +5,7 @@ delta = { level = 1 } [3205] option = "Climb-down" -tile = { x = 2515, y = 3173, level 1 } +tile = { x = 2515, y = 3173, level = 1 } delta = { level = -1 } [1750] @@ -15,7 +15,7 @@ delta = { level = 1 } [basic_ladder_top] option = "Climb-down" -tile = { x = 2525, y = 3172, level 1 } +tile = { x = 2525, y = 3172, level = 1 } delta = { level = -1 } [1750] @@ -25,7 +25,7 @@ delta = { level = 1 } [basic_ladder_top] option = "Climb-down" -tile = { x = 2516, y = 3165, level 1 } +tile = { x = 2516, y = 3165, level = 1 } delta = { level = -1 } [1750] @@ -35,7 +35,7 @@ delta = { level = 1 } [1749] option = "Climb-down" -tile = { x = 2521, y = 3162, level 1 } +tile = { x = 2521, y = 3162, level = 1 } delta = { level = -1 } [1750] @@ -45,7 +45,7 @@ delta = { level = 1 } [basic_ladder_top] option = "Climb-down" -tile = { x = 2525, y = 3162, level 1 } +tile = { x = 2525, y = 3162, level = 1 } delta = { level = -1 } [5250] diff --git a/data/area/karamja/brimhaven/brimhaven.npc-spawns.toml b/data/area/karamja/brimhaven/brimhaven.npc-spawns.toml index 594f0c5f4a..caee07924e 100644 --- a/data/area/karamja/brimhaven/brimhaven.npc-spawns.toml +++ b/data/area/karamja/brimhaven/brimhaven.npc-spawns.toml @@ -13,6 +13,7 @@ spawns = [ { id = "snake", x = 2754, y = 3171, members = true }, { id = "snake", x = 2786, y = 3174, members = true }, # 10801 + { id = "saniboch", x = 2744, y = 3152, members = true }, { id = "snake", x = 2739, y = 3169, members = true }, { id = "snake", x = 2733, y = 3165, members = true }, { id = "snake", x = 2751, y = 3166, members = true }, @@ -20,4 +21,6 @@ spawns = [ { id = "snake", x = 2749, y = 3151, members = true }, # 11058 { id = "snake", x = 2772, y = 3209, members = true }, + { id = "trader_crewmember_blue", x = 2759, y = 3239, members = true }, + { id = "trader_crewmember_black", x = 2760, y = 3239, members = true }, ] \ No newline at end of file diff --git a/data/area/karamja/brimhaven/brimhaven.objs.toml b/data/area/karamja/brimhaven/brimhaven.objs.toml index 1aab08e185..a95fd654d2 100644 --- a/data/area/karamja/brimhaven/brimhaven.objs.toml +++ b/data/area/karamja/brimhaven/brimhaven.objs.toml @@ -21,3 +21,43 @@ examine = "I hope I don't fall off this." [brimhaven_log_balance_end] id = 5090 examine = "I hope I don't fall off this." + +[brimhaven_dungeon_entrance] +id = 5083 +examine = "An overgrown dungeon entrance." + +[brimhaven_dungeon_exit] +id = 5084 +examine = "A closed overgrown dungeon entrance" + +[brimhaven_walk_up_1] +id = 5094 +examine = "A closed overgrown dungeon entrance" + +[brimhaven_walk_down_2] +id = 5096 +examine = "A closed overgrown dungeon entrance" + +[brimhaven_walk_up_3] +id = 5097 +examine = "A closed overgrown dungeon entrance" + +[brimhaven_walk_down_4] +id = 5098 +examine = "A closed overgrown dungeon entrance" + +[brimhaven_vine_1] +id = 5103 +examine = "A closed overgrown dungeon entrance" + +[brimhaven_vine_2] +id = 5104 +examine = "A closed overgrown dungeon entrance" + +[brimhaven_vine_3] +id = 5105 +examine = "A closed overgrown dungeon entrance" + +[brimhaven_vine_4] +id = 5106 +examine = "A closed overgrown dungeon entrance" \ No newline at end of file diff --git a/data/area/karamja/brimhaven/brimhaven.teles.toml b/data/area/karamja/brimhaven/brimhaven.teles.toml index 05893de092..c54280d0c3 100644 --- a/data/area/karamja/brimhaven/brimhaven.teles.toml +++ b/data/area/karamja/brimhaven/brimhaven.teles.toml @@ -26,4 +26,34 @@ delta = { level = 1 } [basic_ladder_top] option = "Climb-down" tile = { x = 2808, y = 3161, level = 1 } -delta = { level = -1 } \ No newline at end of file +delta = { level = -1 } + +[brimhaven_dungeon_entrance] +option = "Enter" +tile = { x = 2743, y = 3153 } +to = { x = 2712, y = 9564 } + +[brimhaven_dungeon_exit] +option = "Leave" +tile = { x = 2714, y = 9564 } +to = { x = 2744, y = 3152 } + +[brimhaven_walk_up_1] +option = "Walk-up" +tile = { x = 2648, y = 9592} +to = { x = 2643, y = 9594, level = 2} + +[brimhaven_walk_down_2] +option = "Walk-down" +tile = { x = 2644, y = 9593, level = 2} +to = { x = 2649, y = 9591} + +[brimhaven_walk_up_3] +option = "Walk-up" +tile = { x = 2635, y = 9514 } +to = { x = 2636, y = 9510, level = 2} + +[brimhaven_walk_down_4] +option = "Walk-down" +tile = { x = 2635, y = 9511, level = 2} +to = { x = 2636, y = 9517} \ No newline at end of file diff --git a/data/area/karamja/brimhaven/brimhaven_dungeon.vars.toml b/data/area/karamja/brimhaven/brimhaven_dungeon.vars.toml new file mode 100644 index 0000000000..0ba162562b --- /dev/null +++ b/data/area/karamja/brimhaven/brimhaven_dungeon.vars.toml @@ -0,0 +1,3 @@ +[temporary_saniboch_access] +persist = true +format = "boolean" \ No newline at end of file diff --git a/data/area/karamja/brimhaven/dungeon/brimhaven_dungeon.npc-spawns.toml b/data/area/karamja/brimhaven/dungeon/brimhaven_dungeon.npc-spawns.toml index 017d19ac20..7e87417b20 100644 --- a/data/area/karamja/brimhaven/dungeon/brimhaven_dungeon.npc-spawns.toml +++ b/data/area/karamja/brimhaven/dungeon/brimhaven_dungeon.npc-spawns.toml @@ -1,5 +1,13 @@ spawns = [ # 10644 + { id = "fire_giant_3", x = 2664, y = 9482, members = true }, + { id = "fire_giant_5", x = 2659, y = 9481, members = true }, + { id = "fire_giant_4", x = 2655, y = 9480, members = true }, + { id = "fire_giant_4", x = 2667, y = 9496, members = true }, + { id = "fire_giant_5", x = 2658, y = 9501, members = true }, + { id = "bronze_dragon", x = 2731, y = 9482, members = true }, + { id = "bronze_dragon", x = 2731, y = 9491, members = true }, + { id = "bronze_dragon", x = 2740, y = 9492, members = true }, { id = "moss_giant", x = 2642, y = 9492, members = true }, { id = "moss_giant", x = 2645, y = 9532, members = true }, { id = "moss_giant_2", x = 2636, y = 9528, members = true }, @@ -21,4 +29,59 @@ spawns = [ { id = "moss_giant_3", x = 2682, y = 9573, members = true }, { id = "moss_giant_3", x = 2648, y = 9537, members = true }, { id = "moss_giant_4", x = 2659, y = 9548, members = true }, + { id = "greater_demon_2", x = 2631, y = 9482, level = 2, members = true }, + { id = "greater_demon", x = 2631, y = 9505, level = 2, members = true }, + { id = "greater_demon_4", x = 2633, y = 9491, level = 2, members = true }, + { id = "greater_demon_4", x = 2635, y = 9477, level = 2, members = true }, + { id = "greater_demon_2", x = 2638, y = 9501, level = 2, members = true }, + { id = "greater_demon_3", x = 2642, y = 9506, level = 2, members = true }, + { id = "greater_demon_5", x = 2646, y = 9476, level = 2, members = true }, + { id = "fire_giant_5", x = 2628, y = 9543, level = 2, members = true }, + { id = "fire_giant_3", x = 2630, y = 9551, level = 2, members = true }, + { id = "fire_giant_4", x = 2632, y = 9585, level = 2, members = true }, + { id = "fire_giant_3", x = 2634, y = 9577, level = 2, members = true }, + { id = "fire_giant_3", x = 2635, y = 9557, level = 2, members = true }, + { id = "fire_giant_5", x = 2635, y = 9562, level = 2, members = true }, + { id = "fire_giant_4", x = 2640, y = 9566, level = 2, members = true }, + { id = "fire_giant_3", x = 2643, y = 9563, level = 2, members = true }, +# 10899 + { id = "black_demon_2", x = 2700, y = 9489, members = true }, + { id = "black_demon_1", x = 2703, y = 9483, members = true }, + { id = "black_demon", x = 2709, y = 9479, members = true }, + { id = "black_demon", x = 2715, y = 9482, members = true }, + { id = "iron_dragon", x = 2704, y = 9431, members = true }, + { id = "iron_dragon", x = 2704, y = 9457, members = true }, + { id = "iron_dragon", x = 2705, y = 9424, members = true }, + { id = "iron_dragon", x = 2714, y = 9420, members = true }, + { id = "iron_dragon", x = 2714, y = 9449, members = true }, + { id = "iron_dragon", x = 2714, y = 9460, members = true }, + { id = "iron_dragon", x = 2722, y = 9424, members = true }, + { id = "iron_dragon", x = 2724, y = 9435, members = true }, + { id = "iron_dragon", x = 2730, y = 9437, members = true }, + { id = "iron_dragon", x = 2732, y = 9459, members = true }, + { id = "iron_dragon", x = 2736, y = 9424, members = true }, + { id = "iron_dragon", x = 2738, y = 9440, members = true }, + { id = "iron_dragon", x = 2739, y = 9450, members = true }, + { id = "steel_dragon", x = 2712, y = 9435, members = true }, + { id = "steel_dragon", x = 2702, y = 9447, members = true }, + { id = "steel_dragon", x = 2723, y = 9458, members = true }, + { id = "steel_dragon", x = 2726, y = 9445, members = true }, +# 10900 + { id = "baby_red_dragon", x = 2696, y = 9501, members = true }, + { id = "baby_red_dragon_2", x = 2698, y = 9524, members = true }, + { id = "baby_red_dragon_1", x = 2708, y = 9500, members = true }, + { id = "baby_red_dragon_1", x = 2708, y = 9526, members = true }, + { id = "baby_red_dragon", x = 2711, y = 9516, members = true }, + { id = "baby_red_dragon_2", x = 2714, y = 9505, members = true }, + { id = "baby_red_dragon_1", x = 2730, y = 9512, members = true }, + { id = "red_dragon", x = 2697, y = 9506, members = true }, + { id = "red_dragon_1", x = 2702, y = 9504, members = true }, + { id = "red_dragon", x = 2703, y = 9522, members = true }, + { id = "red_dragon", x = 2706, y = 9516, members = true }, + { id = "red_dragon_1", x = 2708, y = 9508, members = true }, + { id = "red_dragon", x = 2711, y = 9500, members = true }, + { id = "red_dragon_1", x = 2714, y = 9526, members = true }, + { id = "red_dragon", x = 2717, y = 9516, members = true }, + { id = "red_dragon_2", x = 2721, y = 9522, members = true }, + { id = "red_dragon", x = 2724, y = 9516, members = true }, ] \ No newline at end of file diff --git a/data/area/karamja/musa_point/musa_point.npc-spawns.toml b/data/area/karamja/musa_point/musa_point.npc-spawns.toml index 510a18fecc..ec3a1d1d0f 100644 --- a/data/area/karamja/musa_point/musa_point.npc-spawns.toml +++ b/data/area/karamja/musa_point/musa_point.npc-spawns.toml @@ -5,4 +5,6 @@ spawns = [ { id = "bartender_zambo", x = 2926, y = 3145 }, { id = "snake", x = 2881, y = 3157 }, { id = "snake", x = 2889, y = 3146 }, + { id = "trader_crewmember_hat", x = 2954, y = 3157, members = true }, + { id = "trader_crewmember_purple", x = 2954, y = 3156, members = true }, ] \ No newline at end of file diff --git a/data/area/karamja/ship_yard/karamja_ship_yard.npc-spawns.toml b/data/area/karamja/ship_yard/karamja_ship_yard.npc-spawns.toml new file mode 100644 index 0000000000..a112c9005f --- /dev/null +++ b/data/area/karamja/ship_yard/karamja_ship_yard.npc-spawns.toml @@ -0,0 +1,4 @@ +spawns = [ + { id = "trader_crewmember_grey", x = 3001, y = 3033, members = true }, + { id = "trader_crewmember_pink", x = 3001, y = 3034, members = true }, +] \ No newline at end of file diff --git a/data/area/misthalin/barbarian_village/stronghold_of_security/catablepon/catablepon.npcs.toml b/data/area/misthalin/barbarian_village/stronghold_of_security/catablepon/catablepon.npcs.toml index 52c92a83a7..74d64e9215 100644 --- a/data/area/misthalin/barbarian_village/stronghold_of_security/catablepon/catablepon.npcs.toml +++ b/data/area/misthalin/barbarian_village/stronghold_of_security/catablepon/catablepon.npcs.toml @@ -13,7 +13,9 @@ wander_radius = 6 attack_radius = 8 slayer_xp = 40.0 hunt_mode = "cowardly" -categories = ["catablepon", "catablepons"] +drop_table = "catablepon" +combat_anims = "catablepon" +categories = ["catablepons"] examine = "Big... Cow-like... But cows don't have serpent tails!" [catablepon_mid] diff --git a/data/area/misthalin/barbarian_village/stronghold_of_security/flesh_crawler/flesh_crawler.npcs.toml b/data/area/misthalin/barbarian_village/stronghold_of_security/flesh_crawler/flesh_crawler.npcs.toml index c54f070591..c36fda55ec 100644 --- a/data/area/misthalin/barbarian_village/stronghold_of_security/flesh_crawler/flesh_crawler.npcs.toml +++ b/data/area/misthalin/barbarian_village/stronghold_of_security/flesh_crawler/flesh_crawler.npcs.toml @@ -13,7 +13,10 @@ attack_radius = 11 slayer_xp = 25.0 hunt_mode = "aggressive" hunt_range = 3 -categories = ["flesh_crawler", "flesh_crawlers"] +drop_table = "flesh_crawler" +combat_anims = "flesh_crawler" +combat_sounds = "flesh_crawler" +categories = ["flesh_crawlers"] examine = "I don't think insect repellent will work..." [flesh_crawler_2] diff --git a/data/area/misthalin/barbarian_village/stronghold_of_security/minotaur/minotaur.npcs.toml b/data/area/misthalin/barbarian_village/stronghold_of_security/minotaur/minotaur.npcs.toml index c01d70d3e9..676d72b59a 100644 --- a/data/area/misthalin/barbarian_village/stronghold_of_security/minotaur/minotaur.npcs.toml +++ b/data/area/misthalin/barbarian_village/stronghold_of_security/minotaur/minotaur.npcs.toml @@ -10,7 +10,10 @@ respawn_delay = 15 slayer_xp = 10.0 wander_radius = 6 attack_radius = 8 -categories = ["minotaur", "minotaurs"] +drop_table = "minotaur" +combat_anims = "minotaur" +combat_sounds = "minotaur" +categories = ["minotaurs"] examine = "He doesn't look very pleased to see you." [minotaur_strong] @@ -25,5 +28,8 @@ respawn_delay = 15 slayer_xp = 22.0 wander_radius = 6 attack_radius = 8 -categories = ["minotaur", "minotaurs"] +drop_table = "minotaur" +combat_anims = "minotaur" +combat_sounds = "minotaur" +categories = ["minotaurs"] examine = "He doesn't look very pleased to see you." \ No newline at end of file diff --git a/data/area/misthalin/draynor/draynor.npcs.toml b/data/area/misthalin/draynor/draynor.npcs.toml index 1b14d95626..c65d6b72ca 100644 --- a/data/area/misthalin/draynor/draynor.npcs.toml +++ b/data/area/misthalin/draynor/draynor.npcs.toml @@ -36,6 +36,8 @@ weapon_style = "mace" attack_speed = 5 respawn_delay = 30 wander_radius = 4 +drop_table = "human" +combat_anims = "human" categories = ["human"] examine = "This jail's open for business again." diff --git a/data/area/misthalin/lumbridge/lumbridge.areas.toml b/data/area/misthalin/lumbridge/lumbridge.areas.toml index 3e3ca7d25d..cff5ea4436 100644 --- a/data/area/misthalin/lumbridge/lumbridge.areas.toml +++ b/data/area/misthalin/lumbridge/lumbridge.areas.toml @@ -105,7 +105,7 @@ levels = "70-85" x = [3253, 3253, 3251, 3251, 3249, 3246, 3244, 3244, 3240, 3240, 3242, 3242, 3240, 3240, 3241, 3256, 3257, 3260, 3261, 3263, 3265, 3265, 3266, 3266, 3265, 3265, 3266, 3266, 3265, 3265, 3264] y = [3255, 3272, 3274, 3276, 3278, 3278, 3280, 3281, 3285, 3286, 3288, 3294, 3296, 3297, 3298, 3298, 3299, 3299, 3298, 3298, 3296, 3293, 3292, 3286, 3285, 3276, 3275, 3272, 3271, 3256, 3255] tags = ["combat_training"] -npcs = ["cow"] +npcs = ["cows"] spaces = 7 levels = "10-20" @@ -113,7 +113,7 @@ levels = "10-20" x = [3262, 3259, 3253, 3251, 3251, 3249, 3245, 3242, 3242, 3240, 3240, 3239, 3239, 3252, 3252, 3264, 3264, 3265, 3265, 3266, 3266, 3267, 3267, 3266, 3266] y = [3215, 3218, 3222, 3223, 3227, 3228, 3232, 3235, 3239, 3241, 3249, 3251, 3256, 3256, 3254, 3254, 3247, 3246, 3238, 3237, 3226, 3225, 3220, 3219, 3215] tags = ["combat_training"] -npcs = ["goblin", "giant_spider"] +npcs = ["goblins", "giant_spiders"] spaces = 6 levels = "5-15" @@ -121,7 +121,7 @@ levels = "5-15" x = [3225, 3225, 3237, 3237] y = [3287, 3301, 3301, 3287] tags = ["combat_training"] -npcs = ["chicken"] +npcs = ["chickens"] spaces = 5 levels = "1-10" @@ -173,7 +173,7 @@ y = [3250, 3256] x = [3212, 3232] y = [3173, 3190] tags = ["combat_training"] -npcs = ["giant_rat"] +npcs = ["giant_rats"] spaces = 2 levels = "10-14" diff --git a/data/area/misthalin/tutorial_island/tutorial_island.npcs.toml b/data/area/misthalin/tutorial_island/tutorial_island.npcs.toml index c262e73090..584d714e99 100644 --- a/data/area/misthalin/tutorial_island/tutorial_island.npcs.toml +++ b/data/area/misthalin/tutorial_island/tutorial_island.npcs.toml @@ -45,17 +45,21 @@ examine = "Your introduction to the world of Gielinor." [giant_rat_tutorial_island] id = 950 -categories = ["giant_rat"] +categories = ["giant_rats", "rats"] style = "stab" hitpoints = 30 wander_radius = 2 respawn_delay = 30 +drop_table = "giant_rat" +combat_anims = "giant_rat" examine = "Overgrown vermin." [chicken_tutorial_island] id = 951 -categories = ["bird"] +categories = ["chickens", "birds"] wander_radius = 2 +drop_table = "chicken" +combat_anims = "chicken" examine = "Yep. Definitely a chicken." [fishing_spot_tutorial_island] diff --git a/data/area/morytania/mos_le_harmless/mos_le_harmless.npc-spawns.toml b/data/area/morytania/mos_le_harmless/mos_le_harmless.npc-spawns.toml index 75f78838db..1fff1da3b4 100644 --- a/data/area/morytania/mos_le_harmless/mos_le_harmless.npc-spawns.toml +++ b/data/area/morytania/mos_le_harmless/mos_le_harmless.npc-spawns.toml @@ -6,4 +6,6 @@ spawns = [ { id = "rat", x = 3679, y = 2949, level = 1, members = true }, { id = "rat", x = 3682, y = 2948, members = true }, { id = "rat", x = 3688, y = 2947, members = true }, + { id = "trader_crewmember_grey", x = 3671, y = 2930, members = true }, + { id = "trader_crewmember_purple", x = 3672, y = 2930, members = true }, ] \ No newline at end of file diff --git a/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml b/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml index 49769bd48e..f2b8a2f1d0 100644 --- a/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml +++ b/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml @@ -3,4 +3,6 @@ spawns = [ { id = "rat", x = 3715, y = 3502, level = 1, members = true }, { id = "rat", x = 3714, y = 3498, members = true }, { id = "rat", x = 3713, y = 3492, members = true }, + { id = "trader_crewmember_purple", x = 3701, y = 3502, members = true }, + { id = "trader_crewmember_grey", x = 3701, y = 3503, members = true }, ] \ No newline at end of file diff --git a/data/area/tirannwn/tyras_camp/tyras_camp.npc-spawns.toml b/data/area/tirannwn/tyras_camp/tyras_camp.npc-spawns.toml index b8ba447d9f..d382f7a2bc 100644 --- a/data/area/tirannwn/tyras_camp/tyras_camp.npc-spawns.toml +++ b/data/area/tirannwn/tyras_camp/tyras_camp.npc-spawns.toml @@ -26,4 +26,6 @@ spawns = [ { id = "butterfly_1", x = 2204, y = 3180, members = true }, { id = "chicken", x = 2184, y = 3152, members = true }, { id = "chicken", x = 2186, y = 3153, members = true }, + { id = "trader_crewmember_black", x = 2144, y = 3122, members = true }, + { id = "trader_crewmember_pink", x = 2145, y = 3122, members = true }, ] \ No newline at end of file diff --git a/data/entity/npc/animal/bat/bat.npcs.toml b/data/entity/npc/animal/bat/bat.npcs.toml index 921a697108..75f8a3c177 100644 --- a/data/entity/npc/animal/bat/bat.npcs.toml +++ b/data/entity/npc/animal/bat/bat.npcs.toml @@ -10,7 +10,9 @@ slayer_xp = 8.0 wander_radius = 8 attack_radius = 14 respawn_delay = 35 -categories = ["bat", "bats"] +drop_table = "bat" +combat_anims = "bat" +categories = ["bats"] examine = "An annoying flappy thing." [giant_bat] @@ -26,7 +28,10 @@ slayer_xp = 32.0 wander_radius = 8 attack_radius = 14 respawn_delay = 35 -categories = ["bat", "bats"] +drop_table = "bat" +combat_anims = "bat" +combat_sounds = "bat" +categories = ["bats"] examine = "An annoying flappy thing." [giant_bat_brine_cavern] diff --git a/data/entity/npc/animal/bear/bear.npcs.toml b/data/entity/npc/animal/bear/bear.npcs.toml index 3fa09d5a5d..309f3f9b42 100644 --- a/data/entity/npc/animal/bear/bear.npcs.toml +++ b/data/entity/npc/animal/bear/bear.npcs.toml @@ -11,7 +11,10 @@ attack_radius = 10 hunt_mode = "cowardly" style = "slash" respawn_delay = 50 -categories = ["bear", "bears"] +drop_table = "bear" +combat_anims = "bear" +combat_sounds = "bear" +categories = ["bears"] examine = "Eek! A bear!" [grizzly_bear_club] @@ -24,12 +27,12 @@ slayer_xp = 35.0 max_hit_melee = 40 wander_radius = 8 attack_radius = 10 -attack_anim = "bear_cub_attack" -defend_anim = "bear_cub_defend" -death_anim = "bear_cub_death" +combat_anims = "bear_cub" +combat_sounds = "bear" style = "slash" respawn_delay = 50 -categories = ["bear", "bears"] +drop_table = "bear" +categories = ["bears"] examine = "Eek! A bear cub!" [grizzly_bear_tirannwn] @@ -45,7 +48,10 @@ attack_radius = 10 hunt_mode = "cowardly" style = "slash" respawn_delay = 50 -categories = ["bear", "bears"] +drop_table = "bear" +combat_anims = "bear" +combat_sounds = "bear" +categories = ["bears"] examine = "Eek! A bear!" [grizzly_bear_club_tirannwn] @@ -58,12 +64,12 @@ slayer_xp = 35.0 max_hit_melee = 40 wander_radius = 8 attack_radius = 10 -attack_anim = "bear_cub_attack" -defend_anim = "bear_cub_defend" -death_anim = "bear_cub_death" +combat_anims = "bear_cub" +combat_sounds = "bear" style = "slash" respawn_delay = 50 -categories = ["bear", "bears"] +drop_table = "bear" +categories = ["bears"] examine = "Eek! A bear cub!" [black_bear] @@ -78,7 +84,10 @@ wander_radius = 8 attack_radius = 10 style = "slash" respawn_delay = 50 -categories = ["bear", "bears"] +drop_table = "bear" +combat_anims = "bear" +combat_sounds = "bear" +categories = ["bears"] examine = "Eek! A bear!" [bear_cub] @@ -91,12 +100,12 @@ slayer_xp = 20.0 max_hit_melee = 20 wander_radius = 8 attack_radius = 10 -attack_anim = "bear_cub_attack" -defend_anim = "bear_cub_defend" -death_anim = "bear_cub_death" +combat_anims = "bear_cub" +combat_sounds = "bear" style = "slash" respawn_delay = 50 -categories = ["bear", "bears"] +drop_table = "bear" +categories = ["bears"] examine = " Cute. But deadly." [bear_cub_black] diff --git a/data/entity/npc/animal/birds.npcs.toml b/data/entity/npc/animal/birds.npcs.toml index dafb0d1194..49f36d8170 100644 --- a/data/entity/npc/animal/birds.npcs.toml +++ b/data/entity/npc/animal/birds.npcs.toml @@ -6,7 +6,7 @@ hitpoints = 30 slayer_xp = 3.0 max_hit_melee = 1 style = "stab" -categories = ["duck", "birds"] +categories = ["ducks", "birds"] respawn_delay = 25 swim = true height = 10 @@ -60,7 +60,7 @@ examine = "It quacks like a duck." [ducklings] id = 6112 swim = true -categories = ["duck", "birds"] +categories = ["ducks", "birds"] wander_radius = 6 examine = "Aww, cute." diff --git a/data/entity/npc/animal/chicken/chicken.npcs.toml b/data/entity/npc/animal/chicken/chicken.npcs.toml index 7e7c1b781f..5723b35805 100644 --- a/data/entity/npc/animal/chicken/chicken.npcs.toml +++ b/data/entity/npc/animal/chicken/chicken.npcs.toml @@ -10,5 +10,6 @@ max_hit_melee = 1 immune_poison = true style = "stab" respawn_delay = 25 -categories = ["chicken", "birds"] +categories = ["chickens", "birds"] +drop_table = "chicken" examine = "Yep. Definitely a chicken." \ No newline at end of file diff --git a/data/entity/npc/animal/cow/cow.npcs.toml b/data/entity/npc/animal/cow/cow.npcs.toml index dd9edce603..18282c6425 100644 --- a/data/entity/npc/animal/cow/cow.npcs.toml +++ b/data/entity/npc/animal/cow/cow.npcs.toml @@ -8,7 +8,10 @@ slayer_xp = 8.0 max_hit_melee = 10 style = "crush" respawn_delay = 45 -categories = ["cow", "cows"] +drop_table = "cow" +combat_anims = "cow" +combat_sounds = "cow" +categories = ["cows"] height = 30 examine = "Converts grass to beef." @@ -29,9 +32,12 @@ slayer_xp = 6.0 max_hit_melee = 10 style = "crush" respawn_delay = 45 -examine = "Young, but still beefy." -categories = ["cow", "cows"] +drop_table = "cow" +combat_anims = "cow" +combat_sounds = "cow" +categories = ["cows"] height = 15 +examine = "Young, but still beefy." [cow_zanaris] clone = "cow" diff --git a/data/entity/npc/animal/dog/dog.drops.toml b/data/entity/npc/animal/dog/dog.drops.toml index 5843bd0015..613498eddc 100644 --- a/data/entity/npc/animal/dog/dog.drops.toml +++ b/data/entity/npc/animal/dog/dog.drops.toml @@ -2,4 +2,17 @@ type = "all" drops = [ { table = "bones" } +] + +[jackal_drop_table] +type = "all" +drops = [ + { table = "bones" }, + { table = "jackal_tertiary" } +] + +[jackal_tertiary] +roll = 4 +drops = [ + { id = "jackal_bone", variable = "rag_and_bone_man_wish_list", equals = "started", default = "unstarted" } ] \ No newline at end of file diff --git a/data/entity/npc/animal/dog/dog.npc-spawns.toml b/data/entity/npc/animal/dog/dog.npc-spawns.toml index f218c96029..b13c45867a 100644 --- a/data/entity/npc/animal/dog/dog.npc-spawns.toml +++ b/data/entity/npc/animal/dog/dog.npc-spawns.toml @@ -86,15 +86,63 @@ spawns = [ { id = "guard_dog", x = 2674, y = 3504, members = true }, { id = "guard_dog", x = 2645, y = 3488, members = true }, # Brimhaven Dungeon - { id = "wild_dog", x = 2740, y = 9502, members = true }, - { id = "wild_dog", x = 2740, y = 9508, members = true }, - { id = "wild_dog", x = 2743, y = 9503, members = true }, - { id = "wild_dog", x = 2657, y = 9515, members = true }, - { id = "wild_dog", x = 2662, y = 9515, members = true }, - { id = "wild_dog", x = 2662, y = 9517, members = true }, - { id = "wild_dog", x = 2662, y = 9522, members = true }, - { id = "wild_dog", x = 2666, y = 9523, members = true }, - { id = "wild_dog", x = 2667, y = 9513, members = true }, - { id = "wild_dog", x = 2671, y = 9519, members = true }, - { id = "wild_dog", x = 2672, y = 9515, members = true }, + { id = "wild_dog", x = 2700, y = 9489, members = true }, + { id = "wild_dog", x = 2703, y = 9483, members = true }, + { id = "wild_dog", x = 2709, y = 9479, members = true }, + { id = "wild_dog", x = 2715, y = 9482, members = true }, + { id = "wild_dog", x = 2652, y = 9526, members = true }, + { id = "wild_dog", x = 2656, y = 9514, members = true }, + { id = "wild_dog", x = 2666, y = 9522, members = true }, + { id = "wild_dog", x = 2665, y = 9513, members = true }, + { id = "wild_dog", x = 2666, y = 9489, members = true }, + { id = "wild_dog", x = 2626, y = 9535, level = 2, members = true }, + { id = "wild_dog", x = 2628, y = 9507, level = 2, members = true }, + { id = "wild_dog", x = 2635, y = 9508, level = 2, members = true }, + { id = "wild_dog", x = 2634, y = 9483, level = 2, members = true }, + { id = "wild_dog", x = 2681, y = 9563, members = true }, + { id = "wild_dog", x = 2677, y = 9586, members = true }, + { id = "wild_dog", x = 2644, y = 9587, members = true }, + { id = "wild_dog", x = 2638, y = 9592, level = 2, members = true }, + { id = "wild_dog", x = 2633, y = 9583, level = 2, members = true }, + { id = "wild_dog", x = 2627, y = 9545, level = 2, members = true }, + { id = "wild_dog", x = 2744, y = 9503, members = true }, + { id = "wild_dog", x = 2702, y = 9525, members = true }, + { id = "wild_dog", x = 2704, y = 9487, members = true }, + { id = "wild_dog", x = 2711, y = 9485, members = true }, + { id = "wild_dog", x = 2722, y = 9486, members = true }, + { id = "wild_dog", x = 2717, y = 9480, members = true }, + { id = "wild_dog", x = 2733, y = 9494, members = true }, + { id = "wild_dog", x = 2742, y = 9489, members = true }, + { id = "wild_dog_1", x = 2646, y = 9530, members = true }, + { id = "wild_dog_1", x = 2643, y = 9519, members = true }, + { id = "wild_dog_1", x = 2660, y = 9521, members = true }, + { id = "wild_dog_1", x = 2665, y = 9527, members = true }, + { id = "wild_dog_1", x = 2671, y = 9521, members = true }, + { id = "wild_dog_1", x = 2670, y = 9516, members = true }, + { id = "wild_dog_1", x = 2660, y = 9497, members = true }, + { id = "wild_dog_1", x = 2643, y = 9487, members = true }, + { id = "wild_dog_1", x = 2653, y = 9488, members = true }, + { id = "wild_dog_1", x = 2677, y = 9501, members = true }, + { id = "wild_dog_1", x = 2683, y = 9476, members = true }, + { id = "wild_dog_1", x = 2630, y = 9515, level = 2, members = true }, + { id = "wild_dog_1", x = 2642, y = 9506, level = 2, members = true }, + { id = "wild_dog_1", x = 2629, y = 9487, level = 2, members = true }, + { id = "wild_dog_1", x = 2648, y = 9476, level = 2, members = true }, + { id = "wild_dog_1", x = 2672, y = 9569, members = true }, + { id = "wild_dog_1", x = 2657, y = 9577, members = true }, + { id = "wild_dog_1", x = 2643, y = 9543, members = true }, + { id = "wild_dog_1", x = 2658, y = 9546, members = true }, + { id = "wild_dog_1", x = 2636, y = 9574, level = 2, members = true }, + { id = "wild_dog_1", x = 2643, y = 9566, level = 2, members = true }, + { id = "wild_dog_1", x = 2635, y = 9559, level = 2, members = true }, + { id = "wild_dog_1", x = 2699, y = 9516, members = true }, + { id = "wild_dog_1", x = 2709, y = 9524, members = true }, + { id = "wild_dog_1", x = 2700, y = 9489, members = true }, + { id = "wild_dog_1", x = 2703, y = 9484, members = true }, + { id = "wild_dog_1", x = 2710, y = 9481, members = true }, + { id = "wild_dog_1", x = 2716, y = 9486, members = true }, + { id = "wild_dog_1", x = 2726, y = 9489, members = true }, + { id = "wild_dog_1", x = 2735, y = 9481, members = true }, + { id = "wild_dog_1", x = 2740, y = 9497, members = true }, + { id = "wild_dog_1", x = 2739, y = 9506, members = true }, ] \ No newline at end of file diff --git a/data/entity/npc/animal/dog/dog.npcs.toml b/data/entity/npc/animal/dog/dog.npcs.toml index 70302e4dba..166a877c59 100644 --- a/data/entity/npc/animal/dog/dog.npcs.toml +++ b/data/entity/npc/animal/dog/dog.npcs.toml @@ -11,7 +11,10 @@ respawn_delay = 50 attack_radius = 8 wander_radius = 6 hunt_mode = "cowardly" -categories = ["dog", "dogs"] +drop_table = "dog" +combat_anims = "jackal" +combat_sounds = "dog" +categories = ["dogs"] examine = "He has had his day." [guard_dog] @@ -27,7 +30,10 @@ respawn_delay = 25 attack_radius = 8 wander_radius = 6 hunt_mode = "cowardly" -categories = ["medium_dog", "dogs"] +drop_table = "dog" +combat_anims = "medium_dog" +combat_sounds = "dog" +categories = ["dogs"] examine = "He doesn't seem pleased to see me." [wild_dog] @@ -43,5 +49,12 @@ respawn_delay = 50 attack_radius = 8 wander_radius = 6 hunt_mode = "cowardly" -categories = ["medium_dog", "dogs"] -examine = "Looks like it's got Rabies!" \ No newline at end of file +drop_table = "dog" +combat_anims = "medium_dog" +combat_sounds = "dog" +categories = ["dogs"] +examine = "Looks like it's got Rabies!" + +[wild_dog_1] +id = 1594 +clone = "wild_dog" \ No newline at end of file diff --git a/data/entity/npc/animal/monkey/monkey.npcs.toml b/data/entity/npc/animal/monkey/monkey.npcs.toml index 8ea44d3e15..034f001b29 100644 --- a/data/entity/npc/animal/monkey/monkey.npcs.toml +++ b/data/entity/npc/animal/monkey/monkey.npcs.toml @@ -11,5 +11,8 @@ attack_radius = 14 respawn_delay = 37 max_hit_melee = 10 slayer_xp = 6.0 -categories = ["monkey", "monkeys"] +drop_table = "monkey" +combat_anims = "monkey" +combat_sounds = "monkey" +categories = ["monkeys"] examine = "Perhaps our oldest relatives?" diff --git a/data/entity/npc/animal/rat/rat.drops.toml b/data/entity/npc/animal/rat/rat.drops.toml index c4c37eade5..0a0e7ac49d 100644 --- a/data/entity/npc/animal/rat/rat.drops.toml +++ b/data/entity/npc/animal/rat/rat.drops.toml @@ -1,7 +1,7 @@ [rat_tertiary] roll = 4 drops = [ - { id = "rat_bone", chance = 1 } + { id = "rat_bone", chance = 1, variable = "rag_and_bone_man_wish_list", equals = "started", default = "unstarted" } ] [rat_drop_table] diff --git a/data/entity/npc/animal/rat/rat.npcs.toml b/data/entity/npc/animal/rat/rat.npcs.toml index f9ce6bf88c..b42500aabe 100644 --- a/data/entity/npc/animal/rat/rat.npcs.toml +++ b/data/entity/npc/animal/rat/rat.npcs.toml @@ -8,7 +8,10 @@ slayer_xp = 2.0 max_hit_melee = 1 style = "crush" respawn_delay = 1 -categories = ["rat", "rats"] +categories = ["rats"] +drop_table = "rat" +combat_anims = "rat" +combat_sounds = "rat" height = 5 examine = "A popular dwarven delicacy." @@ -23,13 +26,17 @@ max_hit_melee = 1 respawn_delay = 30 style = "crush" height = 5 -categories = ["rat", "rats"] +combat_anims = "rat" +combat_sounds = "rat" +categories = ["rats"] +drop_table = "rat" examine = "A popular dwarven delicacy." [stronghold_rat_2] id = 4396 -categories = ["stronghold_rat"] +categories = ["rats"] clone = "stronghold_rat" +drop_table = "stronghold_rat" [stronghold_giant_rat] id = 4944 @@ -43,17 +50,20 @@ slayer_xp = 5.0 max_hit_melee = 10 respawn_delay = 30 style = "stab" -categories = ["stronghold_rat", "rat", "rats"] +combat_anims = "giant_rat" +combat_sounds = "rat" +categories = ["rats"] +drop_table = "stronghold_rat" examine = "Overgrown vermin." [stronghold_giant_rat_2] id = 4945 -categories = ["stronghold_rat"] +categories = ["rats"] clone = "stronghold_giant_rat" [stronghold_giant_rat_3] id = 4395 -categories = ["stronghold_rat"] +categories = ["rats"] clone = "stronghold_giant_rat" [giant_rat] @@ -68,7 +78,10 @@ max_hit_melee = 10 style = "stab" respawn_delay = 30 examine = "Overgrown vermin." -categories = ["giant_rat", "rats"] +drop_table = "giant_rat" +combat_anims = "giant_rat" +combat_sounds = "rat" +categories = ["giant_rats", "rats"] [giant_rat_dark] clone = "giant_rat" diff --git a/data/entity/npc/animal/wolf/wolf.npcs.toml b/data/entity/npc/animal/wolf/wolf.npcs.toml index f7ac60b427..78486c6942 100644 --- a/data/entity/npc/animal/wolf/wolf.npcs.toml +++ b/data/entity/npc/animal/wolf/wolf.npcs.toml @@ -9,6 +9,8 @@ slayer_xp = 69.0 max_hit_melee = 60 hunt_mode = "aggressive" style = "stab" +combat_anims = "wolves" +combat_sounds = "wolves" respawn_delay = 90 categories = ["wolves"] examine = "Not man's best friend." @@ -26,6 +28,8 @@ slayer_xp = 34.0 max_hit_melee = 30 hunt_mode = "aggressive" style = "stab" +combat_anims = "wolves" +combat_sounds = "wolves" respawn_delay = 90 categories = ["wolves"] examine = "A vicious mountain wolf." @@ -43,6 +47,8 @@ slayer_xp = 44.0 max_hit_melee = 40 hunt_mode = "aggressive" style = "stab" +combat_anims = "wolves" +combat_sounds = "wolves" respawn_delay = 90 categories = ["wolves"] examine = "A vicious mountain wolf." diff --git a/data/entity/npc/giants/hill_giant.anims.toml b/data/entity/npc/giants/hill_giant.anims.toml index ec7a69c19b..964b727515 100644 --- a/data/entity/npc/giants/hill_giant.anims.toml +++ b/data/entity/npc/giants/hill_giant.anims.toml @@ -1,8 +1,8 @@ -[hill_giants_attack] +[hill_giant_attack] id = 4652 -[hill_giants_defend] +[hill_giant_defend] id = 4651 -[hill_giants_death] +[hill_giant_death] id = 4653 diff --git a/data/entity/npc/giants/hill_giant.npcs.toml b/data/entity/npc/giants/hill_giant.npcs.toml index 39b31b9253..282ec92b37 100644 --- a/data/entity/npc/giants/hill_giant.npcs.toml +++ b/data/entity/npc/giants/hill_giant.npcs.toml @@ -11,6 +11,8 @@ max_hit_melee = 40 respawn_delay = 30 wander_radius = 4 slayer_xp = 35 +combat_anims = "hill_giant" +combat_sounds = "hill_giant" categories = ["hill_giants"] examine = "A very large foe." diff --git a/data/entity/npc/giants/hill_giant.sounds.toml b/data/entity/npc/giants/hill_giant.sounds.toml index 0791f0154d..d79cca2e21 100644 --- a/data/entity/npc/giants/hill_giant.sounds.toml +++ b/data/entity/npc/giants/hill_giant.sounds.toml @@ -1,9 +1,8 @@ -[hill_giants_defend] +[hill_giant_defend] id = 451 -[hill_giants_death] +[hill_giant_death] id = 450 - -[hill_giants_attack] +[hill_giant_attack] id = 448 \ No newline at end of file diff --git a/data/entity/npc/giants/moss_giant.anims.toml b/data/entity/npc/giants/moss_giant.anims.toml index 7bdbf329c8..1723914ce9 100644 --- a/data/entity/npc/giants/moss_giant.anims.toml +++ b/data/entity/npc/giants/moss_giant.anims.toml @@ -1,8 +1,8 @@ -[moss_giants_attack] +[moss_giant_attack] id = 4658 -[moss_giants_defend] +[moss_giant_defend] id = 4657 -[moss_giants_death] +[moss_giant_death] id = 4659 diff --git a/data/entity/npc/giants/moss_giant.drops.toml b/data/entity/npc/giants/moss_giant.drops.toml index 85b623c511..4f5c5a853e 100644 --- a/data/entity/npc/giants/moss_giant.drops.toml +++ b/data/entity/npc/giants/moss_giant.drops.toml @@ -3,6 +3,7 @@ type = "all" drops = [ { id = "big_bones" }, { table = "moss_giant_secondary" }, + { table = "moss_giant_tertiary", members = true }, ] [moss_giant_secondary] @@ -38,6 +39,15 @@ drops = [ { table = "herb_drop_table", chance = 5, members = true }, ] +[moss_giant_tertiary] +roll = 5000 +drops = [ + { id = "moss_giant_bone", chance = 1250, variable = "rag_and_bone_man_wish_list", equals = "started", default = "unstarted" }, + { id = "long_bone", chance = 12 }, + { id = "giant_champions_scroll", lacks = "giant_champions_scroll" }, + { id = "curved_bone" }, +] + [moss_giant_glarials_tomb_drop_table] type = "all" drops = [ diff --git a/data/entity/npc/giants/moss_giant.npcs.toml b/data/entity/npc/giants/moss_giant.npcs.toml index a541b996a1..911fa38ffd 100644 --- a/data/entity/npc/giants/moss_giant.npcs.toml +++ b/data/entity/npc/giants/moss_giant.npcs.toml @@ -11,6 +11,9 @@ max_hit_melee = 60 respawn_delay = 30 wander_radius = 2 slayer_xp = 60 +drop_table = "moss_giant" +combat_anims = "moss_giant" +combat_sounds = "moss_giant" categories = ["moss_giants"] examine = "His beard seems to have a life of its own." diff --git a/data/entity/npc/giants/moss_giant.sounds.toml b/data/entity/npc/giants/moss_giant.sounds.toml index b3ca31f518..0bc49ab013 100644 --- a/data/entity/npc/giants/moss_giant.sounds.toml +++ b/data/entity/npc/giants/moss_giant.sounds.toml @@ -1,8 +1,8 @@ -[moss_giants_defend] +[moss_giant_defend] id = 451 -[moss_giants_death] +[moss_giant_death] id = 450 -[moss_giants_attack] +[moss_giant_attack] id = 449 \ No newline at end of file diff --git a/data/entity/npc/humanoid/dwarf/dwarf.npcs.toml b/data/entity/npc/humanoid/dwarf/dwarf.npcs.toml index db7e8e15e3..35358aa4b0 100644 --- a/data/entity/npc/humanoid/dwarf/dwarf.npcs.toml +++ b/data/entity/npc/humanoid/dwarf/dwarf.npcs.toml @@ -57,7 +57,10 @@ respawn_delay = 25 slayer_xp = 16.0 wander_radius = 10 attack_radius = 16 -categories = ["dwarf", "dwarves"] +drop_table = "dwarf" +combat_anims = "dwarf" +combat_sounds = "dwarf" +categories = ["dwarves"] examine = "Loves mining." [dwarf_hammer] @@ -74,7 +77,10 @@ respawn_delay = 25 slayer_xp = 26.0 wander_radius = 10 attack_radius = 16 -categories = ["dwarf", "dwarves"] +drop_table = "dwarf" +combat_anims = "dwarf" +combat_sounds = "dwarf" +categories = ["dwarves"] examine = "Loves mining, mountains and mining mountains." [dwarf_mining_guild] @@ -91,7 +97,10 @@ respawn_delay = 25 slayer_xp = 16.0 wander_radius = 10 attack_radius = 16 -categories = ["dwarf", "dwarves"] +drop_table = "dwarf" +combat_anims = "dwarf" +combat_sounds = "dwarf" +categories = ["dwarves"] examine = "Loves mining." [dwarf_mining_guild_hammer] @@ -146,4 +155,7 @@ respawn_delay = 50 slayer_xp = 10.0 wander_radius = 10 attack_radius = 16 -categories = ["dwarf", "dwarves"] +drop_table = "dwarf" +combat_anims = "dwarf" +combat_sounds = "dwarf" +categories = ["dwarves"] diff --git a/data/entity/npc/humanoid/humans.npcs.toml b/data/entity/npc/humanoid/humans.npcs.toml index 91dc79c6ad..a600da1575 100644 --- a/data/entity/npc/humanoid/humans.npcs.toml +++ b/data/entity/npc/humanoid/humans.npcs.toml @@ -10,14 +10,10 @@ max_hit_melee = 10 hitpoints = 70 wander_radius = 4 respawn_delay = 25 -pickpocket = { - stun_hit = 10, - stun_ticks = 8, - xp = 8.0, - chance_min = 180, - chance_max = 240, -} +pickpocket = { stun_hit = 10, stun_ticks = 8, xp = 8.0, chance_min = 180, chance_max = 240 } +drop_table = "human" style = "crush" +combat_anims = "human" categories = ["human"] examine = "One of Gielinor's many citizens." @@ -54,6 +50,7 @@ wander_radius = 5 max_hit_melee = 50 hunt_mode = "aggressive" drop_table = "monk_of_zamorak" +combat_anims = "human" respawn_delay = 50 examine = "An evil human cleric." @@ -73,7 +70,8 @@ attack_radius = 11 wander_radius = 5 max_hit_melee = 75 hunt_mode = "aggressive" -drop_table = "renegade_knight_drop_table" +drop_table = "human" +combat_anims = "human" respawn_delay = 50 examine = "He isn't very friendly." @@ -93,11 +91,11 @@ attack_radius = 11 wander_radius = 5 max_hit_melee = 75 hunt_mode = "aggressive" -drop_table = "sir_mordred_drop_table" +drop_table = "human" +combat_anims = "human" respawn_delay = 50 examine = "He isn't very friendly." - [cook_lumbridge] id = 278 categories = ["human"] @@ -112,6 +110,7 @@ examine = "Head wizard of the Wizard's Tower." [barbarian_guard] id = 384 +drop_table = "human" categories = ["human"] wander_radius = 4 examine = "Not very civilised looking." @@ -128,6 +127,8 @@ wander_radius = 5 attack_radius = 8 hunt_mode = "aggressive" weapon_style = "sword" +drop_table = "human" +combat_anims = "human" categories = ["human"] examine = "A dusty old suit of armour." @@ -493,6 +494,12 @@ categories = ["human"] wander_radius = 3 examine = "A holy man." +[saniboch] +id = 1595 +categories = ["human"] +wander_radius = 2 +examine = "Looks like he wants money." + [dark_mage] id = 2262 faces = false @@ -638,6 +645,7 @@ respawn_delay = 75 weapon_style = "2h" style = "crush" categories = ["human"] +combat_anims = "human" examine = "A mighty warrior, Haakon is powerfully concerned for his tribe." [haakon_the_champion_cutscene] @@ -686,18 +694,6 @@ wander_radius = 4 categories = ["human"] examine = "Gillie milks cows and she's udderly fantastic at it." -[trader_crewmember_1] -id = 4653 -categories = ["human"] -wander_radius = 2 -examine = "He can look after my money." - -[trader_crewmember_2] -id = 4656 -categories = ["human"] -wander_radius = 2 -examine = "He can look after my money." - [sir_prysin_sword] clone = "sir_prysin_normal" id = 4657 @@ -769,6 +765,7 @@ hunt_mode = "aggressive" weapon_style = "sword" drop_table = "zamorak_warrior" categories = ["human"] +combat_anims = "human" examine = "A warrior of Zamorak." [zamorak_warrior_square] @@ -791,6 +788,7 @@ attack_range = 3 attack_radius = 10 wander_radius = 5 categories = ["human"] +combat_anims = "human" drop_table = "zamorak_mage" examine = "A mage of Zamorak." @@ -815,6 +813,7 @@ categories = ["human"] style = "accurate" weapon_style = "bow" ammo = "mithril_arrow" +combat_anims = "human" drop_table = "zamorak_ranger" height = 40 examine = "A ranger of Zamorak." @@ -844,6 +843,7 @@ attack_range = 1 attack_radius = 11 wander_radius = 5 max_hit_melee = 20 +combat_anims = "human" drop_table = "zamorak_crafter" respawn_delay = 50 examine = "A Z.M.I. runecrafter." @@ -888,6 +888,7 @@ max_hit_magic = 60 respawn_delay = 50 hunt_mode = "cowardly" wander_radius = 4 +combat_anims = "human" categories = ["human"] examine = "He works evil magic." @@ -904,6 +905,8 @@ str = 17 def = 14 mage = 22 hitpoints = 240 +combat_anims = "human" +categories = ["human"] drop_table = "dark_wizard_earth" examine = "A practicer of dark arts." diff --git a/data/entity/npc/monster/cave_bug/cave_bug.npcs.toml b/data/entity/npc/monster/cave_bug/cave_bug.npcs.toml index ecc127c806..f0a2edd86e 100644 --- a/data/entity/npc/monster/cave_bug/cave_bug.npcs.toml +++ b/data/entity/npc/monster/cave_bug/cave_bug.npcs.toml @@ -11,7 +11,9 @@ respawn_delay = 35 attack_radius = 26 wander_radius = 20 hunt_mode = "cowardly" -categories = ["cave_bug", "cave_bugs"] +combat_anims = "cave_bug" +combat_sounds = "cave_bug" +categories = ["cave_bugs"] examine = "A nasty crawling critter." [cave_bug_green] @@ -26,5 +28,7 @@ slayer_xp = 93.0 respawn_delay = 15 attack_radius = 26 wander_radius = 20 -categories = ["cave_bug", "cave_bugs"] +combat_anims = "cave_bug" +combat_sounds = "cave_bug" +categories = ["cave_bugs"] examine = "A big, smelly cave dweller." \ No newline at end of file diff --git a/data/entity/npc/monster/cave_crawler/cave_crawler.npcs.toml b/data/entity/npc/monster/cave_crawler/cave_crawler.npcs.toml index 62b97b03a0..edfb40438d 100644 --- a/data/entity/npc/monster/cave_crawler/cave_crawler.npcs.toml +++ b/data/entity/npc/monster/cave_crawler/cave_crawler.npcs.toml @@ -12,7 +12,10 @@ respawn_delay = 15 attack_radius = 11 wander_radius = 9 hunt_mode = "cowardly" -categories = ["cave_crawler", "cave_crawlers"] +drop_table = "cave_crawler" +combat_anims = "cave_crawler" +combat_sounds = "cave_crawler" +categories = ["cave_crawlers"] examine = "A spiky crawling critter." [cave_crawler_red] @@ -41,5 +44,7 @@ respawn_delay = 15 attack_radius = 11 wander_radius = 9 hunt_mode = "cowardly" -categories = ["cave_crawler", "cave_crawlers"] +combat_anims = "cave_crawler" +combat_sounds = "cave_crawler" +categories = ["cave_crawlers"] examine = "Not very tasty-looking." diff --git a/data/entity/npc/monster/cave_slime/cave_slime.npcs.toml b/data/entity/npc/monster/cave_slime/cave_slime.npcs.toml index 8b46157ee8..382598c94a 100644 --- a/data/entity/npc/monster/cave_slime/cave_slime.npcs.toml +++ b/data/entity/npc/monster/cave_slime/cave_slime.npcs.toml @@ -12,5 +12,5 @@ slayer_xp = 25.0 respawn_delay = 15 attack_radius = 13 wander_radius = 11 -categories = ["cave_slime", "cave_slimes"] +categories = ["cave_slimes"] examine = "A foul-smelling blob of protoplasm." \ No newline at end of file diff --git a/data/entity/npc/monster/demon/demon.drops.toml b/data/entity/npc/monster/demon/demon.drops.toml index dfd7116a3a..3aa0cf0bdf 100644 --- a/data/entity/npc/monster/demon/demon.drops.toml +++ b/data/entity/npc/monster/demon/demon.drops.toml @@ -35,4 +35,69 @@ drops = [ roll = 5000 drops = [ { id = "lesser_demon_champions_scroll", members = true }, +] + +[greater_demon_drop_table] +type = "all" +drops = [ + { table = "greater_demon_secondary" }, + { table = "hard_clue_scroll", roll = 128 }, +] + +[greater_demon_secondary] +roll = 128 +drops = [ + { id = "steel_2h_sword", chance = 4 }, + { id = "steel_hatchet", chance = 3 }, + { id = "steel_battleaxe", chance = 3 }, + { id = "mithril_kiteshield" }, + { id = "adamant_platelegs" }, + { id = "rune_full_helm" }, + { id = "fire_rune", amount = 75, chance = 8 }, + { id = "chaos_rune", amount = 15, chance = 3 }, + { id = "death_rune", amount = 5, chance = 3 }, + { id = "fire_rune", amount = 37 }, + { id = "coins", amount = 132, chance = 40 }, + { id = "coins", amount = 44, chance = 29 }, + { id = "coins", amount = 220, chance = 10 }, + { id = "coins", amount = 11, chance = 7 }, + { id = "coins", amount = 460 }, + { id = "nothing", amount = 0, chance = 2 }, + { id = "tuna", chance = 3 }, + { id = "gold_bar", chance = 2 }, + { id = "thread", amount = 10 }, + { table = "gem_drop_table", chance = 5 }, +] + +[black_demon_drop_table] +type = "all" +drops = [ + { table = "black_demon_secondary" }, + { table = "hard_clue_scroll", roll = 128 }, +] + +[black_demon_secondary] +roll = 128 +drops = [ + { id = "black_sword", chance = 4 }, + { id = "steel_battleaxe", chance = 3 }, + { id = "black_hatchet", chance = 2 }, + { id = "mithril_kiteshield" }, + { id = "rune_med_helm" }, + { id = "rune_chainbody" }, + { id = "air_rune", amount = 50, chance = 8 }, + { id = "chaos_rune", amount = 10, chance = 7 }, + { id = "blood_rune", amount = 7, chance = 4 }, + { id = "fire_rune", amount = 37 }, + { id = "law_rune", amount = 3 }, + { table = "herb_drop_table", chance = 23 }, + { id = "coins", amount = 132, chance = 40 }, + { id = "coins", amount = 30, chance = 7 }, + { id = "coins", amount = 44, chance = 6 }, + { id = "coins", amount = 220, chance = 6 }, + { id = "coins", amount = 460 }, + { id = "lobster", chance = 3 }, + { id = "adamant_bar", chance = 2 }, + { id = "defence_potion_3" }, + { table = "rare_drop_table" }, ] \ No newline at end of file diff --git a/data/entity/npc/monster/demon/demons.npcs.toml b/data/entity/npc/monster/demon/demons.npcs.toml index 5af7a036c8..ec478ecfdf 100644 --- a/data/entity/npc/monster/demon/demons.npcs.toml +++ b/data/entity/npc/monster/demon/demons.npcs.toml @@ -7,7 +7,9 @@ str = 10 def = 5 magic = 1 attack_speed = 6 -categories = ["demon"] +categories = ["demons"] +combat_anims = "demon" +combat_sounds = "demon" examine = "A freshly summoned demon." [delrith_weakened] @@ -25,12 +27,34 @@ hitpoints = 870 slayer_xp = 87.0 max_hit_melee = 90 style = "slash" -categories = ["demon", "demons"] +combat_anims = "demon" +combat_sounds = "demon" +categories = ["demons"] respawn_delay = 15 hunt_mode = "aggressive" height = 60 examine = "Big, red, and incredibly evil." +[greater_demon_1] +id = 1585 +clone = "greater_demon" + +[greater_demon_2] +id = 4698 +clone = "greater_demon" + +[greater_demon_3] +id = 4699 +clone = "greater_demon" + +[greater_demon_4] +id = 4700 +clone = "greater_demon" + +[greater_demon_5] +id = 4701 +clone = "greater_demon" + [lesser_demon] id = 82 hitpoints = 790 @@ -42,9 +66,11 @@ range = 1 style = "slash" max_hit_melee = 80 wander_radius = 4 +combat_anims = "demon" +combat_sounds = "demon" drop_table = "lesser_demon" hunt_mode = "aggressive" -categories = ["demon", "demons"] +categories = ["demons"] respawn_delay = 30 examine = "Lesser, but still pretty big." @@ -66,4 +92,33 @@ id = 4697 [lesser_demon_melzars_maze] clone = "lesser_demon" -id = 6101 \ No newline at end of file +id = 6101 + +[black_demon] +id = 84 +att = 145 +str = 148 +def = 152 +attack_range = 5 +attack_radius = 11 +hitpoints = 1570 +slayer_xp = 157.0 +wander_radius = 4 +max_hit_melee = 160 +attack_speed = 4 +style = "slash" +combat_anims = "demon" +combat_sounds = "demon" +categories = ["demons"] +respawn_delay = 30 +hunt_mode = "aggressive" +height = 60 +examine = "A big, scary, jet-black demon." + +[black_demon_1] +id = 4702 +clone = "black_demon" + +[black_demon_2] +id = 4703 +clone = "black_demon" \ No newline at end of file diff --git a/data/entity/npc/monster/draconic/dragon.anims.toml b/data/entity/npc/monster/draconic/dragon.anims.toml index a4ffc37d0a..be996c1e3a 100644 --- a/data/entity/npc/monster/draconic/dragon.anims.toml +++ b/data/entity/npc/monster/draconic/dragon.anims.toml @@ -1,11 +1,47 @@ -[dragon_breath] +[king_black_dragon_breath] id = 81 -[dragon_attack] +[king_black_dragon_attack] id = 91 -[dragon_defend] +[king_black_dragon_defend] id = 89 -[dragon_death] +[king_black_dragon_death] id = 92 + +[dragon_shoot] +id = 13160 + +[dragon_attack] +id = 13158 + +[dragon_defend] +id = 13163 + +[dragon_breath] +id = 13164 + +[dragon_death] +id = 13159 + +[colour_dragon_attack] +id = 12252 + +[colour_dragon_breath] +id = 14245 + +[colour_dragon_defend] +id = 12251 + +[colour_dragon_death] +id = 12250 + +[baby_dragon_attack] +id = 14270 + +[baby_dragon_defend] +id = 14269 + +[baby_dragon_death] +id = 14271 \ No newline at end of file diff --git a/data/entity/npc/monster/draconic/dragon.drops.toml b/data/entity/npc/monster/draconic/dragon.drops.toml new file mode 100644 index 0000000000..34a0f6995b --- /dev/null +++ b/data/entity/npc/monster/draconic/dragon.drops.toml @@ -0,0 +1,181 @@ +[bronze_dragon_drop_table] +type = "all" +drops = [ + { table = "bronze_dragon_primary" }, + { table = "bronze_dragon_secondary" }, + { table = "hard_clue_scroll", roll = 128 }, +] + +[bronze_dragon_primary] +drops = [ + { id = "dragon_bones" }, + { id = "bronze_bar", amount = 5 }, +] + +[bronze_dragon_secondary] +roll = 2048 +drops = [ + { id = "dragon_plateskirt" }, + { id = "dragon_platelegs" }, + { id = "adamant_dart_p", amount = 16, chance = 112 }, + { id = "mithril_2h_sword", chance = 64 }, + { id = "mithril_hatchet", chance = 48 }, + { id = "mithril_battleaxe", chance = 48 }, + { id = "rune_knife", amount = 2, chance = 48 }, + { id = "mithril_kiteshield", chance = 16 }, + { id = "adamant_platebody", chance = 16 }, + { id = "rune_longsword", chance = 16 }, + { id = "adamant_javelin", amount = 30, chance = 320 }, + { id = "fire_rune", amount = 50, chance = 128 }, + { id = "mithril_bolts", min = 2, max = 12, chance = 96 }, + { id = "law_rune", amount = 10, chance = 80 }, + { id = "blood_rune", amount = 15, chance = 48 }, + { id = "death_rune", amount = 25, chance = 16 }, + { id = "coins", amount = 196, chance = 640 }, + { id = "coins", amount = 330, chance = 160 }, + { id = "coins", amount = 690, chance = 16 }, + { id = "adamant_bar", chance = 48 }, + { id = "swordfish", amount = 2, chance = 32 }, + { id = "swordfish", chance = 16 }, + { table = "rare_drop_table", chance = 16 }, +] + +[iron_dragon_drop_table] +type = "all" +drops = [ + { table = "iron_dragon_primary" }, + { table = "iron_dragon_secondary" }, + { table = "iron_dragon_tertiary" }, +] + +[iron_dragon_primary] +drops = [ + { id = "dragon_bones" }, + { id = "iron_bar", amount = 5 }, +] + +[iron_dragon_secondary] +roll = 1024 +drops = [ + { id = "dragon_plateskirt" }, + { id = "dragon_platelegs" }, + { id = "rune_dart_p", amount = 9, chance = 56 }, + { id = "adamant_2h_sword", chance = 32 }, + { id = "adamant_hatchet", chance = 24 }, + { id = "adamant_battleaxe", chance = 24 }, + { id = "rune_knife", amount = 5, chance = 24 }, + { id = "adamant_sq_shield", chance = 8 }, + { id = "rune_med_helm", chance = 8 }, + { id = "rune_battleaxe", chance = 8 }, + { id = "rune_javelin", amount = 4, chance = 160 }, + { id = "blood_rune", amount = 15, chance = 152 }, + { id = "adamant_bolts", min = 2, max = 12, chance = 48 }, + { id = "soul_rune", amount = 3, chance = 40 }, + { id = "coins", amount = 270, chance = 160 }, + { id = "coins", amount = 550, chance = 80 }, + { id = "coins", amount = 990, chance = 8 }, + { id = "super_strength_1", chance = 64 }, + { id = "rune_limbs", chance = 40 }, + { id = "adamant_bar", amount = 2, chance = 24 }, + { id = "curry", chance = 24 }, + { table = "rare_drop_table", chance = 16 }, +] + +[iron_dragon_tertiary] +roll = 10000 +drops = [ + { table = "hard_clue_scroll", chance = 78 }, + { id = "draconic_visage" }, +] + +[steel_dragon_drop_table] +type = "all" +drops = [ + { table = "steel_dragon_primary" }, + { table = "steel_dragon_secondary" }, + { table = "steel_dragon_tertiary" }, +] + +[steel_dragon_primary] +drops = [ + { id = "dragon_bones" }, + { id = "steel_bar", amount = 5 }, +] + +[steel_dragon_secondary] +roll = 512 +drops = [ + { id = "dragon_plateskirt" }, + { id = "dragon_platelegs" }, + { id = "rune_dart_p", amount = 12, chance = 28 }, + { id = "rune_mace", chance = 16 }, + { id = "adamant_kiteshield", chance = 8 }, + { id = "rune_knife", amount = 7, chance = 12 }, + { id = "rune_hatchet", chance = 8 }, + { id = "rune_full_helm", chance = 4 }, + { id = "blood_rune", amount = 20, chance = 76 }, + { id = "rune_javelin", amount = 7, chance = 80 }, + { id = "runite_bolts", min = 2, max = 12, chance = 24 }, + { id = "soul_rune", amount = 5, chance = 20 }, + { id = "coins", amount = 470, chance = 68 }, + { id = "coins", amount = 650, chance = 20 }, + { id = "super_attack_3", chance = 52 }, + { id = "rune_limbs", chance = 32 }, + { id = "rune_bar", chance = 12 }, + { id = "super_defence_2", chance = 12 }, + { id = "curry", chance = 4 }, + { id = "curry", amount = 2, chance = 4 }, + { table = "rare_drop_table", chance = 16 }, +] + +[steel_dragon_tertiary] +roll = 10000 +drops = [ + { table = "hard_clue_scroll", chance = 156 }, + { id = "draconic_visage" }, +] + +[red_dragon_drop_table] +type = "all" +drops = [ + { table = "red_dragon_primary" }, + { table = "red_dragon_secondary" }, + { table = "hard_clue_scroll", roll = 128 }, +] + +[red_dragon_primary] +drops = [ + { id = "dragon_bones" }, + { id = "red_dragonhide" }, +] + +[red_dragon_secondary] +roll = 128 +drops = [ + { id = "mithril_2h_sword", chance = 4 }, + { id = "mithril_hatchet", chance = 3 }, + { id = "mithril_battleaxe", chance = 3 }, + { id = "rune_dart", amount = 8, chance = 3 }, + { id = "mithril_javelin", amount = 20 }, + { id = "mithril_kiteshield" }, + { id = "adamant_platebody" }, + { id = "rune_longsword" }, + { id = "rune_arrow", amount = 4, chance = 8 }, + { id = "law_rune", amount = 4, chance = 5 }, + { id = "blood_rune", amount = 2, chance = 4 }, + { id = "death_rune", amount = 5, chance = 3 }, + { table = "herb_drop_table", chance = 2 }, + { id = "coins", amount = 196, chance = 40 }, + { id = "coins", amount = 66, chance = 29 }, + { id = "coins", amount = 330, chance = 10 }, + { id = "coins", amount = 690 }, + { id = "chocolate_cake", amount = 3, chance = 3 }, + { id = "adamant_bar" }, + { table = "gem_drop_table", chance = 5 }, +] + +[baby_dragon_drop_table] +type = "all" +drops = [ + { id = "babydragon_bones" } +] \ No newline at end of file diff --git a/data/entity/npc/monster/draconic/dragon.gfx.toml b/data/entity/npc/monster/draconic/dragon.gfx.toml index bdaf5111e5..4fe9ce5082 100644 --- a/data/entity/npc/monster/draconic/dragon.gfx.toml +++ b/data/entity/npc/monster/draconic/dragon.gfx.toml @@ -25,3 +25,6 @@ height = 43 curve = 15 delay = 51 flight_time = [ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 ] + +[dragon_breath_shoot] +id = 2465 \ No newline at end of file diff --git a/data/entity/npc/monster/draconic/dragon.sounds.toml b/data/entity/npc/monster/draconic/dragon.sounds.toml new file mode 100644 index 0000000000..5e081bb1d3 --- /dev/null +++ b/data/entity/npc/monster/draconic/dragon.sounds.toml @@ -0,0 +1,23 @@ +[dragon_attack] +id = 408 + +[dragon_death] +id = 409 + +[dragon_defend] +id = 410 + +[dragon_breath] +id = 3750 + +[metal_dragon_fireball] +id = 3749 + +[baby_dragon_attack] +id = 405 + +[baby_dragon_death] +id = 406 + +[baby_dragon_defend] +id = 407 \ No newline at end of file diff --git a/data/entity/npc/monster/draconic/dragons.npcs.toml b/data/entity/npc/monster/draconic/dragons.npcs.toml index 0fd448a609..2f1cc483a4 100644 --- a/data/entity/npc/monster/draconic/dragons.npcs.toml +++ b/data/entity/npc/monster/draconic/dragons.npcs.toml @@ -13,7 +13,133 @@ max_hit_dragonfire = 650 hunt_mode = "aggressive" allowed_under = true slayer_xp = 258.0 -categories = ["dragon", "boss"] +combat_anims = "king_black_dragon" +categories = ["dragons", "boss"] aka = ["kbd"] respawn_delay = 16 -examine = "One of the biggest, meanest dragons around." \ No newline at end of file +examine = "One of the biggest, meanest dragons around." + +[bronze_dragon] +id = 1590 +hitpoints = 1520 +att = 112 +str = 112 +def = 112 +mage = 100 +style = "slash" +attack_range = 8 +attack_radius = 8 +wander_radius = 4 +max_hit_melee = 120 +max_hit_dragonfire = 500 +hunt_mode = "aggressive" +allowed_under = true +slayer_xp = 125.0 +combat_anims = "dragon" +combat_sounds = "dragon" +categories = ["dragons"] +respawn_delay = 30 +examine = "Its scales seem to be made of bronze." + +[iron_dragon] +id = 1591 +hitpoints = 1890 +att = 165 +str = 165 +def = 165 +mage = 100 +style = "slash" +attack_range = 8 +attack_radius = 8 +wander_radius = 2 +max_hit_melee = 170 +max_hit_dragonfire = 500 +hunt_mode = "aggressive" +allowed_under = true +slayer_xp = 173.2 +combat_anims = "dragon" +combat_sounds = "dragon" +categories = ["dragons"] +respawn_delay = 30 +examine = "Its scales seem to be made of iron." + +[steel_dragon] +id = 1592 +hitpoints = 2100 +att = 215 +str = 215 +def = 215 +mage = 100 +style = "slash" +attack_range = 8 +attack_radius = 8 +wander_radius = 2 +max_hit_melee = 250 +max_hit_dragonfire = 650 +hunt_mode = "aggressive" +allowed_under = true +slayer_xp = 220.5 +combat_anims = "dragon" +combat_sounds = "dragon" +categories = ["dragons"] +respawn_delay = 30 +examine = "Its scales seem to be made of steel." + +[red_dragon] +id = 53 +hitpoints = 1520 +att = 130 +str = 130 +def = 130 +style = "slash" +attack_range = 8 +attack_radius = 8 +wander_radius = 3 +max_hit_melee = 140 +max_hit_dragonfire = 500 +hunt_mode = "aggressive" +allowed_under = true +slayer_xp = 143.4 +drop_table = "red_dragon" +combat_anims = "colour_dragon" +combat_sounds = "dragon" +categories = ["dragons"] +respawn_delay = 30 +examine = "Its scales seem to be made of iron." + +[red_dragon_1] +id = 4670 +clone = "red_dragon" + +[red_dragon_2] +id = 4672 +clone = "red_dragon" + +[baby_red_dragon] +id = 1589 +hitpoints = 480 +att = 40 +str = 40 +def = 40 +style = "slash" +attack_range = 8 +attack_radius = 8 +wander_radius = 3 +max_hit_melee = 50 +hunt_mode = "aggressive" +allowed_under = true +slayer_xp = 50.0 +drop_table = "baby_dragon" +combat_anims = "baby_dragon" +combat_sounds = "baby_dragon" +categories = ["dragons"] +respawn_delay = 30 +examine = "Young but still dangerous." + +[baby_red_dragon_1] +id = 4667 +clone = "baby_red_dragon" + +[baby_red_dragon_2] +id = 4668 +clone = "baby_red_dragon" \ No newline at end of file diff --git a/data/entity/npc/monster/fiend/ice/icefiend.npcs.toml b/data/entity/npc/monster/fiend/ice/icefiend.npcs.toml index 1db5644795..4a0412e0c4 100644 --- a/data/entity/npc/monster/fiend/ice/icefiend.npcs.toml +++ b/data/entity/npc/monster/fiend/ice/icefiend.npcs.toml @@ -8,7 +8,10 @@ max_hit_melee = 20 style = "crush" slayer_xp = 15.0 respawn_delay = 15 -categories = ["icefiend", "icefiends"] +drop_table = "icefiend" +combat_anims = "icefiend" +combat_sounds = "icefiend" +categories = ["icefiends"] examine = "A small ice demon." [icefiend_godwars] @@ -22,7 +25,10 @@ style = "crush" slayer_xp = 20.0 respawn_delay = 25 hunt_mode = "cowardly" -categories = ["icefiend", "icefiends"] +drop_table = "icefiend" +combat_anims = "icefiend" +combat_sounds = "icefiend" +categories = ["icefiends"] examine = "A small ice demon." [icefiend_melting] @@ -32,5 +38,8 @@ id = 7715 id = 9066 respawn_delay = 30 wander_radius = 4 -categories = ["icefiend"] +drop_table = "icefiend" +combat_anims = "icefiend" +combat_sounds = "icefiend" +categories = ["icefiends"] examine = "A robust ice demon." \ No newline at end of file diff --git a/data/entity/npc/monster/fire_giant/fire_giant.anims.toml b/data/entity/npc/monster/fire_giant/fire_giant.anims.toml new file mode 100644 index 0000000000..34980b184e --- /dev/null +++ b/data/entity/npc/monster/fire_giant/fire_giant.anims.toml @@ -0,0 +1,8 @@ +[fire_giant_attack] +id = 4666 + +[fire_giant_defend] +id = 4664 + +[fire_giant_death] +id = 4668 \ No newline at end of file diff --git a/data/entity/npc/monster/fire_giant/fire_giant.drops.toml b/data/entity/npc/monster/fire_giant/fire_giant.drops.toml new file mode 100644 index 0000000000..36be7ac4e9 --- /dev/null +++ b/data/entity/npc/monster/fire_giant/fire_giant.drops.toml @@ -0,0 +1,41 @@ +[fire_giant_drop_table] +type = "all" +drops = [ + { id = "big_bones" }, + { table = "fire_giant_secondary" }, + { table = "fire_giant_tertiary" }, +] + +[fire_giant_secondary] +roll = 128 +drops = [ + { id = "steel_hatchet", chance = 3 }, + { id = "mithril_sq_shield", chance = 2 }, + { id = "fire_battlestaff" }, + { id = "rune_scimitar" }, + { id = "fire_rune", amount = 150, chance = 10 }, + { id = "chaos_rune", amount = 5, chance = 7 }, + { id = "rune_arrow", amount = 12, chance = 5 }, + { id = "blood_rune", amount = 5, chance = 4 }, + { id = "fire_rune", amount = 37 }, + { id = "law_rune", amount = 2 }, + { table = "herb_drop_table", chance = 19 }, + { id = "coins", amount = 60, chance = 40 }, + { id = "coins", amount = 15, chance = 7 }, + { id = "coins", amount = 25, chance = 6 }, + { id = "coins", amount = 300, chance = 2 }, + { id = "coins", amount = 50 }, + { id = "lobster", chance = 3 }, + { id = "steel_bar", chance = 2 }, + { id = "strength_potion_2" }, + { table = "rare_drop_table" }, +] + +[fire_giant_tertiary] +roll = 5012 +drops = [ + { id = "fire_giant_bone", chance = 1253 }, + { id = "long_bone", chance = 12 }, + { id = "giant_champions_scroll" }, + { id = "curved_bone" }, +] diff --git a/data/entity/npc/monster/fire_giant/fire_giant.npcs.toml b/data/entity/npc/monster/fire_giant/fire_giant.npcs.toml new file mode 100644 index 0000000000..023104a282 --- /dev/null +++ b/data/entity/npc/monster/fire_giant/fire_giant.npcs.toml @@ -0,0 +1,39 @@ +[fire_giant] +id = 1582 +hitpoints = 1110 +att = 65 +str = 65 +def = 65 +attack_speed = 5 +hunt_mode = "aggressive" +style = "slash" +max_hit_melee = 111 +respawn_delay = 30 +wander_radius = 2 +slayer_xp = 111 +drop_table = "fire_giant" +combat_anims = "fire_giant" +combat_sounds = "fire_giant" +categories = ["fire_giants"] +examine = "His beard seems to have a life of its own." + +[fire_giant_1] +id = 1583 +clone = "fire_giant" + +[fire_giant_2] +id = 1584 +clone = "fire_giant" + +[fire_giant_3] +id = 1585 +clone = "fire_giant" + +[fire_giant_4] +id = 1586 +clone = "fire_giant" + +[fire_giant_5] +id = 110 +clone = "fire_giant" + diff --git a/data/entity/npc/monster/fire_giant/fire_giant.sounds.toml b/data/entity/npc/monster/fire_giant/fire_giant.sounds.toml new file mode 100644 index 0000000000..92af70c96a --- /dev/null +++ b/data/entity/npc/monster/fire_giant/fire_giant.sounds.toml @@ -0,0 +1,8 @@ +[fire_giant_defend] +id = 451 + +[fire_giant_death] +id = 450 + +[fire_giant_attack] +id = 449 \ No newline at end of file diff --git a/data/entity/npc/monster/goblin/goblin.drops.toml b/data/entity/npc/monster/goblin/goblin.drops.toml index 506120f6c4..1715750e43 100644 --- a/data/entity/npc/monster/goblin/goblin.drops.toml +++ b/data/entity/npc/monster/goblin/goblin.drops.toml @@ -68,7 +68,6 @@ drops = [ [stronghold_goblin_tertiary] roll = 5000 drops = [ -# { id = "goblin_skull", chance = 1250, members = true }, { id = "clue_scroll_easy", lacks = "clue_scroll_easy*", chance = 39 }, - { id = "goblin_champions_scroll", members = true }, + { id = "goblin_champions_scroll", members = true, lacks = "goblin_champions_scroll" }, ] \ No newline at end of file diff --git a/data/entity/npc/monster/goblin/goblin.npcs.toml b/data/entity/npc/monster/goblin/goblin.npcs.toml index 551eb08dc0..d3e2b5cf0d 100644 --- a/data/entity/npc/monster/goblin/goblin.npcs.toml +++ b/data/entity/npc/monster/goblin/goblin.npcs.toml @@ -10,7 +10,10 @@ respawn_delay = 35 wander_radius = 10 hitpoints = 120 slayer_xp = 12.0 -categories = ["goblin", "goblins"] +drop_table = "goblin" +combat_anims = "goblin" +combat_sounds = "goblin" +categories = ["goblins"] height = 30 large_head = true examine = "An ugly, orange creature." @@ -51,8 +54,11 @@ style = "crush" master2 = "turael" master3 = "spria" respawn_delay = 35 +drop_table = "goblin" +combat_anims = "goblin" +combat_sounds = "goblin" examine = "An ugly, blue creature." -categories = ["goblin"] +categories = ["goblins"] height = 30 [goblin_mohawk_grey] @@ -196,7 +202,10 @@ wander_radius = 10 attack_radius = 15 slayer_xp = 5.0 height = 30 -categories = ["stronghold_goblin", "goblin", "goblins"] +drop_table = "stronghold_goblin" +combat_anims = "goblin" +combat_sounds = "goblin" +categories = ["goblins"] examine = "An ugly green creature." [stronghold_of_security_goblin_helmet] @@ -212,7 +221,10 @@ wander_radius = 10 attack_radius = 15 slayer_xp = 16.0 height = 30 -categories = ["stronghold_goblin", "goblin", "goblins"] +drop_table = "stronghold_goblin" +combat_anims = "goblin" +combat_sounds = "goblin" +categories = ["goblins"] examine = "An ugly green creature." [stronghold_of_security_goblin_green_hat] @@ -230,7 +242,10 @@ wander_radius = 10 attack_radius = 15 slayer_xp = 7.0 height = 30 -categories = ["stronghold_goblin", "goblin", "goblins"] +drop_table = "stronghold_goblin" +combat_anims = "goblin" +combat_sounds = "goblin" +categories = ["goblins"] examine = "An ugly green creature." [stronghold_of_security_goblin_green_armed] @@ -248,7 +263,10 @@ wander_radius = 10 attack_radius = 15 slayer_xp = 22.0 height = 30 -categories = ["stronghold_goblin", "goblin", "goblins"] +drop_table = "stronghold_goblin" +combat_anims = "goblin" +combat_sounds = "goblin" +categories = ["goblins"] examine = "An ugly green creature." [stronghold_of_security_goblin_hat] @@ -264,7 +282,10 @@ wander_radius = 10 attack_radius = 15 slayer_xp = 26.0 height = 30 -categories = ["stronghold_goblin", "goblin", "goblins"] +drop_table = "stronghold_goblin" +combat_anims = "goblin" +combat_sounds = "goblin" +categories = ["goblins"] examine = "These goblins have grown strong." [stronghold_of_security_goblin_green_helmet] diff --git a/data/entity/npc/monster/goblin/hobgoblins.npcs.toml b/data/entity/npc/monster/goblin/hobgoblins.npcs.toml index 12339d71d5..41ee9bb63f 100644 --- a/data/entity/npc/monster/goblin/hobgoblins.npcs.toml +++ b/data/entity/npc/monster/goblin/hobgoblins.npcs.toml @@ -9,7 +9,10 @@ max_hit_melee = 30 attack_speed = 4 hunt_mode = "cowardly" wander_radius = 4 -categories = ["hobgoblin"] +drop_table = "hobgoblin" +combat_anims = "hobgoblin" +combat_sounds = "hobgoblin" +categories = ["hobgoblins"] slayer_xp = 29 respawn_delay = 30 examine = "An ugly, smelly creature." @@ -25,7 +28,10 @@ max_hit_melee = 30 hunt_mode = "cowardly" attack_speed = 6 wander_radius = 4 -categories = ["hobgoblin_armed"] +drop_table = "hobgoblin" +combat_anims = "hobgoblin_armed" +combat_sounds = "hobgoblin_armed" +categories = ["hobgoblins"] slayer_xp = 49 respawn_delay = 30 examine = "An ugly, smelly creature wielding a spear." @@ -56,7 +62,10 @@ def = 43 style = "crush" wander_radius = 4 attack_speed = 6 -categories = ["hobgoblin"] +drop_table = "hobgoblin" +combat_anims = "hobgoblin" +combat_sounds = "hobgoblin" +categories = ["hobgoblins"] examine = "He doesn't look very welcoming." [godwars_ancient_hobgoblin] @@ -72,5 +81,8 @@ slayer_xp = 52 attack_speed = 4 respawn_delay = 40 #todo wander_radius = 4 -categories = ["hobgoblin"] +drop_table = "hobgoblin" +combat_anims = "hobgoblin" +combat_sounds = "hobgoblin" +categories = ["hobgoblins"] examine = "An ugly, smelly creature." \ No newline at end of file diff --git a/data/entity/npc/monster/ice_giant/ice_giant.npcs.toml b/data/entity/npc/monster/ice_giant/ice_giant.npcs.toml index 32cfc38a9b..5a046c412d 100644 --- a/data/entity/npc/monster/ice_giant/ice_giant.npcs.toml +++ b/data/entity/npc/monster/ice_giant/ice_giant.npcs.toml @@ -13,6 +13,6 @@ attack_radius = 5 hunt_mode = "cowardly" style = "slash" respawn_delay = 30 -categories = ["ice_giant"] +categories = ["ice_giants"] slayer_xp = 70.0 examine = "He's got icicles in his beard." \ No newline at end of file diff --git a/data/entity/npc/monster/ice_warrior/ice_warrior.npcs.toml b/data/entity/npc/monster/ice_warrior/ice_warrior.npcs.toml index 9b0af9c14f..989e05bb6b 100644 --- a/data/entity/npc/monster/ice_warrior/ice_warrior.npcs.toml +++ b/data/entity/npc/monster/ice_warrior/ice_warrior.npcs.toml @@ -11,6 +11,6 @@ attack_radius = 5 hunt_mode = "cowardly" style = "slash" respawn_delay = 30 -categories = ["ice_warrior"] +categories = ["ice_warriors"] slayer_xp = 59.0 examine = "A cold-hearted elemental warrior." \ No newline at end of file diff --git a/data/entity/npc/monster/kalphite/kalphite.npcs.toml b/data/entity/npc/monster/kalphite/kalphite.npcs.toml index 229ec5b882..486d9c7d2f 100644 --- a/data/entity/npc/monster/kalphite/kalphite.npcs.toml +++ b/data/entity/npc/monster/kalphite/kalphite.npcs.toml @@ -11,7 +11,9 @@ respawn_delay = 25 attack_radius = 8 wander_radius = 6 hunt_mode = "cowardly" -categories = ["kalphite", "kalphites"] +combat_anims = "kalphite" +combat_sounds = "kalphite" +categories = ["kalphites"] examine = "I don't think insect repellent will work..." [kalphite_soldier] @@ -27,7 +29,9 @@ respawn_delay = 25 attack_radius = 8 wander_radius = 6 hunt_mode = "cowardly" -categories = ["kalphite", "kalphites"] +combat_anims = "kalphite" +combat_sounds = "kalphite" +categories = ["kalphites"] examine = "I don't think insect repellent will work..." [kalphite_guardian] @@ -44,5 +48,7 @@ respawn_delay = 40 attack_radius = 8 wander_radius = 6 hunt_mode = "cowardly" -categories = ["kalphite", "kalphites"] +combat_anims = "kalphite" +combat_sounds = "kalphite" +categories = ["kalphites"] examine = "I don't think insect repellent will work..." diff --git a/data/entity/npc/monster/lizard/lizard.drops.toml b/data/entity/npc/monster/lizard/lizard.drops.toml index b856e2e3a8..087f151250 100644 --- a/data/entity/npc/monster/lizard/lizard.drops.toml +++ b/data/entity/npc/monster/lizard/lizard.drops.toml @@ -62,3 +62,19 @@ drops = [ { table = "bones" }, { table = "lizard_secondary" }, ] + +[desert_lizard_drop_table] +type = "all" +drops = [ + { table = "bones" }, + { table = "lizard_secondary" }, + { table = "desert_lizard_tertiary" }, +] + +[desert_lizard_tertiary] +roll = 10000 +drops = [ + { id = "desert_lizard_bone", chance = 2500, variable = "rag_and_bone_man_wish_list", equals = "started", default = "unstarted" }, + { id = "long_bone", chance = 25 }, + { id = "curved_bone", chance = 2 }, +] diff --git a/data/entity/npc/monster/lizard/lizard.npcs.toml b/data/entity/npc/monster/lizard/lizard.npcs.toml index 2d968c02bf..df9abf1c5e 100644 --- a/data/entity/npc/monster/lizard/lizard.npcs.toml +++ b/data/entity/npc/monster/lizard/lizard.npcs.toml @@ -12,7 +12,10 @@ attack_radius = 11 wander_radius = 9 immune_death = true hunt_mode = "cowardly" -categories = ["lizard", "lizards"] +drop_table = "lizard" +combat_anims = "lizard" +combat_sounds = "lizard" +categories = ["lizards"] examine = "Run away, it's massive!" [small_lizard_green] @@ -28,7 +31,10 @@ respawn_delay = 50 attack_radius = 11 wander_radius = 9 immune_death = true -categories = ["small_lizard", "lizard", "lizards"] +drop_table = "small_lizard" +combat_anims = "lizard" +combat_sounds = "lizard" +categories = ["lizards"] examine = "A small cold-blooded creature, partial to warmth." [small_lizard_orange] @@ -48,8 +54,12 @@ respawn_delay = 25 attack_radius = 11 wander_radius = 9 immune_death = true +drop_table = "desert_lizard" hunt_mode = "cowardly" -categories = ["small_lizard", "lizard", "lizards"] +drop_table = "small_lizard" +combat_anims = "lizard" +combat_sounds = "lizard" +categories = ["lizards"] examine = "A cold-blooded creature, partial to warmth." [desert_lizard_yellow] diff --git a/data/entity/npc/monster/scorpion/scorpion.npcs.toml b/data/entity/npc/monster/scorpion/scorpion.npcs.toml index 5ae629bb8b..a6ab481015 100644 --- a/data/entity/npc/monster/scorpion/scorpion.npcs.toml +++ b/data/entity/npc/monster/scorpion/scorpion.npcs.toml @@ -10,6 +10,9 @@ respawn_delay = 25 slayer_xp = 17.0 wander_radius = 5 attack_radius = 7 +drop_table = "scorpion" +combat_anims = "scorpion" +combat_sounds = "scorpion" categories = ["scorpions"] examine = "An extremely vicious scorpion." @@ -20,14 +23,15 @@ att = 16 str = 17 def = 15 poison = 30 -drop_table = "empty" max_hit_melee = 30 style = "stab" respawn_delay = 25 slayer_xp = 23.0 wander_radius = 5 attack_radius = 7 -categories = ["scorpion", "scorpions"] +combat_anims = "scorpion" +combat_sounds = "scorpion" +categories = ["scorpions"] examine = "It has a very vicious looking tail." [pit_scorpion] @@ -36,7 +40,6 @@ hitpoints = 320 att = 23 str = 23 def = 23 -drop_table = "empty" max_hit_melee = 30 hunt_mode = "cowardly" style = "stab" @@ -44,7 +47,9 @@ respawn_delay = 50 slayer_xp = 32.0 wander_radius = 5 attack_radius = 7 -categories = ["small_scorpion", "scorpion", "scorpions"] +combat_anims = "small_scorpion" +combat_sounds = "scorpion" +categories = ["scorpions"] examine = "Tiny, annoying, stinging thing." [king_scorpion] @@ -53,7 +58,6 @@ hitpoints = 300 att = 30 str = 29 def = 23 -drop_table = "empty" max_hit_melee = 40 hunt_mode = "cowardly" style = "stab" @@ -61,7 +65,9 @@ respawn_delay = 25 slayer_xp = 30.0 wander_radius = 5 attack_radius = 7 -categories = ["scorpion", "scorpions"] +combat_anims = "scorpion" +combat_sounds = "scorpion" +categories = ["scorpions"] examine = "Wow! Scorpions shouldn't grow that big." [khazard_scorpion] @@ -70,14 +76,15 @@ hitpoints = 400 att = 40 str = 39 def = 34 -drop_table = "empty" max_hit_melee = 50 hunt_mode = "cowardly" style = "stab" slayer_xp = 30.0 wander_radius = 5 attack_radius = 7 -categories = ["scorpion", "scorpions"] +combat_anims = "scorpion" +combat_sounds = "scorpion" +categories = ["scorpions"] examine = "A large angry scorpion." [grave_scorpion] @@ -86,7 +93,6 @@ hitpoints = 70 att = 11 str = 12 def = 14 -drop_table = "empty" max_hit_melee = 20 hunt_mode = "cowardly" style = "stab" @@ -94,7 +100,9 @@ respawn_delay = 50 slayer_xp = 7.0 wander_radius = 5 attack_radius = 7 -categories = ["small_scorpion", "scorpion", "scorpions"] +combat_anims = "small_scorpion" +combat_sounds = "scorpion" +categories = ["scorpions"] examine = "A vicious, little, stinging thing." [scorpion_ape_atoll] @@ -112,7 +120,9 @@ respawn_delay = 50 slayer_xp = 15.0 wander_radius = 5 attack_radius = 7 -categories = ["small_scorpion", "scorpion", "scorpions"] +combat_anims = "small_scorpion" +combat_sounds = "scorpion" +categories = ["scorpions"] examine = "It's an extremely dangerous looking scorpion." [scorpion_stronghold_of_security] @@ -121,7 +131,6 @@ hitpoints = 550 att = 50 str = 52 def = 50 -drop_table = "empty" max_hit_melee = 60 hunt_mode = "cowardly" style = "stab" @@ -129,7 +138,9 @@ respawn_delay = 22 slayer_xp = 55.0 wander_radius = 5 attack_radius = 7 -categories = ["scorpion", "scorpions"] +combat_anims = "scorpion" +combat_sounds = "scorpion" +categories = ["scorpions"] examine = "An extremely vicious scorpion." [scorpion_stronghold_of_security_red] @@ -138,7 +149,6 @@ hitpoints = 370 att = 31 str = 32 def = 31 -drop_table = "empty" max_hit_melee = 40 hunt_mode = "cowardly" style = "stab" @@ -146,5 +156,7 @@ respawn_delay = 25 slayer_xp = 37.0 wander_radius = 5 attack_radius = 7 -categories = ["scorpion", "scorpions"] +combat_anims = "scorpion" +combat_sounds = "scorpion" +categories = ["scorpions"] examine = "An extremely vicious scorpion." \ No newline at end of file diff --git a/data/entity/npc/monster/skeletal_wyvern/skeletal_wyvern.npcs.toml b/data/entity/npc/monster/skeletal_wyvern/skeletal_wyvern.npcs.toml index 14abaed151..cb790edbf4 100644 --- a/data/entity/npc/monster/skeletal_wyvern/skeletal_wyvern.npcs.toml +++ b/data/entity/npc/monster/skeletal_wyvern/skeletal_wyvern.npcs.toml @@ -15,6 +15,6 @@ style = "slash" wander_radius = 5 attack_radius = 5 respawn_delay = 15 -categories = ["skeletal_wyvern"] +categories = ["skeletal_wyverns"] slayer_xp = 210.0 examine = "A very dangerous pile of animated wyvern bones." \ No newline at end of file diff --git a/data/entity/npc/monster/spider/spider.anims.toml b/data/entity/npc/monster/spider/spider.anims.toml index 13ecea28ae..d378638616 100644 --- a/data/entity/npc/monster/spider/spider.anims.toml +++ b/data/entity/npc/monster/spider/spider.anims.toml @@ -6,3 +6,12 @@ id = 5328 [giant_spider_death] id = 5329 + +[spider_attack] +id = 6249 + +[spider_defend] +id = 6250 + +[spider_death] +id = 6251 diff --git a/data/entity/npc/monster/spider/spider.npcs.toml b/data/entity/npc/monster/spider/spider.npcs.toml index 9285a311f1..a9584a2f31 100644 --- a/data/entity/npc/monster/spider/spider.npcs.toml +++ b/data/entity/npc/monster/spider/spider.npcs.toml @@ -10,7 +10,9 @@ slayer_xp = 5.0 max_hit_melee = 10 style = "stab" respawn_delay = 45 -categories = ["giant_spider", "spiders"] +combat_anims = "giant_spider" +combat_sounds = "giant_spider" +categories = ["giant_spiders", "spiders"] height = 10 examine = "I think this spider has been genetically modified." @@ -27,7 +29,9 @@ hunt_range = 1 slayer_xp = 33.0 max_hit_melee = 30 style = "stab" -categories = ["giant_spider", "spiders"] +combat_anims = "giant_spider" +combat_sounds = "giant_spider" +categories = ["giant_spiders", "spiders"] height = 10 examine = "I think this spider has been genetically modified." @@ -45,7 +49,9 @@ hunt_range = 1 slayer_xp = 50.0 max_hit_melee = 70 style = "stab" -categories = ["giant_spider", "spiders"] +combat_anims = "giant_spider" +combat_sounds = "giant_spider" +categories = ["giant_spiders", "spiders"] height = 10 examine = "I think this spider has been genetically modified." @@ -59,7 +65,9 @@ wander_radius = 9 respawn_delay = 35 style = "stab" slayer_xp = 2.0 -categories = ["spider", "spiders"] +combat_anims = "spider" +combat_sounds = "spider" +categories = ["spiders"] height = 10 examine = "Incey wincey." @@ -82,7 +90,9 @@ wander_radius = 9 respawn_delay = 27 style = "stab" slayer_xp = 22.0 -categories = ["spider", "spiders"] +combat_anims = "spider" +combat_sounds = "spider" +categories = ["spiders"] height = 10 examine = "I think this spider has been genetically modified." @@ -96,9 +106,11 @@ hunt_mode = "cowardly" clone = "spider" style = "slash" poison = 10 +combat_anims = "spider" +combat_sounds = "spider" examine = "It's an extremely small brown spider, probably very poisonous." [spider_haunted_woods] id = 1221 -categories = ["spider", "spiders"] +categories = ["spiders"] examine = "Nasty little creature." \ No newline at end of file diff --git a/data/entity/npc/monster/spider/spider.sounds.toml b/data/entity/npc/monster/spider/spider.sounds.toml index d7bd361367..e034a621ee 100644 --- a/data/entity/npc/monster/spider/spider.sounds.toml +++ b/data/entity/npc/monster/spider/spider.sounds.toml @@ -6,3 +6,12 @@ id = 3607 [giant_spider_death] id = 3606 + +[spider_attack] +id = 3604 + +[spider_defend] +id = 3609 + +[spider_death] +id = 3608 diff --git a/data/entity/npc/monster/undead/ankou/ankou.npcs.toml b/data/entity/npc/monster/undead/ankou/ankou.npcs.toml index e232c519c3..4b207a8b6a 100644 --- a/data/entity/npc/monster/undead/ankou/ankou.npcs.toml +++ b/data/entity/npc/monster/undead/ankou/ankou.npcs.toml @@ -12,9 +12,9 @@ respawn_delay = 50 slayer_xp = 60.0 attack_radius = 15 wander_radius = 13 -attack_anim = "human_attack" -defend_anim = "human_defend" -death_anim = "human_death" +combat_anims = "human" +combat_sounds = "ankou" +drop_table = "ankou" categories = ["ankou"] examine = "A boney ghost." diff --git a/data/entity/npc/monster/undead/banshee/banshee.npcs.toml b/data/entity/npc/monster/undead/banshee/banshee.npcs.toml index 79fe4adddd..4499e51030 100644 --- a/data/entity/npc/monster/undead/banshee/banshee.npcs.toml +++ b/data/entity/npc/monster/undead/banshee/banshee.npcs.toml @@ -13,7 +13,9 @@ combat_type = "magic" hit_splat = "melee" attack_sound = "nothing" hunt_mode = "cowardly" -categories = ["banshee", "banshees", "undead"] +combat_anims = "banshee" +combat_sounds = "banshee" +categories = ["banshees", "undead"] examine = "A tortured screaming soul." [mighty_banshee] @@ -31,5 +33,8 @@ combat_type = "magic" hit_splat = "melee" attack_sound = "nothing" hunt_mode = "cowardly" -categories = ["banshee", "banshees", "undead"] +drop_table = "banshee" +combat_anims = "banshee" +combat_sounds = "banshee" +categories = ["banshees", "undead"] examine = "Not the best of vocalists." \ No newline at end of file diff --git a/data/entity/npc/monster/undead/crawling_hand/crawling_hand.npcs.toml b/data/entity/npc/monster/undead/crawling_hand/crawling_hand.npcs.toml index 4659f0bf92..41552c3bd0 100644 --- a/data/entity/npc/monster/undead/crawling_hand/crawling_hand.npcs.toml +++ b/data/entity/npc/monster/undead/crawling_hand/crawling_hand.npcs.toml @@ -10,7 +10,10 @@ slayer_xp = 16.0 respawn_delay = 15 attack_radius = 15 wander_radius = 13 -categories = ["crawling_hand", "crawling_hands", "undead"] +drop_table = "crawling_hand" +combat_anims = "crawling_hand" +combat_sounds = "crawling_hand" +categories = ["crawling_hands", "undead"] examine = "Gimme five. Actually, don't." [crawling_hand_black] @@ -29,7 +32,10 @@ slayer_xp = 12.0 respawn_delay = 15 attack_radius = 15 wander_radius = 13 -categories = ["crawling_hand", "crawling_hands", "undead"] +drop_table = "crawling_hand" +combat_anims = "crawling_hand" +combat_sounds = "crawling_hand" +categories = ["crawling_hands", "undead"] examine = "Gimme five. Actually, don't." [crawling_hand_ring] @@ -52,10 +58,10 @@ slayer_xp = 19.0 respawn_delay = 15 attack_radius = 15 wander_radius = 13 -attack_anim = "crawling_hand_large_attack" -defend_anim = "crawling_hand_large_defend" -death_anim = "crawling_hand_large_death" -categories = ["crawling_hand", "crawling_hands", "undead"] +combat_anims = "crawling_hand_large" +combat_sounds = "crawling_hand" +drop_table = "crawling_hand" +categories = ["crawling_hands", "undead"] examine = "Now, that's handy." [crawling_hand_large_black] @@ -75,10 +81,10 @@ slayer_xp = 15.0 respawn_delay = 15 attack_radius = 15 wander_radius = 13 -attack_anim = "crawling_hand_large_attack" -defend_anim = "crawling_hand_large_defend" -death_anim = "crawling_hand_large_death" -categories = ["crawling_hand", "crawling_hands", "undead"] +combat_anims = "crawling_hand_large" +combat_sounds = "crawling_hand" +drop_table = "crawling_hand" +categories = ["crawling_hands", "undead"] examine = "A big severed hand." [crawling_hand_large_ring] diff --git a/data/entity/npc/monster/undead/ghost/ghost.anims.toml b/data/entity/npc/monster/undead/ghost/ghost.anims.toml index 92a7681d87..bf6df983b9 100644 --- a/data/entity/npc/monster/undead/ghost/ghost.anims.toml +++ b/data/entity/npc/monster/undead/ghost/ghost.anims.toml @@ -7,11 +7,11 @@ id = 5533 [ghost_death] id = 5534 -[ghost_tendrill_attack] +[ghost_tendril_attack] id = 5540 -[ghost_tendrill_defend] +[ghost_tendril_defend] id = 5541 -[ghost_tendrill_death] +[ghost_tendril_death] id = 5542 diff --git a/data/entity/npc/monster/undead/ghost/ghost.npcs.toml b/data/entity/npc/monster/undead/ghost/ghost.npcs.toml index 9b20aa0ec3..5723333bdb 100644 --- a/data/entity/npc/monster/undead/ghost/ghost.npcs.toml +++ b/data/entity/npc/monster/undead/ghost/ghost.npcs.toml @@ -11,15 +11,15 @@ respawn_delay = 40 attack_radius = 11 wander_radius = 10 hunt_mode = "cowardly" -categories = ["ghost", "ghosts", "undead"] +combat_anims = "ghost" +combat_sounds = "ghost" +categories = ["ghosts", "undead"] examine = "Eeek! A ghost!" [ghost] id = 103 clone = "ghost_draynor_manor" -attack_anim = "ghost_tendril_attack" -defend_anim = "ghost_tendril_defend" -death_anim = "ghost_tendril_death" +combat_anims = "ghost_tendril" [ghost_3] id = 5342 @@ -77,10 +77,9 @@ slayer_xp = 30.0 attack_radius = 11 wander_radius = 10 hunt_mode = "cowardly" -attack_anim = "ghost_tendril_attack" -defend_anim = "ghost_tendril_defend" -death_anim = "ghost_tendril_death" -categories = ["ghost", "ghosts", "undead"] +combat_anims = "ghost_tendril" +combat_sounds = "ghost" +categories = ["ghosts", "undead"] examine = "Eeek! A ghost!" [haze_abandoned_mine] @@ -103,15 +102,15 @@ respawn_delay = 40 slayer_xp = 80.0 attack_radius = 11 wander_radius = 9 -categories = ["ghost", "ghosts", "undead"] +combat_anims = "ghost" +combat_sounds = "ghost" +categories = ["ghosts", "undead"] examine = "Eeek! A ghost!" [stronghold_ghost] id = 4387 clone = "stronghold_ghost_hair" -attack_anim = "ghost_tendril_attack" -defend_anim = "ghost_tendril_defend" -death_anim = "ghost_tendril_death" +combat_anims = "ghost_tendril" [stronghold_ghost_cape] id = 4388 diff --git a/data/entity/npc/monster/undead/shade/shade.npcs.toml b/data/entity/npc/monster/undead/shade/shade.npcs.toml index e28905845d..197436d4da 100644 --- a/data/entity/npc/monster/undead/shade/shade.npcs.toml +++ b/data/entity/npc/monster/undead/shade/shade.npcs.toml @@ -12,5 +12,7 @@ slayer_xp = 3.5 attack_radius = 11 wander_radius = 9 xp_bonus = -0.75 -categories = ["shade", "shades", "undead"] +combat_anims = "shade" +combat_sounds = "shade" +categories = ["shades", "undead"] examine = "Dead, but not gone." \ No newline at end of file diff --git a/data/entity/npc/monster/undead/skeleton/skeletons.npcs.toml b/data/entity/npc/monster/undead/skeleton/skeletons.npcs.toml index 4807dc82c1..18649a5862 100644 --- a/data/entity/npc/monster/undead/skeleton/skeletons.npcs.toml +++ b/data/entity/npc/monster/undead/skeleton/skeletons.npcs.toml @@ -9,7 +9,8 @@ attack_radius = 11 style = "magic" max_hit_magic = 30 slayer_xp = 13.8 -categories = ["skeleton", "undead", "skeletons"] +combat_anims = "skeleton" +categories = ["skeletons", "undead"] examine = "It rattles when it moves." [skeleton_mace_shield] @@ -25,7 +26,8 @@ hunt_mode = "aggressive_intolerant" style = "slash" height = 30 respawn_delay = 60 -categories = ["skeleton", "undead", "skeletons"] +combat_anims = "skeleton" +categories = ["skeletons", "undead"] slayer_xp = 17.0 examine = "Could do with gaining a few pounds." @@ -55,7 +57,8 @@ style = "crush" height = 30 respawn_delay = 70 slayer_xp = 29.0 -categories = ["skeleton", "undead", "skeletons"] +combat_anims = "skeleton" +categories = ["skeletons", "undead"] examine = "Could do with gaining a few pounds." [skeleton_shield_helmet] @@ -91,7 +94,8 @@ hunt_mode = "aggressive" style = "slash" height = 30 respawn_delay = 60 -categories = ["skeleton", "undead", "skeletons"] +combat_anims = "skeleton" +categories = ["skeletons", "undead"] examine = "Could do with gaining a few pounds." [skeleton_sword_shield_85] @@ -111,7 +115,8 @@ slayer_xp = 70.0 attack_radius = 11 wander_radius = 9 hunt_mode = "cowardly" -categories = ["skeleton", "skeletons", "undead"] +combat_anims = "skeleton" +categories = ["skeletons", "undead"] examine = "Could do with gaining a few pounds." [stronghold_skeleton_helmet] @@ -128,7 +133,7 @@ slayer_xp = 70.0 attack_radius = 11 wander_radius = 9 hunt_mode = "cowardly" -categories = ["skeleton", "skeletons", "undead"] +categories = ["skeletons", "undead"] examine = "Could do with gaining a few pounds." [skeleton_hammer_shield] diff --git a/data/entity/npc/monster/undead/zombie/zombie.drops.toml b/data/entity/npc/monster/undead/zombie/zombie.drops.toml index 3b6c3f24d2..992f0b5b59 100644 --- a/data/entity/npc/monster/undead/zombie/zombie.drops.toml +++ b/data/entity/npc/monster/undead/zombie/zombie.drops.toml @@ -92,14 +92,14 @@ drops = [ { table = "gem_drop_table" }, ] -[zombie_melzars_maze] +[zombie_melzars_maze_drop_table] type = "all" drops = [ { table = "bones" }, { id = "key_blue" }, ] -[zombie_tarns_lair_low] +[zombie_tarns_lair_low_drop_table] type = "all" drops = [ { table = "bones" }, @@ -151,7 +151,7 @@ drops = [ { table = "gem_drop_table" }, ] -[zombie_tarns_lair_mid] +[zombie_tarns_lair_mid_drop_table] type = "all" drops = [ { table = "bones" }, @@ -202,7 +202,7 @@ drops = [ { table = "gem_drop_table" }, ] -[zombie_tarns_lair_high] +[zombie_tarns_lair_high_drop_table] type = "all" drops = [ { table = "bones" }, diff --git a/data/entity/npc/monster/undead/zombie/zombie.npcs.toml b/data/entity/npc/monster/undead/zombie/zombie.npcs.toml index c933fd7836..f9bea9b007 100644 --- a/data/entity/npc/monster/undead/zombie/zombie.npcs.toml +++ b/data/entity/npc/monster/undead/zombie/zombie.npcs.toml @@ -13,7 +13,10 @@ max_hit_melee = 20 hunt_mode = "cowardly" style = "slash" respawn_delay = 35 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +combat_anims = "zombie" +combat_sounds = "zombie" +categories = ["zombies", "undead"] examine = "Dead man walking." [zombie_green_shorts] @@ -82,21 +85,19 @@ hunt_mode = "cowardly" style = "slash" respawn_delay = 35 drop_table = "zombie_empty" -categories = ["zombie", "zombies", "undead"] +combat_anims = "zombie" +combat_sounds = "zombie" +categories = ["zombies", "undead"] [zombie_blue_skirt_sword] id = 74 clone = "zombie_brown_shorts" -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" [zombie_tan_trousers_axe] id = 5309 clone = "zombie_brown_shorts" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" # Level 24s [zombie_yellow_shirt] @@ -114,29 +115,25 @@ max_hit_melee = 30 hunt_mode = "cowardly" style = "slash" respawn_delay = 35 +combat_anims = "zombie" +combat_sounds = "zombie" drop_table = "zombie_armed" -categories = ["zombie", "zombies", "undead"] +categories = ["zombies", "undead"] [zombie_green_shorts_sword] id = 75 clone = "zombie_yellow_shirt" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_armour_green_shorts_sword] id = 5314 clone = "zombie_yellow_shirt" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_armour_grey_shorts_sword] id = 5315 clone = "zombie_yellow_shirt" -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" [zombie_red_outfit] id = 5311 @@ -153,23 +150,17 @@ clone = "zombie_yellow_shirt" [zombie_red_suit_sword] id = 5316 clone = "zombie_yellow_shirt" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_grey_suit_sword] id = 5318 clone = "zombie_yellow_shirt" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_tan_trousers_axe_2] id = 5319 clone = "zombie_yellow_shirt" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_tan_shorts_axe] id = 5320 @@ -178,50 +169,37 @@ clone = "zombie_yellow_shirt" [zombie_red_skirt_sword] id = 5321 clone = "zombie_yellow_shirt" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_blue_skirt_sword_2] id = 5322 clone = "zombie_yellow_shirt" -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" [zombie_yellow_shirt_sword] id = 5323 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +clone = "zombie_yellow_shirt" +combat_anims = "zombie_weapon" [zombie_red_sword] id = 5324 clone = "zombie_yellow_shirt_sword" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_grey_axe] id = 5325 clone = "zombie_yellow_shirt_sword" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_red_maid_axe] id = 5326 clone = "zombie_yellow_shirt_sword" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_blue_maid_axe] id = 5327 clone = "zombie_yellow_shirt_sword" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" # Level 25s @@ -235,14 +213,13 @@ attack_bonus = 5 max_hit_melee = 30 style = "slash" drop_table = "zombie_entrana" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" respawn_delay = 35 slayer_xp = 30.0 wander_radius = 8 attack_radius = 12 -categories = ["zombie", "zombies", "undead"] +categories = ["zombies", "undead"] examine = "The walking dead." [zombie_entrana_armour] @@ -273,13 +250,13 @@ wander_radius = 10 attack_radius = 12 slayer_xp = 30.0 max_hit_melee = 30 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" hunt_mode = "cowardly" style = "slash" respawn_delay = 35 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie_melzars_maze" +categories = ["zombies", "undead"] examine = "Dead man walking." [zombie_melzars_maze_strong] @@ -304,7 +281,10 @@ max_hit_melee = 40 hunt_mode = "cowardly" style = "slash" respawn_delay = 35 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +combat_anims = "zombie" +combat_sounds = "zombie" +categories = ["zombies", "undead"] examine = "Dead man walking." [zombie_stronghold_of_security_blue_skirt] @@ -329,13 +309,13 @@ wander_radius = 10 attack_radius = 12 slayer_xp = 40.0 max_hit_melee = 50 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" hunt_mode = "cowardly" style = "slash" respawn_delay = 35 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +combat_sounds = "zombie" +categories = ["zombies", "undead"] examine = "Dead man walking." [zombie_stronghold_of_security_trousers] @@ -359,21 +339,19 @@ wander_radius = 10 attack_radius = 12 slayer_xp = 50.0 max_hit_melee = 30 -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" +combat_sounds = "zombie" hunt_mode = "cowardly" style = "slash" respawn_delay = 35 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "The walking dead." [zombie_stronghold_of_security_male] id = 5380 clone = "zombie_stronghold_of_security_female" -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" [zombie_stronghold_of_security_red] id = 4394 @@ -389,14 +367,14 @@ wander_radius = 10 attack_radius = 12 slayer_xp = 38.0 max_hit_melee = 50 -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_low" hunt_mode = "cowardly" style = "crush" respawn_delay = 35 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "Could his name be 'Lurch'?" [zombie_tarns_lair_tan_boots] @@ -409,14 +387,14 @@ slayer_xp = 40.0 max_hit_melee = 50 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_low" hunt_mode = "cowardly" style = "crush" respawn_delay = 35 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "Mostly 'armless." [zombie_tarns_lair_grey_boots] @@ -429,14 +407,14 @@ slayer_xp = 42.0 max_hit_melee = 60 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_low" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "Has anybody told him he's dead?" [zombie_tarns_lair_red_boots_hat] @@ -449,14 +427,14 @@ slayer_xp = 48.0 max_hit_melee = 60 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_low" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "Dave? Is that you?" [zombie_tarns_lair_tan_boots_hair] @@ -469,14 +447,14 @@ slayer_xp = 50.0 max_hit_melee = 70 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_low" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "Why don't zombies ever wash?" [zombie_tarns_lair_green_boots_hair] @@ -489,14 +467,14 @@ slayer_xp = 57.0 max_hit_melee = 70 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_mid" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "A shambling pile of rotten flesh." [zombie_tarns_lair_red_top] @@ -509,14 +487,14 @@ slayer_xp = 63.0 max_hit_melee = 80 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_dragging_attack" -defend_anim = "zombie_dragging_defend" -death_anim = "zombie_dragging_death" +combat_anims = "zombie_dragging" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_mid" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "He needs lessons on walking." [zombie_tarns_lair_brown_top] @@ -529,14 +507,14 @@ slayer_xp = 65.0 max_hit_melee = 80 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_mid" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "Fred, the undead." [zombie_tarns_lair_armour] @@ -549,14 +527,14 @@ slayer_xp = 68.0 max_hit_melee = 80 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_mid" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "One of the undead." [zombie_tarns_lair_yellow_shirt] @@ -569,14 +547,14 @@ slayer_xp = 68.0 max_hit_melee = 90 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_mid" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "A disgusting zombie." [zombie_tarns_lair_grey_shirt] @@ -589,14 +567,14 @@ slayer_xp = 73.0 max_hit_melee = 90 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_mid" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "Somebody tell him he's already dead!" [zombie_tarns_lair_blue_shirt] @@ -609,14 +587,14 @@ slayer_xp = 75.0 max_hit_melee = 100 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_high" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "He sure looks grave." [zombie_tarns_lair_tan_trousers] @@ -629,14 +607,14 @@ slayer_xp = 76.0 max_hit_melee = 100 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_high" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "Can't a body get any rest around here?" [zombie_tarns_lair_grey_trousers] @@ -649,14 +627,14 @@ slayer_xp = 81.0 max_hit_melee = 100 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_high" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "At least he's not legless." [zombie_tarns_lair_green_trousers] @@ -669,14 +647,14 @@ slayer_xp = 92.0 max_hit_melee = 100 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_high" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "All skin and bones." [zombie_tarns_lair_brown_trousers] @@ -689,14 +667,14 @@ slayer_xp = 96.0 max_hit_melee = 110 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_high" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "All skin and bones." [zombie_tarns_lair_blue_trousers] @@ -709,14 +687,14 @@ slayer_xp = 102.0 max_hit_melee = 110 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_high" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "All skin and bones." [zombie_tarns_lair_light_grey_trousers] @@ -729,12 +707,12 @@ slayer_xp = 76.0 max_hit_melee = 90 wander_radius = 10 attack_radius = 12 -attack_anim = "zombie_weapon_attack" -defend_anim = "zombie_weapon_defend" -death_anim = "zombie_weapon_death" +combat_anims = "zombie_weapon" +combat_sounds = "zombie" drop_table = "zombie_tarns_lair_high" hunt_mode = "cowardly" style = "crush" respawn_delay = 50 -categories = ["zombie", "zombies", "undead"] +drop_table = "zombie" +categories = ["zombies", "undead"] examine = "Brains..." diff --git a/data/entity/obj/balloon/balloon_transport.ifaces.toml b/data/entity/obj/balloon/balloon_transport.ifaces.toml new file mode 100644 index 0000000000..67ea751283 --- /dev/null +++ b/data/entity/obj/balloon/balloon_transport.ifaces.toml @@ -0,0 +1,6 @@ +[balloon_map] +id = 469 +# Grand Tree, Castle Wars, Entrana, Crafting Guild, Taverley, Varrock + +[balloon_side] +id = 471 diff --git a/data/entity/obj/boat/charter_ship.areas.toml b/data/entity/obj/boat/charter_ship.areas.toml new file mode 100644 index 0000000000..035e7e46d2 --- /dev/null +++ b/data/entity/obj/boat/charter_ship.areas.toml @@ -0,0 +1,40 @@ +[port_sarim] +x = [3008, 3064] +y = [3171, 3263] + +[port_tyras] +x = [2140, 2158] +y = [3115, 3128] + +[port_khazard] +x = [2624, 2687] +y = [3136, 3199] + +[brimhaven] +x = [2752, 2815] +y = [3145, 3240] + +[musa_point] +x = [2895, 2895, 2914, 2961, 2961] +y = [3136, 3194, 3194, 3160, 3136] + +[shipyard] +x = [2944, 3007] +y = [3008, 3071] + +[catherby] +x = [2790, 2790, 2834, 2834, 2842, 2844, 2838, 2863, 2866, 2866] +y = [3409, 3475, 3475, 3464, 3460, 3455, 3450, 3436, 3432, 3409] + +[port_phasmatys] +x = [3650, 3650, 3653, 3653, 3655, 3668, 3677, 3688, 3688, 3718, 3718] +y = [3456, 3471, 3474, 3505, 3507, 3507, 3516, 3516, 3532, 3532, 3456] + +[oo_glog] +x = [2515, 2515, 2523, 2537, 2543, 2556, 2629, 2629, 2566, 2558, 2518] +y = [2832, 2845, 2856, 2864, 2864, 2870, 2870, 2834, 2835, 2829, 2829] + +[mos_le_harmless] +x = [3646, 3646, 3710, 3710, 3711, 3711] +y = [2925, 3006, 3006, 2980, 2976, 2925] + diff --git a/data/entity/obj/boat/charter_ship.ifaces.toml b/data/entity/obj/boat/charter_ship.ifaces.toml index c1fc724846..b7e69bd07e 100644 --- a/data/entity/obj/boat/charter_ship.ifaces.toml +++ b/data/entity/obj/boat/charter_ship.ifaces.toml @@ -1,2 +1,40 @@ [charter_ship_map] id = 95 +components = { + port_tyras = 23, + port_phasmatys = 24, + catherby = 25, + shipyard = 26, + musa_point = 27, + brimhaven = 28, + port_khazard = 29, + port_sarim = 30, + mos_le_harmless = 31, + crandor = 32, + oo_glog = 33, + close = 34, +} + +[waterbirth_island_map] +id = 224 +# Rellekka, Neitiznot, Jatizo, Waterbirth Island, Miscellania, Etceteria + +[mithalin_asgarnia_map] +id = 270 +# Edgeville, Falador, Varrock, Rimmington, Port Sarim, Draynor, Lumbridge, Al Kharid + +[journey_ship] +id = 299 +# Feldip Hills, Ape Atoll, Port Khazard, Ardougne, Entrana, Brimhaven, Crandor, Karamja, Ship Yard, Port Sarim, Asgarnia + +[lunar_galleon_map] +id = 431 +# Moonclan Island, Pirates' Cove + +[penguin_ship_map] +id = 505 +# Keldagrim entrance, Rellekka, Neitiznot, Jatizo, Miscellania, Etceteria + +[trollweiss_map] +id = 727 +# Trollweiss Mountain, Keldagrim entrance, Ice Path, God Wars Dungeon, Waterbirth Island, Miscellania, Etceteria \ No newline at end of file diff --git a/data/entity/obj/boat/charter_ship.npcs.toml b/data/entity/obj/boat/charter_ship.npcs.toml new file mode 100644 index 0000000000..66f9d1264b --- /dev/null +++ b/data/entity/obj/boat/charter_ship.npcs.toml @@ -0,0 +1,48 @@ +[trader_stan] +id = 4650 +categories = ["human"] +wander_radius = 2 +shop = "trader_stans_trading_post" +examine = "With the prices he charges, no wonder he can afford to look so sharp." + +[trader_crewmember_black] +id = 4651 +categories = ["human"] +wander_radius = 2 +shop = "trader_stans_trading_post" +examine = "Looks very stylish, but how can he sail in that gear?" + +[trader_crewmember_grey] +id = 4652 +categories = ["human"] +wander_radius = 2 +shop = "trader_stans_trading_post" +examine = "That suit looks a little briny around the edges." + +[trader_crewmember_hat] +id = 4653 +categories = ["human"] +wander_radius = 2 +shop = "trader_stans_trading_post" +examine = "First storm he is in that hat will blow away." + +[trader_crewmember_pink] +id = 4654 +categories = ["human"] +wander_radius = 2 +shop = "trader_stans_trading_post" +examine = "She'll never be able to climb rigging in that." + +[trader_crewmember_purple] +id = 4655 +categories = ["human"] +wander_radius = 2 +shop = "trader_stans_trading_post" +examine = "High heels on a ship? What is she thinking?" + +[trader_crewmember_blue] +id = 4656 +categories = ["human"] +wander_radius = 2 +shop = "trader_stans_trading_post" +examine = "The effect is sort of spoiled by all those tattoos." diff --git a/data/entity/obj/boat/charter_ship.objs.toml b/data/entity/obj/boat/charter_ship.objs.toml new file mode 100644 index 0000000000..e96d3304d2 --- /dev/null +++ b/data/entity/obj/boat/charter_ship.objs.toml @@ -0,0 +1,79 @@ +[port_sarim_gangplank_enter] +id = 17404 +examine = "Handy for boarding boats." + +[port_sarim_gangplank_exit] +id = 17405 +examine = "Handy for boarding boats." + +[catherby_gangplank_enter] +id = 17394 +examine = "Handy for boarding boats." + +[catherby_gangplank_exit] +id = 17395 +examine = "Handy for boarding boats." + +[brimhaven_gangplank_enter] +id = 17400 +examine = "Handy for boarding boats." + +[brimhaven_gangplank_exit] +id = 17401 +examine = "Handy for boarding boats." + +[port_khazard_gangplank_enter] +id = 17402 +examine = "Handy for boarding boats." + +[port_khazard_gangplank_exit] +id = 17403 +examine = "Handy for boarding boats." + +[mos_le_harmless_gangplank_enter] +id = 17406 +examine = "Handy for boarding boats." + +[mos_le_harmless_gangplank_exit] +id = 17407 +examine = "Handy for boarding boats." + +[port_tyras_gangplank_enter] +id = 17408 +examine = "Handy for boarding boats." + +[port_tyras_gangplank_exit] +id = 17409 +examine = "Handy for boarding boats." + +[shipyard_gangplank_enter] +id = 17396 +examine = "Handy for boarding boats." + +[shipyard_gangplank_exit] +id = 17397 +examine = "Handy for boarding boats." + +[port_phasmatys_gangplank_enter] +id = 17392 +examine = "Handy for boarding boats." + +[port_phasmatys_gangplank_exit] +id = 17393 +examine = "Handy for boarding boats." + +[oo_glog_gangplank_enter] +id = 29168 +examine = "Handy for boarding boats." + +[oo_glog_gangplank_exit] +id = 29169 +examine = "Handy for boarding boats." + +[musa_point_gangplank_enter] +id = 17398 +examine = "Handy for boarding boats." + +[musa_point_gangplank_exit] +id = 17399 +examine = "Handy for boarding boats." diff --git a/data/entity/obj/boat/charter_ship.teles.toml b/data/entity/obj/boat/charter_ship.teles.toml new file mode 100644 index 0000000000..4498d4c2ed --- /dev/null +++ b/data/entity/obj/boat/charter_ship.teles.toml @@ -0,0 +1,99 @@ +[port_sarim_gangplank_enter] +option = "Cross" +tile = { x = 3038, y = 3191 } +to = { x = 3038, y = 3189, level = 1 } + +[port_sarim_gangplank_exit] +option = "Cross" +tile = { x = 3038, y = 3190, level = 1 } +to = { x = 3038, y = 3192 } + +[catherby_gangplank_enter] +option = "Cross" +tile = { x = 2792, y = 3415 } +to = { x = 2792, y = 3417, level = 1 } + +[catherby_gangplank_exit] +option = "Cross" +tile = { x = 2792, y = 3416, level = 1 } +to = { x = 2792, y = 3414 } + +[brimhaven_gangplank_enter] +option = "Cross" +tile = { x = 2761, y = 3238 } +to = { x = 2763, y = 3238, level = 1 } + +[brimhaven_gangplank_exit] +option = "Cross" +tile = { x = 2762, y = 3238, level = 1 } +to = { x = 2760, y = 3238 } + +[port_khazard_gangplank_enter] +option = "Cross" +tile = { x = 2674, y = 3143 } +to = { x = 2674, y = 3141, level = 1 } + +[port_khazard_gangplank_exit] +option = "Cross" +tile = { x = 2674, y = 3142, level = 1 } +to = { x = 2674, y = 3144 } + +[mos_le_harmless_gangplank_enter] +option = "Cross" +tile = { x = 3670, y = 2931 } +to = { x = 3668, y = 2931, level = 1 } + +[mos_le_harmless_gangplank_exit] +option = "Cross" +tile = { x = 3669, y = 2931, level = 1 } +to = { x = 3671, y = 2931 } + +[shipyard_gangplank_enter] +option = "Cross" +tile = { x = 3000, y = 3032 } +to = { x = 2998, y = 3032, level = 1 } + +[shipyard_gangplank_exit] +option = "Cross" +tile = { x = 2999, y = 3032, level = 1 } +to = { x = 3001, y = 3032 } + +[port_tyras_gangplank_enter] +option = "Cross" +tile = { x = 2142, y = 3123 } +to = { x = 2142, y = 3125, level = 1 } + +[port_tyras_gangplank_exit] +option = "Cross" +tile = { x = 2142, y = 3124, level = 1 } +to = { x = 2142, y = 3122 } + +[port_phasmatys_gangplank_enter] +option = "Cross" +tile = { x = 3703, y = 3503 } +to = { x = 3705, y = 3503, level = 1 } + +[port_phasmatys_gangplank_exit] +option = "Cross" +tile = { x = 3704, y = 3503, level = 1 } +to = { x = 3702, y = 3503 } + +[oo_glog_gangplank_enter] +option = "Cross" +tile = { x = 2624, y = 2857 } +to = { x = 2626, y = 2857, level = 1 } + +[oo_glog_gangplank_exit] +option = "Cross" +tile = { x = 2625, y = 2857, level = 1 } +to = { x = 2623, y = 2857 } + +[musa_point_gangplank_enter] +option = "Cross" +tile = { x = 2955, y = 3158 } +to = { x = 2957, y = 3158, level = 1 } + +[musa_point_gangplank_exit] +option = "Cross" +tile = { x = 2956, y = 3158, level = 1 } +to = { x = 2954, y = 3158 } diff --git a/data/entity/obj/boat/charter_ship_prices.toml b/data/entity/obj/boat/charter_ship_prices.toml new file mode 100644 index 0000000000..6aeb2a04ca --- /dev/null +++ b/data/entity/obj/boat/charter_ship_prices.toml @@ -0,0 +1,103 @@ +[brimhaven] +catherby = 480 +musa_point = 200 +mos_le_harmless = 1450 +port_khazard = 1600 +port_phasmatys = 2900 +port_sarim = 1600 +shipyard = 400 +port_tyras = 3200 +oo_glog = 3800 + +[catherby] +brimhaven = 480 +musa_point = 480 +mos_le_harmless = 1250 +port_khazard = 1600 +port_phasmatys = 3500 +port_sarim = 1000 +shipyard = 1600 +port_tyras = 3200 +oo_glog = 3400 + +[musa_point] +brimhaven = 200 +catherby = 480 +mos_le_harmless = 2050 +port_khazard = 1600 +port_phasmatys = 2900 +shipyard = 200 +port_tyras = 3200 +oo_glog = 2000 + +[mos_le_harmless] +brimhaven = 1950 +catherby = 3500 +musa_point = 450 +port_khazard = 2050 +port_sarim = 650 +shipyard = 450 +port_tyras = 3200 +oo_glog = 1100 + +[port_khazard] +brimhaven = 400 +catherby = 1600 +musa_point = 400 +mos_le_harmless = 2050 +port_phasmatys = 4100 +port_sarim = 1280 +shipyard = 720 +port_tyras = 3200 +oo_glog = 5000 + +[port_phasmatys] +brimhaven = 2900 +catherby = 3500 +musa_point = 2900 +port_khazard = 4100 +port_sarim = 1300 +port_tyras = 3200 +oo_glog = 2800 + +[port_sarim] +brimhaven = 1600 +catherby = 1000 +mos_le_harmless = 650 +port_khazard = 1280 +port_phasmatys = 1300 +shipyard = 400 +port_tyras = 3200 +oo_glog = 1400 + +[shipyard] +brimhaven = 400 +catherby = 1600 +musa_point = 200 +mos_le_harmless = 550 +port_khazard = 1600 +port_sarim = 400 +port_tyras = 3200 +oo_glog = 900 + +[port_tyras] +brimhaven = 3200 +catherby = 3200 +musa_point = 3200 +mos_le_harmless = 3200 +port_khazard = 3200 +port_phasmatys = 3200 +port_sarim = 3200 +shipyard = 3200 +oo_glog = 3200 + +[oo_glog] +brimhaven = 3800 +catherby = 3400 +musa_point = 2000 +mos_le_harmless = 1000 +port_khazard = 5000 +port_phasmatys = 2800 +port_sarim = 1400 +shipyard = 900 +port_tyras = 3200 diff --git a/data/entity/npc/shop/trader_stans_trading_post.shops.toml b/data/entity/obj/boat/trader_stans_trading_post.shops.toml similarity index 100% rename from data/entity/npc/shop/trader_stans_trading_post.shops.toml rename to data/entity/obj/boat/trader_stans_trading_post.shops.toml diff --git a/data/skill/herblore/potion.recipes.toml b/data/skill/herblore/potion.recipes.toml index 8f02316caf..47d9659907 100644 --- a/data/skill/herblore/potion.recipes.toml +++ b/data/skill/herblore/potion.recipes.toml @@ -344,7 +344,7 @@ level = 76 xp = 172.5 ticks = 2 remove = ["lantadyme_potion_unf", "potato_cactus"] -add = ["magic_potion_3"] +add = ["super_magic_potion_3"] animation = "mixing_potion" message = "You mix the potato cactus into your potion" diff --git a/data/skill/slayer/turael.tasks.toml b/data/skill/slayer/turael.tasks.toml index 3945079a89..67223676eb 100644 --- a/data/skill/slayer/turael.tasks.toml +++ b/data/skill/slayer/turael.tasks.toml @@ -151,7 +151,7 @@ quest = "priest_in_peril" weight = 8 tip = "Banshees use a piercing scream to shock their enemies, you'll need some Earmuffs to protect yourself from them." -[cave_slime] +[cave_slimes] min = 10 max = 20 slayer_level = 17 diff --git a/data/skill/summoning/summoning.ifaces.toml b/data/skill/summoning/summoning.ifaces.toml index d1f8c0c353..dc72a47639 100644 --- a/data/skill/summoning/summoning.ifaces.toml +++ b/data/skill/summoning/summoning.ifaces.toml @@ -29,3 +29,6 @@ type = "dialogue_box" [familiar_options] id = 880 + +[summoning_side] +id = 722 \ No newline at end of file diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ExecuteCommandHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ExecuteCommandHandler.kt index a298f46af6..cfb4b389c2 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ExecuteCommandHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ExecuteCommandHandler.kt @@ -1,5 +1,6 @@ package world.gregs.voidps.engine.client.instruction.handle +import com.github.michaelbull.logging.InlineLogger import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.ui.event.Command import world.gregs.voidps.engine.client.ui.event.Command.Companion.adminHandlers @@ -12,6 +13,8 @@ import world.gregs.voidps.network.client.instruction.ExecuteCommand class ExecuteCommandHandler : InstructionHandler() { + private val logger = InlineLogger() + override fun validate(player: Player, instruction: ExecuteCommand) { val handler = if (player.isAdmin()) { adminHandlers[instruction.prefix] @@ -22,7 +25,11 @@ class ExecuteCommandHandler : InstructionHandler() { } if (handler != null) { Events.events.launch { - handler.invoke(Command(player, instruction.prefix, instruction.content), player) + try { + handler.invoke(Command(player, instruction.prefix, instruction.content), player) + } catch (exception: Exception) { + logger.warn(exception) { "An error occurred while executing command." } + } } } } diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/FloorItemOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/FloorItemOptionHandler.kt index cadbf92a13..ebe4b6eefd 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/FloorItemOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/FloorItemOptionHandler.kt @@ -3,6 +3,7 @@ package world.gregs.voidps.engine.client.instruction.handle import com.github.michaelbull.logging.InlineLogger import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.entity.character.mode.interact.Interact import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.chat.ChatType @@ -37,6 +38,7 @@ class FloorItemOptionHandler( player.message(floorItem.def.getOrNull("examine") ?: return, ChatType.ItemExamine) return } + player.closeInterfaces() player.mode = Interact(player, floorItem, FloorItemOption(player, floorItem, selectedOption), shape = -1) } } \ No newline at end of file diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnFloorItemOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnFloorItemOptionHandler.kt index 63dc25060c..a44f773f65 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnFloorItemOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnFloorItemOptionHandler.kt @@ -3,6 +3,7 @@ package world.gregs.voidps.engine.client.instruction.handle import com.github.michaelbull.logging.InlineLogger import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.instruction.InterfaceHandler +import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.client.ui.interact.InterfaceOnFloorItem import world.gregs.voidps.engine.client.ui.interact.ItemOnFloorItem import world.gregs.voidps.engine.entity.character.mode.interact.Interact @@ -31,6 +32,7 @@ class InterfaceOnFloorItemOptionHandler( } else { ItemOnFloorItem(player, floorItem, item, itemSlot, inventory) } + player.closeInterfaces() player.mode = Interact(player, floorItem, interaction, approachRange = -1) } } \ No newline at end of file diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnNPCOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnNPCOptionHandler.kt index c30c75d7fa..02b60bd8b7 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnNPCOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnNPCOptionHandler.kt @@ -2,6 +2,7 @@ package world.gregs.voidps.engine.client.instruction.handle import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.instruction.InterfaceHandler +import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.client.ui.dialogue.talkWith import world.gregs.voidps.engine.client.ui.interact.InterfaceOnNPC import world.gregs.voidps.engine.client.ui.interact.ItemOnNPC @@ -21,6 +22,7 @@ class InterfaceOnNPCOptionHandler( val (id, component, item, inventory) = handler.getInterfaceItem(player, interfaceId, componentId, itemId, itemSlot) ?: return + player.closeInterfaces() player.talkWith(npc) val interaction = if (item.isEmpty()) { InterfaceOnNPC( diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnObjectOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnObjectOptionHandler.kt index 9306ad420e..8f56b5f315 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnObjectOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnObjectOptionHandler.kt @@ -2,6 +2,7 @@ package world.gregs.voidps.engine.client.instruction.handle import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.instruction.InterfaceHandler +import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.client.ui.interact.InterfaceOnObject import world.gregs.voidps.engine.client.ui.interact.ItemOnObject import world.gregs.voidps.engine.entity.character.mode.interact.Interact @@ -43,6 +44,7 @@ class InterfaceOnObjectOptionHandler( inventory ) } + player.closeInterfaces() player.mode = Interact(player, obj, interaction) } } \ No newline at end of file diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnPlayerOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnPlayerOptionHandler.kt index 7623043c50..fdac41e405 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnPlayerOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/InterfaceOnPlayerOptionHandler.kt @@ -2,6 +2,7 @@ package world.gregs.voidps.engine.client.instruction.handle import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.instruction.InterfaceHandler +import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.client.ui.interact.InterfaceOnPlayer import world.gregs.voidps.engine.client.ui.interact.ItemOnPlayer import world.gregs.voidps.engine.entity.character.mode.interact.Interact @@ -37,6 +38,7 @@ class InterfaceOnPlayerOptionHandler( inventory ) } + player.closeInterfaces() player.mode = Interact(player, target, interaction) } } \ No newline at end of file diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/NPCOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/NPCOptionHandler.kt index deac88fb42..29c32c2228 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/NPCOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/NPCOptionHandler.kt @@ -4,6 +4,7 @@ import com.github.michaelbull.logging.InlineLogger import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.instruction.handle.ObjectOptionHandler.Companion.getDefinition import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.client.ui.dialogue.talkWith import world.gregs.voidps.engine.client.variable.hasClock import world.gregs.voidps.engine.data.definition.NPCDefinitions @@ -49,6 +50,7 @@ class NPCOptionHandler( player.message("You're stunned!", ChatType.Filter) return } + player.closeInterfaces() player.talkWith(npc, definition) player.mode = Interact(player, npc, NPCOption(player, npc, definition, selectedOption)) } diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt index 788c810de8..8129754f05 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt @@ -3,6 +3,7 @@ package world.gregs.voidps.engine.client.instruction.handle import com.github.michaelbull.logging.InlineLogger import world.gregs.voidps.cache.definition.Transforms import world.gregs.voidps.engine.client.instruction.InstructionHandler +import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.data.definition.DefinitionsDecoder import world.gregs.voidps.engine.data.definition.ObjectDefinitions import world.gregs.voidps.engine.data.definition.VariableDefinitions @@ -45,6 +46,7 @@ class ObjectOptionHandler( logger.warn { "Invalid object option $target $index" } return } + player.closeInterfaces() player.mode = Interact(player, target, ObjectOption(player, target, definition, selectedOption)) } diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/PlayerOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/PlayerOptionHandler.kt index bd99d3438e..8b035761a7 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/PlayerOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/PlayerOptionHandler.kt @@ -2,6 +2,7 @@ package world.gregs.voidps.engine.client.instruction.handle import com.github.michaelbull.logging.InlineLogger import world.gregs.voidps.engine.client.instruction.InstructionHandler +import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.entity.character.mode.Follow import world.gregs.voidps.engine.entity.character.mode.interact.Interact import world.gregs.voidps.engine.entity.character.player.Player @@ -27,6 +28,7 @@ class PlayerOptionHandler( logger.info { "Invalid player option $optionIndex ${player.options.get(optionIndex)} for $player on $target" } return } + player.closeInterfaces() if (option == "Follow") { player.mode = Follow(player, target) } else { diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/AreaDefinitions.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/AreaDefinitions.kt index a2d41d2c7b..e403d01741 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/AreaDefinitions.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/AreaDefinitions.kt @@ -84,8 +84,16 @@ class AreaDefinitions( for (tag in tags) { tagged.getOrPut(tag) { ObjectOpenHashSet(2) }.add(definition) } - for (zone in area.toZones()) { - areas.getOrPut(zone.id) { ObjectOpenHashSet(2) }.add(definition) + if (level != null) { + for (zone in area.toZones(level)) { + areas.getOrPut(zone.id) { ObjectOpenHashSet(2) }.add(definition) + } + } else { + for (lvl in 0..3) { + for (zone in area.toZones(lvl)) { + areas.getOrPut(zone.id) { ObjectOpenHashSet(2) }.add(definition) + } + } } } } diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/NPCDefinitions.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/NPCDefinitions.kt index 336df552b4..98b64fc985 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/NPCDefinitions.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/NPCDefinitions.kt @@ -6,14 +6,10 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet import world.gregs.config.Config import world.gregs.voidps.cache.definition.data.NPCDefinition -import world.gregs.voidps.engine.data.Settings import world.gregs.voidps.engine.data.definition.data.Pocket import world.gregs.voidps.engine.data.definition.data.Spot +import world.gregs.voidps.engine.entity.item.drop.DropTables import world.gregs.voidps.engine.timedLoad -import java.nio.file.Files -import java.nio.file.Path -import kotlin.io.path.extension -import kotlin.io.path.pathString class NPCDefinitions( override var definitions: Array @@ -23,7 +19,12 @@ class NPCDefinitions( override fun empty() = NPCDefinition.EMPTY - fun load(paths: List): NPCDefinitions { + fun load( + paths: List, + dropTables: DropTables? = null, + animationDefinitions: AnimationDefinitions? = null, + soundDefinitions: SoundDefinitions? = null + ): NPCDefinitions { timedLoad("npc extra") { val ids = Object2IntOpenHashMap() ids.defaultReturnValue(-1) @@ -60,6 +61,27 @@ class NPCDefinitions( } extras["categories"] = categories } + "drop_table" -> { + val table = string() + require(dropTables == null || table.isBlank() || dropTables.get("${table}_drop_table") != null) { "Drop table '$table' not found for npc $stringId" } + extras[key] = table + } + "combat_anims" -> { + val name = string() + if (animationDefinitions != null && name.isNotBlank()) { + // Attack isn't always required because of weapon style + require(animationDefinitions.contains("${name}_defend")) { "No combat animation ${name}_defend found for npc $stringId" } + require(animationDefinitions.contains("${name}_death")) { "No combat animation ${name}_death found for npc $stringId" } + } + extras[key] = name + } + "combat_sounds" -> { + val name = string() + if (soundDefinitions != null && name.isNotBlank()) { + require(soundDefinitions.contains("${name}_attack") || soundDefinitions.contains("${name}_defend") || soundDefinitions.contains("${name}_death")) { "No combat sounds '${name}' found for npc $stringId" } + } + extras[key] = name + } else -> extras[key] = value() } } diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/item/drop/DropTables.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/item/drop/DropTables.kt index c8ce0c39af..d37131ba1b 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/item/drop/DropTables.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/item/drop/DropTables.kt @@ -130,57 +130,68 @@ class DropTables { withinMax: Int? = null, members: Boolean? = null ): ((Player) -> Boolean)? { - var predicate: ((Player) -> Boolean)? = null + val predicates = mutableListOf<((Player) -> Boolean)>() if (owns != null || lacks != null) { - predicate = { (owns == null || ownsItem(it, owns)) && (lacks == null || !ownsItem(it, lacks)) } - } else if (variable != null) { + predicates.add { (owns == null || ownsItem(it, owns)) && (lacks == null || !ownsItem(it, lacks)) } + } + if (members != null) { + predicates.add { World.members == members } + } + if (variable != null) { if (negated) { if (eq != null) { when (default) { - is Int -> predicate = { it[variable, default] != eq } - is String -> predicate = { it[variable, default] != eq } - is Double -> predicate = { it[variable, default] != eq } - is Long -> predicate = { it[variable, default] != eq } - is Boolean -> predicate = { it[variable, default] != eq } + is Int -> predicates.add { it[variable, default] != eq } + is String -> predicates.add { it[variable, default] != eq } + is Double -> predicates.add { it[variable, default] != eq } + is Long -> predicates.add { it[variable, default] != eq } + is Boolean -> predicates.add { it[variable, default] != eq } else -> when (eq) { - is Int -> predicate = { it.get(variable) != eq } - is String -> predicate = { it.get(variable) != eq } - is Double -> predicate = { it.get(variable) != eq } - is Long -> predicate = { it.get(variable) != eq } - is Boolean -> predicate = { it.get(variable) != eq } + is Int -> predicates.add { it.get(variable) != eq } + is String -> predicates.add { it.get(variable) != eq } + is Double -> predicates.add { it.get(variable) != eq } + is Long -> predicates.add { it.get(variable) != eq } + is Boolean -> predicates.add { it.get(variable) != eq } else -> {} } } } else if (withinMin != null && withinMax != null) { val within = withinMin..withinMax - predicate = { it[variable, default ?: -1] !in within } + predicates.add { it[variable, default ?: -1] !in within } } } else { if (eq != null) { when (default) { - is Int -> predicate = { it[variable, default] == eq } - is String -> predicate = { it[variable, default] == eq } - is Double -> predicate = { it[variable, default] == eq } - is Long -> predicate = { it[variable, default] == eq } - is Boolean -> predicate = { it[variable, default] == eq } + is Int -> predicates.add { it[variable, default] == eq } + is String -> predicates.add { it[variable, default] == eq } + is Double -> predicates.add { it[variable, default] == eq } + is Long -> predicates.add { it[variable, default] == eq } + is Boolean -> predicates.add { it[variable, default] == eq } else -> when (eq) { - is Int -> predicate = { it.get(variable) == eq } - is String -> predicate = { it.get(variable) == eq } - is Double -> predicate = { it.get(variable) == eq } - is Long -> predicate = { it.get(variable) == eq } - is Boolean -> predicate = { it.get(variable) == eq } + is Int -> predicates.add { it.get(variable) == eq } + is String -> predicates.add { it.get(variable) == eq } + is Double -> predicates.add { it.get(variable) == eq } + is Long -> predicates.add { it.get(variable) == eq } + is Boolean -> predicates.add { it.get(variable) == eq } else -> {} } } } else if (withinMin != null && withinMax != null) { val within = withinMin..withinMax - predicate = { it[variable, default ?: -1] in within } + predicates.add { it[variable, default ?: -1] in within } } } - } else if (members != null) { - predicate = { World.members == members } } - return predicate + return when (predicates.size) { + 1 -> predicates[0] + 2 -> { + { predicates[0](it) && predicates[1](it) } + } + 3 -> { + { predicates[0](it) && predicates[1](it) && predicates[2](it) } + } + else -> null + } } private val inventories = listOf("inventory", "worn_equipment", "bank") diff --git a/engine/src/test/kotlin/world/gregs/voidps/engine/entity/item/drop/DropTablesTest.kt b/engine/src/test/kotlin/world/gregs/voidps/engine/entity/item/drop/DropTablesTest.kt index 14eaa55fee..82a9b969f8 100644 --- a/engine/src/test/kotlin/world/gregs/voidps/engine/entity/item/drop/DropTablesTest.kt +++ b/engine/src/test/kotlin/world/gregs/voidps/engine/entity/item/drop/DropTablesTest.kt @@ -10,6 +10,7 @@ import world.gregs.voidps.cache.config.data.InventoryDefinition import world.gregs.voidps.engine.data.Settings import world.gregs.voidps.engine.data.definition.InventoryDefinitions import world.gregs.voidps.engine.data.definition.ItemDefinitions +import world.gregs.voidps.engine.entity.World import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.inv.add import world.gregs.voidps.engine.inv.inventory @@ -211,6 +212,28 @@ class DropTablesTest { Assertions.assertTrue(drop.predicate!!.invoke(variables)) } + @Test + fun `Item drop variable within range and members`() { + val drop = ItemDrop( + id = "item", + amount = 10..20, + predicate = tables.dropPredicate( + members = true, + variable = "test", + withinMin = 1, + withinMax = 10, + default = 5, + ) + ) + val variables = Player() + Settings.load(mapOf("world.members" to "true")) + Assertions.assertTrue(drop.predicate!!.invoke(variables)) + variables["test"] = 11 + Assertions.assertFalse(drop.predicate!!.invoke(variables)) + variables["test"] = 10 + Assertions.assertTrue(drop.predicate!!.invoke(variables)) + } + @Test fun `Item drop from map`() { val drop = ItemDrop( @@ -224,6 +247,5 @@ class DropTablesTest { Assertions.assertEquals("item", drop.id) Assertions.assertEquals(1..5, drop.amount) Assertions.assertEquals(5, drop.chance) -// assertTrue(drop.members) } } \ No newline at end of file diff --git a/game/src/main/kotlin/GameModules.kt b/game/src/main/kotlin/GameModules.kt index 7d3836abcb..2c3cf69f67 100644 --- a/game/src/main/kotlin/GameModules.kt +++ b/game/src/main/kotlin/GameModules.kt @@ -4,6 +4,7 @@ import content.bot.TaskManager import content.bot.interact.navigation.graph.NavigationGraph import content.bot.interact.path.Dijkstra import content.bot.interact.path.DijkstraFrontier +import content.entity.obj.ship.CharterShips import content.entity.player.modal.book.Books import content.entity.world.music.MusicTracks import world.gregs.voidps.engine.client.instruction.InstructionHandlers @@ -29,6 +30,7 @@ fun gameModule(files: ConfigFiles) = module { single(createdAtStart = true) { NavigationGraph(get(), get()).load(files.find(Settings["map.navGraph"])) } single(createdAtStart = true) { Books().load(files.list(Settings["definitions.books"])) } single(createdAtStart = true) { MusicTracks().load(files.find(Settings["map.music"])) } + single(createdAtStart = true) { CharterShips().load(files.find(Settings["map.ships.prices"])) } single { InstructionHandlers( get(), diff --git a/game/src/main/kotlin/Main.kt b/game/src/main/kotlin/Main.kt index df99b0bced..70dd1feed7 100644 --- a/game/src/main/kotlin/Main.kt +++ b/game/src/main/kotlin/Main.kt @@ -100,7 +100,7 @@ object Main { single(createdAtStart = true) { ObjectDefinitions(ObjectDecoder(members, lowDetail = false, get()).load(cache)).load(files.list(Settings["definitions.objects"])) } - single(createdAtStart = true) { NPCDefinitions(NPCDecoder(members, get()).load(cache)).load(files.list(Settings["definitions.npcs"])) } + single(createdAtStart = true) { NPCDefinitions(NPCDecoder(members, get()).load(cache)).load(files.list(Settings["definitions.npcs"]), get(), get(), get()) } single(createdAtStart = true) { ItemDefinitions(ItemDecoder(get()).load(cache)).load(files.list(Settings["definitions.items"])) } single(createdAtStart = true) { AnimationDefinitions(AnimationDecoder().load(cache)).load(files.list(Settings["definitions.animations"])) } single(createdAtStart = true) { EnumDefinitions(EnumDecoder().load(cache), get()).load(files.find(Settings["definitions.enums"])) } diff --git a/game/src/main/kotlin/content/area/karamja/brimhaven/Leather_Dragon.kts b/game/src/main/kotlin/content/area/karamja/brimhaven/Leather_Dragon.kts new file mode 100644 index 0000000000..fc6d7f62ae --- /dev/null +++ b/game/src/main/kotlin/content/area/karamja/brimhaven/Leather_Dragon.kts @@ -0,0 +1,26 @@ +package content.area.karamja.brimhaven + +import content.entity.combat.hit.hit +import content.entity.combat.npcCombatSwing +import content.entity.sound.sound +import kotlinx.coroutines.delay +import world.gregs.voidps.engine.entity.character.mode.move.target.CharacterTargetStrategy +import world.gregs.voidps.type.random + +npcCombatSwing("red_dragon*") { npc -> + val withinMelee = CharacterTargetStrategy(npc).reached(target) + if (!withinMelee) { + delay(1) + } + val useFire = random.nextInt(4) == 0 // 1 in 4 chance to breathe fire + if (useFire) { + npc.anim("colour_dragon_breath") + npc.gfx("dragon_breath_shoot") + npc.hit(target, type = "dragonfire", special = true) + target.sound("dragon_breath") + } else { + npc.anim("colour_dragon_attack") + npc.hit(target, type = "melee") + target.sound("dragon_attack") + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/karamja/brimhaven/Metal_Dragons.kts b/game/src/main/kotlin/content/area/karamja/brimhaven/Metal_Dragons.kts new file mode 100644 index 0000000000..8e79d48099 --- /dev/null +++ b/game/src/main/kotlin/content/area/karamja/brimhaven/Metal_Dragons.kts @@ -0,0 +1,50 @@ +package content.area.karamja.brimhaven + +import content.entity.combat.CombatSwing +import content.entity.combat.hit.hit +import content.entity.combat.npcCombatSwing +import content.entity.proj.shoot +import content.entity.sound.sound +import world.gregs.voidps.engine.entity.character.Character +import world.gregs.voidps.engine.entity.character.mode.move.target.CharacterTargetStrategy +import world.gregs.voidps.engine.entity.character.npc.NPC +import world.gregs.voidps.type.Tile +import world.gregs.voidps.type.random + +val handler: suspend CombatSwing.(NPC) -> Unit = { npc -> + val withinMelee = CharacterTargetStrategy(npc).reached(target) + if (withinMelee && random.nextBoolean()) { + // Melee attack + npc.anim("dragon_attack") + target.sound("dragon_attack") + npc.hit(target, type = "melee") + } else if (withinMelee) { + // Close-range dragonfire + npc.anim("dragon_breath") + npc.gfx("dragon_breath_shoot") + target.sound("dragon_breath") + npc.hit(target, type = "dragonfire", special = true) + } else { + // Ranged dragonfire + npc.anim("dragon_shoot") + target.sound("metal_dragon_fireball") + nearestTile(npc, target).shoot("dragon_breath", target) + npc.hit(target, type = "dragonfire") + } +} +npcCombatSwing("bronze_dragon", handler = handler) +npcCombatSwing("iron_dragon", handler = handler) +npcCombatSwing("steel_dragon", handler = handler) + + + +/** + * Tile the dragon breath originates from. + * Mimics OSRS fire pathing logic. + */ +fun nearestTile(source: Character, target: Character): Tile { + val half = source.size / 2 + val centre = source.tile.add(half, half) + val direction = target.tile.delta(centre).toDirection() + return centre.add(direction).add(direction) +} diff --git a/game/src/main/kotlin/content/area/karamja/brimhaven/Saniboch.kts b/game/src/main/kotlin/content/area/karamja/brimhaven/Saniboch.kts new file mode 100644 index 0000000000..e0e51d9c92 --- /dev/null +++ b/game/src/main/kotlin/content/area/karamja/brimhaven/Saniboch.kts @@ -0,0 +1,100 @@ +package content.area.karamja.brimhaven + +import content.entity.obj.objTeleportTakeOff +import content.entity.player.dialogue.* +import content.entity.player.dialogue.type.choice +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.entity.player.dialogue.type.statement +import world.gregs.voidps.engine.entity.character.npc.npcOperate +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove +import world.gregs.voidps.engine.queue.queue + +val DUNGEON_ENTRY_FEE = 875 + +// Saniboch "Talk-to" dialogue +npcOperate("Talk-to", "saniboch") { + npc("Good day to you, Bwana.") + + choice { + option("Can I go through that door please?") { + if (player["can_enter_brimhaven_dungeon", false]) { + npc("Most certainly, you have already given me lots of nice coins.") + return@option + } + + npc("Most certainly, but I must charge you the sum of 875 coins first.") + if (player.inventory.contains("coins", DUNGEON_ENTRY_FEE)) { + choice { + option("Okay, here's 875 coins.") { + player.inventory.remove("coins", DUNGEON_ENTRY_FEE) + player["can_enter_brimhaven_dungeon"] = true + statement("You pay Saniboch 875 coins.") + npc("Many thanks. You may now pass the door. May your death be a glorious one!") + } + option("Never mind.") { + player("Never mind.") + } + option("Why is it worth the entry cost?") { + player("Why is it worth the entry cost?") + npc("It leads to a huge fearsome dungeon, populated by giants and strange dogs. Adventurers come from all around to explore its depths.") + npc("I know not what lies deeper in myself, for my skills in agility and woodcutting are inadequate, but I hear tell of even greater dangers deeper in.") + } + } + } else { + player("I don't have the money on me at the moment.") + npc("Well this is a dungeon for the more wealthy discerning adventurer. Begone with you, riff raff.") + player("But you don't even have clothes, how can you seriously call anyone riff raff.") + npc("Hummph.") + } + } + + option("Where does this strange entrance lead?") { + npc("To a huge fearsome dungeon, populated by giants and strange dogs. Adventurers come from all around to explore its depths.") + npc("I know not what lies deeper in myself, for my skills in agility and woodcutting are inadequate.") + } + + option("Good day to you too.") { + player("Good day to you too.") + } + + option("I'm impressed, that tree is growing on that shed.") { + player("I'm impressed, that tree is growing on that shed.") + npc("My employer tells me it is an uncommon sort of tree called the Fyburglars tree.") + } + } +} + +// Saniboch "Pay" right-click option +npcOperate("Pay", "saniboch") { + if (player["can_enter_brimhaven_dungeon", false]) { + npc("You have already given me lots of nice coins, you may go in.") + return@npcOperate + } + + val coins = player.inventory.count("coins") + if (coins >= DUNGEON_ENTRY_FEE) { + player.inventory.remove("coins", DUNGEON_ENTRY_FEE) + player["can_enter_brimhaven_dungeon"] = true + statement("You pay Saniboch 875 coins.") + npc("Many thanks. You may now pass the door. May your death be a glorious one!") + } else { + npc("I'll want 875 coins to let you enter.") + npc("Well this is a dungeon for the more wealthy discerning adventurer. Begone with you, riff raff.") + } +} + +// Door object to enter dungeon +objTeleportTakeOff("Enter", "brimhaven_dungeon_entrance") { + if (!player["can_enter_brimhaven_dungeon", false]) { + cancel() + player.queue("saniboch_door_access_check") { + statement("You can't go in there without paying!") + } + return@objTeleportTakeOff + } + + // Reset access after one-time use + player["can_enter_brimhaven_dungeon"] = false +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/karamja/brimhaven/Vine.kts b/game/src/main/kotlin/content/area/karamja/brimhaven/Vine.kts new file mode 100644 index 0000000000..1daeace282 --- /dev/null +++ b/game/src/main/kotlin/content/area/karamja/brimhaven/Vine.kts @@ -0,0 +1,42 @@ +package content.area.karamja.brimhaven + +import content.skill.woodcutting.Hatchet +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.engine.entity.character.player.skill.level.Level.has +import world.gregs.voidps.engine.entity.obj.objectOperate +import world.gregs.voidps.engine.entity.obj.replace +import world.gregs.voidps.engine.queue.queue +import world.gregs.voidps.engine.timer.toTicks +import java.util.concurrent.TimeUnit +import kotlin.random.Random + +objectOperate("Chop-down", "brimhaven_vine_*") { + val hatchet = Hatchet.best(player) + if (hatchet == null || !Hatchet.hasRequirements(player, hatchet, true)) { + player.message("You need a hatchet to cut through these vines.") + return@objectOperate + } + + if (!player.has(Skill.Woodcutting, 10, true)) { + player.message("You need a Woodcutting level of at least 10 to chop through the vines.") + return@objectOperate + } + + player.queue("cutting_vine") { + player.message("You swing your hatchet at the vines...") + player.anim("${hatchet.id}_chop") + delay(3) + + if (Random.nextInt(6) == 0) { + player.message("You fail to cut the vines.") + return@queue + } + + player.message("You hack your way through the vines.") + target.replace("${target.id}_cut", ticks = TimeUnit.SECONDS.toTicks(2)) + + val direction = target.tile.delta(player.tile) + player.walkOverDelay(target.tile.add(direction)) + } +} diff --git a/game/src/main/kotlin/content/area/wilderness/KingBlackDragon.kts b/game/src/main/kotlin/content/area/wilderness/KingBlackDragon.kts index c9c7aa0132..a3a7cc915a 100644 --- a/game/src/main/kotlin/content/area/wilderness/KingBlackDragon.kts +++ b/game/src/main/kotlin/content/area/wilderness/KingBlackDragon.kts @@ -20,20 +20,20 @@ npcCombatSwing("king_black_dragon") { npc -> val canMelee = CharacterTargetStrategy(npc).reached(target) when (random.nextInt(if (canMelee) 3 else 2)) { 0 -> { - npc.anim("dragon_breath") + npc.anim("king_black_dragon_breath") target.sound("dragon_breath") nearestTile(npc, target).shoot("dragon_breath", target) npc.hit(target, type = "dragonfire") } 1 -> { val type = specials.random() - npc.anim("dragon_breath") + npc.anim("king_black_dragon_breath") target.sound("dragon_breath_$type") nearestTile(npc, target).shoot("dragon_breath_$type", target) npc.hit(target, type = "dragonfire", spell = type, special = true) } else -> { - npc.anim("dragon_attack") + npc.anim("king_black_dragon_attack") target.sound("dragon_attack") npc.hit(target, type = "melee") } diff --git a/game/src/main/kotlin/content/entity/combat/Target.kt b/game/src/main/kotlin/content/entity/combat/Target.kt index 980344950c..1a69979258 100644 --- a/game/src/main/kotlin/content/entity/combat/Target.kt +++ b/game/src/main/kotlin/content/entity/combat/Target.kt @@ -72,15 +72,15 @@ object Target { return true } - fun isDemon(target: Character) = target is NPC && target.categories.contains("demon") + fun isDemon(target: Character) = target is NPC && target.categories.contains("demons") - fun isVampyre(target: Character) = target is NPC && target.categories.contains("vampyre") + fun isVampyre(target: Character) = target is NPC && target.categories.contains("vampyres") - fun isShade(target: Character): Boolean = target is NPC && target.categories.contains("shade") + fun isShade(target: Character): Boolean = target is NPC && target.categories.contains("shades") - fun isKalphite(target: Character): Boolean = target is NPC && target.categories.contains("kalphite") + fun isKalphite(target: Character): Boolean = target is NPC && target.categories.contains("kalphites") - fun isDragon(target: Character): Boolean = target is NPC && target.categories.contains("dragon") + fun isDragon(target: Character): Boolean = target is NPC && target.categories.contains("dragons") fun isMetalDragon(target: Character): Boolean = target is NPC && (target.id == "bronze_dragon" || target.id == "iron_dragon" || target.id == "steel_dragon") @@ -89,7 +89,7 @@ object Target { if (target is Player) { return target.equipped(EquipSlot.Weapon).id == "staff_of_fire" } else if (target is NPC) { - return target.categories.contains("dragon") || target.id.startsWith("fire_elemental") || target.id.startsWith("fire_giant") || target.id.startsWith("pyrefiend") + return target.categories.contains("dragons") || target.id.startsWith("fire_elemental") || target.id.startsWith("fire_giant") || target.id.startsWith("pyrefiend") } return false } diff --git a/game/src/main/kotlin/content/entity/death/NPCDeath.kts b/game/src/main/kotlin/content/entity/death/NPCDeath.kts index 16e198e73f..44945aaa2f 100644 --- a/game/src/main/kotlin/content/entity/death/NPCDeath.kts +++ b/game/src/main/kotlin/content/entity/death/NPCDeath.kts @@ -2,11 +2,8 @@ package content.entity.death import com.github.michaelbull.logging.InlineLogger import content.area.wilderness.inMultiCombat -import content.entity.combat.attackers -import content.entity.combat.damageDealers -import content.entity.combat.dead -import content.entity.combat.killer -import net.pearx.kasechange.toSnakeCase +import content.entity.combat.* +import content.entity.npc.combat.NPCAttack import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.client.ui.chat.plural import world.gregs.voidps.engine.data.definition.AnimationDefinitions @@ -53,14 +50,13 @@ npcDeath { npc -> val killer = npc.killer val tile = npc.tile npc["death_tile"] = tile - npc.anim(deathAnimation(npc)) - val name = npc.def.name.toSnakeCase() - (killer as? Player)?.sound(deathSound(npc)) + npc.anim(NPCAttack.anim(animationDefinitions, npc, "death")) + (killer as? Player)?.sound(NPCAttack.sound(soundDefinitions, npc, "death")) delay(4) if (killer is Player) { slay(killer, npc) } - dropLoot(npc, killer, name, tile) + dropLoot(npc, killer, tile) npc.attackers.clear() npc.softTimers.stopAll() npc.hide = true @@ -84,56 +80,8 @@ npcDeath { npc -> } } -fun deathAnimation(npc: NPC): String { - var animation = "${npc.id}_death" - if (animationDefinitions.contains(animation)) { - return animation - } - if (npc.def.contains("death_anim")) { - animation = npc.def["death_anim", ""] - if (animationDefinitions.contains(animation)) { - return animation - } - } - for (category in npc.categories) { - animation = "${category}_death" - if (animationDefinitions.contains(animation)) { - return animation - } - } - return "" -} - - -fun deathSound(npc: NPC): String { - var sound: String - sound = "${npc.id}_death" - if (soundDefinitions.contains(sound)) { - return sound - } - for (category in npc.categories) { - sound = "${category}_death" - if (soundDefinitions.contains(sound)) { - return sound - } - } - return "" -} - -fun dropLoot(npc: NPC, killer: Character?, name: String, tile: Tile) { - var table = tables.get("${npc.def["drop_table", npc.id]}_drop_table") - if (table == null) { - table = tables.get("${name}_drop_table") - } - for (category in npc.categories) { - table = tables.get("${category}_drop_table") - if (table != null) { - break - } - } - if (table == null) { - return - } +fun dropLoot(npc: NPC, killer: Character?, tile: Tile) { + val table = tables.get("${npc.def["drop_table", npc.id]}_drop_table") ?: return val combatLevel = if (killer is Player) killer.combatLevel else if (killer is NPC) killer.def.combat else -1 val drops = table.role(maximumRoll = if (combatLevel > 0) combatLevel * 10 else -1, player = killer as? Player) .filterNot { it.id == "nothing" } diff --git a/game/src/main/kotlin/content/entity/npc/combat/Attack.kts b/game/src/main/kotlin/content/entity/npc/combat/Attack.kts index 920171c9cf..8e7e73bd9d 100644 --- a/game/src/main/kotlin/content/entity/npc/combat/Attack.kts +++ b/game/src/main/kotlin/content/entity/npc/combat/Attack.kts @@ -11,7 +11,6 @@ import world.gregs.voidps.engine.inject import content.entity.combat.hit.hit import content.entity.combat.npcCombatSwing import content.entity.sound.sound -import content.skill.slayer.categories val definitions: WeaponStyleDefinitions by inject() val animationDefinitions: AnimationDefinitions by inject() @@ -24,7 +23,7 @@ npcCombatSwing { npc -> return@npcCombatSwing } npc.anim(attackAnimation(npc)) - (target as? Player)?.sound(attackSound(npc)) + (target as? Player)?.sound(NPCAttack.sound(soundDefinitions, npc, "attack")) npc.hit(target) } @@ -43,29 +42,5 @@ fun attackAnimation(npc: NPC): String { return animation } } - return NPCAttack.animation(npc, animationDefinitions) + return NPCAttack.anim(animationDefinitions, npc, "attack") } - -fun attackSound(npc: NPC): String { - var sound: String - if (npc.def.contains("attack_sound")) { - sound = npc.def["attack_sound"] - if (sound == "nothing") { - return "" - } - if (soundDefinitions.contains(sound)) { - return sound - } - } - sound = "${npc.id}_attack" - if (soundDefinitions.contains(sound)) { - return sound - } - for (category in npc.categories) { - sound = "${category}_attack" - if (soundDefinitions.contains(sound)) { - return sound - } - } - return "" -} \ No newline at end of file diff --git a/game/src/main/kotlin/content/entity/npc/combat/NPCAttack.kt b/game/src/main/kotlin/content/entity/npc/combat/NPCAttack.kt index 0b7a5820c6..384544aa20 100644 --- a/game/src/main/kotlin/content/entity/npc/combat/NPCAttack.kt +++ b/game/src/main/kotlin/content/entity/npc/combat/NPCAttack.kt @@ -1,28 +1,44 @@ package content.entity.npc.combat -import content.skill.slayer.categories import world.gregs.voidps.engine.data.definition.AnimationDefinitions +import world.gregs.voidps.engine.data.definition.SoundDefinitions import world.gregs.voidps.engine.entity.character.npc.NPC object NPCAttack { - fun animation(npc: NPC, animationDefinitions: AnimationDefinitions): String { - var animation = "${npc.id}_attack" - if (animationDefinitions.contains(animation)) { + fun anim(definitions: AnimationDefinitions, npc: NPC, type: String): String { + var animation = "${npc.id}_${type}" + if (definitions.contains(animation)) { return animation } - if (npc.def.contains("attack_anim")) { - animation = npc.def["attack_anim", ""] - if (animationDefinitions.contains(animation)) { + if (npc.def.contains("${type}_anim")) { + animation = npc.def["${type}_anim"] + if (definitions.contains(animation)) { return animation } } - for (category in npc.categories) { - animation = "${category}_${npc.def["style", "unarmed"]}" - if (animationDefinitions.contains(animation)) { + if (npc.def.contains("combat_anims")) { + animation = "${npc.def["combat_anims", ""]}_${type}" + if (definitions.contains(animation)) { return animation } - animation = "${category}_attack" - if (animationDefinitions.contains(animation)) { + } + return "" + } + + fun sound(definitions: SoundDefinitions, npc: NPC, type: String): String { + var animation = "${npc.id}_${type}" + if (definitions.contains(animation)) { + return animation + } + if (npc.def.contains("${type}_sound")) { + animation = npc.def["${type}_sound"] + if (definitions.contains(animation)) { + return animation + } + } + if (npc.def.contains("combat_sounds")) { + animation = "${npc.def["combat_sounds", ""]}_${type}" + if (definitions.contains(animation)) { return animation } } diff --git a/game/src/main/kotlin/content/entity/obj/ship/CharterShip.kts b/game/src/main/kotlin/content/entity/obj/ship/CharterShip.kts new file mode 100644 index 0000000000..58a95dfb01 --- /dev/null +++ b/game/src/main/kotlin/content/entity/obj/ship/CharterShip.kts @@ -0,0 +1,182 @@ +package content.entity.obj.ship + +import content.entity.npc.shop.openShop +import content.entity.obj.ObjectTeleports +import content.entity.player.dialogue.* +import content.entity.player.dialogue.type.* +import content.entity.sound.jingle +import content.quest.questCompleted +import net.pearx.kasechange.toTitleCase +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.client.ui.chat.toDigitGroupString +import world.gregs.voidps.engine.client.ui.event.interfaceRefresh +import world.gregs.voidps.engine.client.ui.interfaceOption +import world.gregs.voidps.engine.client.ui.open +import world.gregs.voidps.engine.entity.character.move.tele +import world.gregs.voidps.engine.entity.character.npc.NPC +import world.gregs.voidps.engine.entity.character.npc.NPCOption +import world.gregs.voidps.engine.entity.character.npc.npcOperate +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.chat.ChatType +import world.gregs.voidps.engine.inject +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove +import world.gregs.voidps.engine.queue.strongQueue +import world.gregs.voidps.type.Tile + +val locations = listOf( + "catherby", + "brimhaven", + "port_khazard", + "port_sarim", +) + +val ships: CharterShips by inject() +val teles: ObjectTeleports by inject() + +interfaceRefresh("charter_ship_map") { player -> + val currentLocation = player["charter_ship", ""] + val prices = ships.get(currentLocation) + player.interfaces.sendVisibility(id, "mos_le_harmless", hasQuestRequirements(player, "mos_le_harmless") && prices.containsKey("mos_le_harmless")) + player.interfaces.sendVisibility(id, "shipyard", hasQuestRequirements(player, "shipyard") && prices.containsKey("shipyard")) + player.interfaces.sendVisibility(id, "port_tyras", hasQuestRequirements(player, "port_tyras") && prices.containsKey("port_tyras")) + player.interfaces.sendVisibility(id, "port_phasmatys", hasQuestRequirements(player, "port_phasmatys") && prices.containsKey("port_phasmatys")) + player.interfaces.sendVisibility(id, "oo_glog", hasQuestRequirements(player, "oo_glog") && prices.containsKey("oo_glog")) + player.interfaces.sendVisibility(id, "crandor", false) + player.interfaces.sendVisibility(id, "musa_point", false) + + for (location in locations) { + player.interfaces.sendVisibility(id, location, location != currentLocation && prices.containsKey(location)) + } +} + +npcOperate("Talk-To", "trader_stan", "trader_crewmember*") { + npc("Can I help you?") + choice { + option("Yes, who are you?") { + player("Yes, who are you?") + npc("${if (target.id == "trader_stan") "Why, I'm Trader Stan, owner and operator" else "I'm one of Trader Stan's crew; we are all part"} of the largest fleet of trading ships and chartered vessels to ever sail the seas!") + if (target.id == "trader_stan") { + npc("If you want to get to a port in a hurry then you can charter one of my ships to take you there - if the price is right...") + } + player("So, where exactly can I go with your ships?") + npc("We run ships from Port Phasmatys over to Port Tyras, stopping at Port Sarim, Catherby, Brimhaven, Musa Point, the Shipyard and Port Khazard.") + npc("We might dock at Mos Le'Harmless once in a while, as well, if you catch my meaning...") + player("Wow, that's a lot of ports. I take it you have some exotic stuff to trade?") + npc("We certainly do! ${if (target.id == "trader_stan") "I and my crewmen" else "We"} have access to items bought and sold from around the world. Would you like to take a look? Or would you like to charter a ship?") + choice { + trading() + charter() + if (target.id != "trader_stan") { + option("Isn't it tricky to sail about in those clothes?") { + player("Isn't it tricky to sail about in those clothes?") + npc("Tricky? Tricky!") + npc("Do you have even the slightest idea how tricky it is to sail in this stuff?") + npc("Some of us tried tearing it and arguing that it was too fragile to wear when on a boat, but he just had it enchanted to re-stitch itself.") + player("Wow, that's kind of harsh.") + npc("Anyway, would you like to take a look at our exotic wares from around the world? Or would you like to charter a ship?") + choice { + trading() + charter() + option("No thanks.") + } + } + } + option("No thanks.") + } + } + option("Yes, I would like to charter a ship.") { + player("Yes, I would like to charter a ship.") + npc("Certainly sir. Where would you like to go?") + } + option("No thanks.") + } +} + +npcOperate("Charter", "trader_stan", "trader_crewmember*") { + player["charter_ship"] = location(target) + player.open("charter_ship_map") +} + +interfaceOption("Ok", "*", "charter_ship_map") { + val currentLocation = player["charter_ship", ""] + if (component == currentLocation) { + return@interfaceOption + } + val price = ships.get(currentLocation, component) ?: return@interfaceOption + if (!hasQuestRequirements(player, component)) { + return@interfaceOption + } + val readablePrice = price.toDigitGroupString() + player.strongQueue("charter_ship") { + if (!player.inventory.contains("coins", price)) { + choice("Sailing to ${component.toTitleCase()} costs $readablePrice coins.") { + option("Choose again") { + player.open("charter_ship_map") + } + option("No") + } + return@strongQueue + } + statement("To sail to ${component.toTitleCase()} from here will cost you $readablePrice gold. Are you sure you want to pay that?") + choice { + option("Ok") { + if (player.inventory.remove("coins", price)) { + player.jingle("sailing_theme_short") + player.open("fade_out") + delay(4) + val teleport = teles.get("${component}_gangplank_enter", "Cross").first() + player.tele(teleport.to) + player.open("fade_in") + delay(3) + player.message("You pay the fare and sail to ${component.toTitleCase()}.", ChatType.Filter) + } + } + option("Choose again") { + player.open("charter_ship_map") + } + option("No") + } + } +} + +fun ChoiceBuilder>.trading() { + option("Yes, let's see what you're trading.") { + player.openShop("trader_stans_trading_post") + } +} + +fun ChoiceBuilder>.charter() { + option("Yes, I would like to charter a ship.") { + npc("Certainly sir. Where would you like to go?") + player["charter_ship"] = location(target) + player.open("charter_ship_map") + } +} + +fun hasQuestRequirements(player: Player, location: String): Boolean { + return player.questCompleted( + when (location) { + "mos_le_harmless" -> "mos_le_harmless" + "shipyard" -> "the_grand_tree" + "port_tyras" -> "regicide" + "port_phasmatys" -> "priest_in_peril" + "oo_glog" -> "as_a_first_resort" + else -> return true + } + ) +} + +fun location(npc: NPC) = when (npc["spawn_tile", Tile.EMPTY]) { + Tile(3033, 3192), Tile(3039, 3193), Tile(3042, 3192) -> "port_sarim" + Tile(2759, 3239), Tile(2760, 3239) -> "brimhaven" + Tile(2144, 3122), Tile(2145, 3122) -> "tyras_camp" + Tile(3001, 3033), Tile(3001, 3034) -> "shipyard" + Tile(2673, 3144), Tile(2675, 3144) -> "port_khazard" + Tile(3671, 2930), Tile(3672, 2930) -> "mos_le_harmless" + Tile(3701, 3502), Tile(3701, 3503) -> "port_phasmatys" + Tile(2794, 3414), Tile(2795, 3414) -> "catherby" + Tile(2619, 2856), Tile(2621, 2857) -> "oo_glog" + Tile(2954, 3157), Tile(2954, 3156) -> "musa_point" + else -> "" +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/entity/obj/ship/CharterShips.kt b/game/src/main/kotlin/content/entity/obj/ship/CharterShips.kt new file mode 100644 index 0000000000..9a66c45809 --- /dev/null +++ b/game/src/main/kotlin/content/entity/obj/ship/CharterShips.kt @@ -0,0 +1,34 @@ +package content.entity.obj.ship + +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap +import world.gregs.config.Config +import world.gregs.voidps.engine.timedLoad +import kotlin.collections.set + +class CharterShips { + private lateinit var prices: Map> + + fun get(name: String): Map = prices.getOrDefault(name, emptyMap()) + + fun get(name: String, target: String): Int? = prices[name]?.get(target) + + fun load(path: String): CharterShips { + timedLoad("charter ships") { + val prices = Object2ObjectOpenHashMap>(10) + Config.fileReader(path) { + while (nextSection()) { + val stringId = section() + val locations = Object2IntOpenHashMap(10) + while (nextPair()) { + locations[key()] = int() + } + prices[stringId] = locations + } + } + this.prices = prices + prices.size + } + return this + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/entity/player/command/admin/AdminCommands.kts b/game/src/main/kotlin/content/entity/player/command/admin/AdminCommands.kts index 7ac12ea465..ba180ebf27 100644 --- a/game/src/main/kotlin/content/entity/player/command/admin/AdminCommands.kts +++ b/game/src/main/kotlin/content/entity/player/command/admin/AdminCommands.kts @@ -55,6 +55,7 @@ import content.quest.quests import content.quest.refreshQuestJournal import content.entity.npc.shop.OpenShop import content.entity.obj.ObjectTeleports +import content.entity.obj.ship.CharterShips import content.skill.prayer.PrayerConfigs import content.skill.prayer.PrayerConfigs.PRAYERS import content.skill.prayer.isCurses @@ -445,6 +446,7 @@ adminCommand("reload (config-name)", "reload any type of content or file e.g. np "book", "books" -> get().load(files.list(Settings["definitions.books"])) "stairs", "tele", "teles", "teleports" -> get().load(files.list(Settings["map.teleports"])) "tracks", "songs" -> get().load(files.find(Settings["map.music"])) + "ships" -> get().load(files.find(Settings["map.ships.prices"])) "objects", "objs" -> { val defs: ObjectDefinitions = get() val custom: GameObjects = get() diff --git a/game/src/main/kotlin/content/entity/player/dialogue/DialogueInput.kts b/game/src/main/kotlin/content/entity/player/dialogue/DialogueInput.kts index 8cf6657a5e..0937ee542e 100644 --- a/game/src/main/kotlin/content/entity/player/dialogue/DialogueInput.kts +++ b/game/src/main/kotlin/content/entity/player/dialogue/DialogueInput.kts @@ -2,6 +2,7 @@ package content.entity.player.dialogue import world.gregs.voidps.engine.client.ui.dialogue.continueDialogue import world.gregs.voidps.engine.client.instruction.instruction +import world.gregs.voidps.engine.client.ui.closeDialogue import world.gregs.voidps.engine.suspend.IntSuspension import world.gregs.voidps.engine.suspend.NameSuspension import world.gregs.voidps.engine.suspend.StringSuspension @@ -22,7 +23,7 @@ continueDialogue("dialogue_message*", "continue") { player -> } continueDialogue("dialogue_level_up", "continue") { player -> - player.continueDialogue() + player.closeDialogue() } continueDialogue("dialogue_obj_box", "continue") { player -> diff --git a/game/src/main/kotlin/content/entity/player/dialogue/type/LevelUp.kt b/game/src/main/kotlin/content/entity/player/dialogue/type/LevelUp.kt index 287ee8928f..4a36ca99ef 100644 --- a/game/src/main/kotlin/content/entity/player/dialogue/type/LevelUp.kt +++ b/game/src/main/kotlin/content/entity/player/dialogue/type/LevelUp.kt @@ -10,12 +10,16 @@ import world.gregs.voidps.engine.suspend.ContinueSuspension private const val LEVEL_UP_INTERFACE_ID = "dialogue_level_up" suspend fun SuspendableContext.levelUp(skill: Skill, text: String) { + levelUp(player, skill, text) + ContinueSuspension.get(player) + player.close(LEVEL_UP_INTERFACE_ID) +} + +fun levelUp(player: Player, skill: Skill, text: String) { val lines = text.trimIndent().lines() check(player.open(LEVEL_UP_INTERFACE_ID)) { "Unable to open level up interface for $player" } for ((index, line) in lines.withIndex()) { player.interfaces.sendText(LEVEL_UP_INTERFACE_ID, "line${index + 1}", line) } player["level_up_icon"] = skill.name - ContinueSuspension.get(player) - player.close(LEVEL_UP_INTERFACE_ID) } \ No newline at end of file diff --git a/game/src/main/kotlin/content/entity/player/dialogue/type/LevelUp.kts b/game/src/main/kotlin/content/entity/player/dialogue/type/LevelUp.kts index 206a59ce23..2763a336f2 100644 --- a/game/src/main/kotlin/content/entity/player/dialogue/type/LevelUp.kts +++ b/game/src/main/kotlin/content/entity/player/dialogue/type/LevelUp.kts @@ -1,18 +1,14 @@ package content.entity.player.dialogue.type import world.gregs.voidps.engine.client.ui.chat.an -import world.gregs.voidps.engine.client.ui.closeInterfaces -import world.gregs.voidps.engine.client.ui.dialogue -import world.gregs.voidps.engine.client.ui.menu import world.gregs.voidps.engine.entity.character.player.skill.Skill.* import world.gregs.voidps.engine.entity.character.player.skill.exp.Experience import world.gregs.voidps.engine.entity.character.player.skill.exp.experience import world.gregs.voidps.engine.entity.character.player.skill.level.MaxLevelChanged import world.gregs.voidps.engine.entity.character.player.skill.level.maxLevelChange -import world.gregs.voidps.engine.queue.weakQueue import content.entity.combat.hit.combatDamage import content.entity.sound.jingle -import world.gregs.voidps.engine.client.ui.closeDialogue +import world.gregs.voidps.engine.client.ui.* experience { player -> val previousLevel = Experience.level(skill, from) @@ -30,26 +26,20 @@ maxLevelChange { player -> if (player["skip_level_up", false]) { return@maxLevelChange } - player.weakQueue(name = "level_up") { - onCancel = { - player.closeDialogue() - } - val unlock = when (skill) { - Agility -> false - Construction -> to.rem(10) == 0 - Constitution, Strength -> to >= 50 - Hunter -> to.rem(2) == 0 - else -> true// TODO has unlocked something - } - player.jingle("level_up_${skill.name.lowercase()}${if (unlock) "_unlock" else ""}", 0.5) - player.gfx("level_up") - player.addVarbit("skill_stat_flash", skill.name.lowercase()) - val level = if (skill == Constitution) to / 10 else to - levelUp(skill, """ - Congratulations! You've just advanced${skill.name.an()} ${skill.name} level! - You have now reached level ${level}! - """) + val unlock = when (skill) { + Agility -> false + Construction -> to.rem(10) == 0 + Constitution, Strength -> to >= 50 + Hunter -> to.rem(2) == 0 + else -> true// TODO has unlocked something } + player.jingle("level_up_${skill.name.lowercase()}${if (unlock) "_unlock" else ""}", 0.5) + player.addVarbit("skill_stat_flash", skill.name.lowercase()) + val level = if (skill == Constitution) to / 10 else to + levelUp(player, skill, """ + Congratulations! You've just advanced${skill.name.an()} ${skill.name} level! + You have now reached level ${level}! + """) } combatDamage { player -> diff --git a/game/src/main/kotlin/content/entity/player/equip/EquipmentBonuses.kts b/game/src/main/kotlin/content/entity/player/equip/EquipmentBonuses.kts index 5971a33c04..1096038986 100644 --- a/game/src/main/kotlin/content/entity/player/equip/EquipmentBonuses.kts +++ b/game/src/main/kotlin/content/entity/player/equip/EquipmentBonuses.kts @@ -30,6 +30,7 @@ fun Player.equipping() = menu == "equipment_bonuses" playerSpawn { player -> updateStats(player) + player["bank_hidden"] = true } inventoryChanged("worn_equipment") { player -> diff --git a/game/src/main/kotlin/content/quest/free/prince_ali_rescue/PrinceAliRescue.kts b/game/src/main/kotlin/content/quest/free/prince_ali_rescue/PrinceAliRescue.kts index c9e8f4d094..e7146039d3 100644 --- a/game/src/main/kotlin/content/quest/free/prince_ali_rescue/PrinceAliRescue.kts +++ b/game/src/main/kotlin/content/quest/free/prince_ali_rescue/PrinceAliRescue.kts @@ -224,7 +224,7 @@ questJournalOpen("prince_ali_rescue") { "", "QUEST COMPLETE!", ) - else -> emptyList() + else -> listOf("I can start his quest by talking to Chancellor Hassan in Al Kharid Palace.") } player.questJournal("Prince Ali Rescue", lines) } \ No newline at end of file diff --git a/game/src/main/kotlin/content/skill/melee/Block.kts b/game/src/main/kotlin/content/skill/melee/Block.kts index 6a0ae32a5d..763ee99125 100644 --- a/game/src/main/kotlin/content/skill/melee/Block.kts +++ b/game/src/main/kotlin/content/skill/melee/Block.kts @@ -13,9 +13,9 @@ import world.gregs.voidps.engine.inject import world.gregs.voidps.network.login.protocol.visual.update.player.EquipSlot import world.gregs.voidps.type.random import content.entity.combat.hit.characterCombatAttack +import content.entity.npc.combat.NPCAttack import content.skill.melee.weapon.weapon import content.entity.sound.sound -import content.skill.slayer.categories val styleDefinitions: WeaponStyleDefinitions by inject() val weaponDefinitions: WeaponAnimationDefinitions by inject() @@ -45,53 +45,15 @@ characterCombatAttack { character -> target.anim(animation, delay) } } else if (target is NPC) { - val animation = hitAnimation(target) + val animation = NPCAttack.anim(animationDefinitions, target, "defend") target.anim(animation, delay) } } -fun hitAnimation(npc: NPC): String { - var animation = "${npc.id}_defend" - if (animationDefinitions.contains(animation)) { - return animation - } - if (npc.def.contains("defend_anim")) { - animation = npc.def["defend_anim", ""] - if (animationDefinitions.contains(animation)) { - return animation - } - } - for (category in npc.categories) { - animation = "${category}_defend" - if (animationDefinitions.contains(animation)) { - return animation - } - } - return "" -} - fun calculateHitSound(target: Character): String { if (target is NPC) { - var sound: String - if (target.def.contains("defend_sound")) { - sound = target.def["defend_sound"] - if (soundDefinitions.contains(sound)) { - return sound - } - } - sound = "${target.id}_defend" - if (soundDefinitions.contains(sound)) { - return sound - } - for (category in target.categories) { - sound = "${category}_defend" - if (soundDefinitions.contains(sound)) { - return sound - } - } - return "" + return NPCAttack.sound(soundDefinitions, target, "defend") } - if (target is Player) { return if (target.male) { "male_defend_${random.nextInt(0, 3)}" diff --git a/game/src/main/kotlin/content/skill/thieving/Pickpocketing.kts b/game/src/main/kotlin/content/skill/thieving/Pickpocketing.kts index e37bc634cc..53f57a3bf3 100644 --- a/game/src/main/kotlin/content/skill/thieving/Pickpocketing.kts +++ b/game/src/main/kotlin/content/skill/thieving/Pickpocketing.kts @@ -60,7 +60,7 @@ npcApproach("Pickpocket") { } else { target.face(player) target.say(pocket.caughtMessage) - target.anim(NPCAttack.animation(target, animationDefinitions)) + target.anim(NPCAttack.anim(animationDefinitions, target, "defend")) player.message("You fail to pick the ${name}'s pocket.", ChatType.Filter) target.stun(player, pocket.stunTicks, pocket.stunHit) delay(2) diff --git a/game/src/main/kotlin/content/skill/woodcutting/Woodcutting.kts b/game/src/main/kotlin/content/skill/woodcutting/Woodcutting.kts index 807c748198..9b1f49df2a 100644 --- a/game/src/main/kotlin/content/skill/woodcutting/Woodcutting.kts +++ b/game/src/main/kotlin/content/skill/woodcutting/Woodcutting.kts @@ -46,11 +46,7 @@ objectOperate("Chop*") { val ivy = tree.log.isEmpty() var first = true while (awaitDialogues()) { - if (!objects.contains(target)) { - break - } - - if (!player.has(Skill.Woodcutting, tree.level, true)) { + if (!objects.contains(target) || !player.has(Skill.Woodcutting, tree.level, true)) { break } diff --git a/game/src/main/resources/game.properties b/game/src/main/resources/game.properties index 452f05779d..52725e85ee 100644 --- a/game/src/main/resources/game.properties +++ b/game/src/main/resources/game.properties @@ -248,6 +248,9 @@ map.navGraph=nav_graph.toml # Canoe station information map.canoes=canoe_stations.toml +# Path to the charter ship price data +map.ships.prices=charter_ship_prices.toml + #=================================== # Game Definitions diff --git a/game/src/test/kotlin/content/entity/obj/ship/CharterShipTest.kt b/game/src/test/kotlin/content/entity/obj/ship/CharterShipTest.kt new file mode 100644 index 0000000000..c9fd869f41 --- /dev/null +++ b/game/src/test/kotlin/content/entity/obj/ship/CharterShipTest.kt @@ -0,0 +1,63 @@ +package content.entity.obj.ship + +import WorldTest +import dialogueContinue +import dialogueOption +import interfaceOption +import npcOption +import org.junit.jupiter.api.Test +import world.gregs.voidps.engine.client.ui.dialogue +import world.gregs.voidps.engine.client.ui.menu +import world.gregs.voidps.engine.inv.add +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.type.Tile +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class CharterShipTest : WorldTest() { + + @Test + fun `Sail with charter ship`() { + val player = createPlayer(Tile(3034, 3192)) + player.inventory.add("coins", 1000) + val stan = createNPC("trader_stan", Tile(3033, 3192)) + + player.npcOption(stan, "Charter") + tick() + player.interfaceOption("charter_ship_map", "catherby", "Ok") + tick() + player.dialogueContinue() + player.dialogueOption("line1") + tick(5) + assertEquals(Tile(2792, 3417, 1), player.tile) + assertEquals("port_sarim", player["charter_ship", ""]) + } + + @Test + fun `Can't travel to same location`() { + val player = createPlayer(Tile(2796, 3414)) + player.inventory.add("coins", 3000) + val crew = createNPC("trader_crewmember_blue", Tile(2795, 3414)) + + player.npcOption(crew, "Charter") + tick() + assertEquals("charter_ship_map", player.menu) + player.interfaceOption("charter_ship_map", "catherby", "Ok") + tick() + assertNull(player.dialogue) + } + + @Test + fun `Can't travel to location without quest requirement`() { + val player = createPlayer(Tile(2796, 3414)) + player.inventory.add("coins", 3000) + val crew = createNPC("trader_crewmember_blue", Tile(2795, 3414)) + + player.npcOption(crew, "Charter") + tick() + assertEquals("charter_ship_map", player.menu) + player.interfaceOption("charter_ship_map", "oo_glog", "Ok") + tick() + assertNull(player.dialogue) + } +} \ No newline at end of file diff --git a/game/src/test/kotlin/content/skill/slayer/SlayerTaskTest.kt b/game/src/test/kotlin/content/skill/slayer/SlayerTaskTest.kt index 9ee6ec8992..6602a718e5 100644 --- a/game/src/test/kotlin/content/skill/slayer/SlayerTaskTest.kt +++ b/game/src/test/kotlin/content/skill/slayer/SlayerTaskTest.kt @@ -42,7 +42,7 @@ class SlayerTaskTest : WorldTest() { "crawling_hands" to "crawling_hand", "cave_bugs" to "cave_bug", "cave_crawlers" to "cave_crawler", - "cave_slime" to "cave_slime", + "cave_slimes" to "cave_slime", ).map { (task, id) -> dynamicTest("Complete a $task slayer task") { setRandom(object : FakeRandom() { diff --git a/gradle.properties b/gradle.properties index abcd12cdef..63f6f1d319 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,5 @@ #org.gradle.java.home=C:/Users//.jdks/openjdk-19.0.1/ +org.gradle.jvmargs=-Xmx7g -Xms2g -XX:MaxMetaspaceSize=1g -Dfile.encoding=UTF-8 junitVersion = 5.10.2 ktorVersion = 2.3.8 displeeCacheVersion = 7.1.7 diff --git a/gradlew b/gradlew index 1b6c787337..b3b8c102fc 100755 --- a/gradlew +++ b/gradlew @@ -86,7 +86,7 @@ APP_NAME="Gradle" APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +DEFAULT_JVM_OPTS='"-Xmx5120m" "-Xms1500m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 107acd32c4..1baeb83e2c 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -33,7 +33,7 @@ set APP_HOME=%DIRNAME% for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" +set DEFAULT_JVM_OPTS="-Xmx5120m" "-Xms1500m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome diff --git a/tools/src/main/kotlin/world/gregs/voidps/tools/convert/DropTableConverter.kt b/tools/src/main/kotlin/world/gregs/voidps/tools/convert/DropTableConverter.kt index 3e8e32244d..76af6428f5 100644 --- a/tools/src/main/kotlin/world/gregs/voidps/tools/convert/DropTableConverter.kt +++ b/tools/src/main/kotlin/world/gregs/voidps/tools/convert/DropTableConverter.kt @@ -11,24 +11,18 @@ object DropTableConverter { @JvmStatic fun main(args: Array) { val string = """ - ==Drops== - {{DropLogProject|jagex=yes}} - - ===Shade robes=== - {{DropsTableHead}} - {{DropsLine|name=Shade robe top|namenotes={{(m)}}|quantity=1|rarity=32/128|raritynotes={{CiteTwitter|author=Mod Ash|url=https://twitter.com/JagexAsh/status/743213123834908673|date=15 June 2016|archiveurl=https://archive.is/c4p99|archivedate=28 May 2020|quote=Do the lvl 159 Shades in the Stronghold of Security drop the Shade Robes in F2P? No.|name=Shade robes members tweet}}}} - {{DropsLine|name=Shade robe|namenotes={{(m)}}|quantity=1|rarity=32/128|raritynotes={{NamedRef|Shade robes members tweet}}}} - {{DropsTableBottom}} - - ===Other=== - {{DropsTableHead}} - {{DropsLine|name=Nothing|rarity=64/128}} - {{DropsTableBottom}} - - ===Catacombs tertiary=== - {{CatacombsDropTable|hitpoints=115|f2p=yes|catacombsonly=yes|dropversion=Catacombs of Kourend}} +===Tertiary=== +{{DropsTableHead|dropversion=Regular}} +{{DropsLine|name=Looting bag|namenotes={{(m)}}|quantity=1|rarity=1/3|raritynotes=Looting bags are only dropped by those found in the [[Wilderness]].|gemw=No|leagueRegion=Wilderness}} +{{DropsLine|name=Moss giant bone|namenotes={{(m)}}|quantity=1|rarity=1/4|raritynotes=Moss giant bones are only dropped during [[Rag and Bone Man II]].|gemw=No}} +{{DropsLine|name=Ensouled giant head|namenotes={{(m)}}|quantity=1|rarity=1/24}} +{{DropsLine|name=Clue scroll (beginner)|quantity=1|rarity=1/45|gemw=No}} +{{DropsLine|name=Long bone|namenotes={{(m)}}|quantity=1|rarity=1/400}} +{{DropsLine|name=Giant champion scroll|namenotes={{(m)}}|quantity=1|rarity=1/5000|gemw=No}} +{{DropsLine|name=Curved bone|namenotes={{(m)}}|quantity=1|rarity=1/5012.5}} +{{DropsTableBottom}} """.trimIndent() - val npc = "stronghold_shade" + val npc = "moss_giant" val all = mutableListOf() var builder = Builder() for (line in string.lines()) { diff --git a/tools/src/main/kotlin/world/gregs/voidps/tools/wiki/dialogue/DialogueConverter.kt b/tools/src/main/kotlin/world/gregs/voidps/tools/wiki/dialogue/DialogueConverter.kt index 8b6e4a3c7e..f706891736 100644 --- a/tools/src/main/kotlin/world/gregs/voidps/tools/wiki/dialogue/DialogueConverter.kt +++ b/tools/src/main/kotlin/world/gregs/voidps/tools/wiki/dialogue/DialogueConverter.kt @@ -11,6 +11,9 @@ import world.gregs.yaml.read.YamlReaderConfiguration import java.io.File import java.util.* +/** + * Converts raw data from runelites data collection project into dialogue scripts + */ @Suppress("UNCHECKED_CAST") object DialogueConverter { @@ -183,12 +186,12 @@ object DialogueConverter { file.appendText(""" package world.gregs.voidps.world.map - import world.gregs.voidps.engine.event.CharacterContext - import world.gregs.voidps.engine.entity.character.npc.NPCOption import world.gregs.voidps.engine.entity.character.player.Player - import world.gregs.voidps.engine.event.on import content.entity.player.dialogue.* import content.entity.player.dialogue.type.* + import world.gregs.voidps.engine.entity.character.mode.interact.TargetInteraction + import world.gregs.voidps.engine.entity.character.npc.NPC + import world.gregs.voidps.engine.entity.character.npc.npcOperate npcOperate("Talk-to", "$name") { startDialogue() @@ -214,7 +217,7 @@ object DialogueConverter { if (parent != previousParent) { val function = branchToFunction[parent] if (function != null) { - builder.append("suspend fun CharacterContext.").append(function).append("() {\n") + builder.append("suspend fun TargetInteraction.").append(function).append("() {\n") } } if (front.isNPCDialogue) { @@ -249,7 +252,7 @@ object DialogueConverter { } else { val function = branchToFunction[parent] if (function != null) { - builder.append("suspend fun CharacterContext.").append(function).append("() {\n") + builder.append("suspend fun TargetInteraction.").append(function).append("() {\n") } return } @@ -269,7 +272,7 @@ object DialogueConverter { 571, 572, 573, 574 -> "Surprised" 575, 576, 577, 578 -> "Uncertain" 588, 589, 590, 591 -> "Talk" - 592, 593, 594, 595 -> "shifty" + 592, 593, 594, 595 -> "Shifty" 596, 597, 598, 599 -> "Afraid" 600, 601, 602, 603 -> "Drunk" 605, 606, 607, 608 -> "Chuckle"