diff --git a/Server/data/configs/drop_tables.json b/Server/data/configs/drop_tables.json index 92748f79f..e907df0b5 100644 --- a/Server/data/configs/drop_tables.json +++ b/Server/data/configs/drop_tables.json @@ -3504,20 +3504,7 @@ ], "ids": "78,1005,2482,3711", "description": "", - "main": [ - { - "minAmount": "1", - "weight": "50.0", - "id": "7829", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "100.0", - "id": "0", - "maxAmount": "1" - } - ] + "main": [] }, { "default": [ @@ -4164,14 +4151,7 @@ "charm": [], "ids": "89,987", "description": "", - "main": [ - { - "minAmount": "1", - "weight": "50.0", - "id": "7821", - "maxAmount": "1" - } - ] + "main": [] }, { "default": [ @@ -4975,20 +4955,7 @@ ], "ids": "105,1195", "description": "", - "main": [ - { - "minAmount": "1", - "weight": "25.0", - "id": "7815", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "100.0", - "id": "0", - "maxAmount": "1" - } - ] + "main": [] }, { "default": [ @@ -5045,20 +5012,7 @@ ], "ids": "106", "description": "", - "main": [ - { - "minAmount": "1", - "weight": "25.0", - "id": "7815", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "100.0", - "id": "0", - "maxAmount": "1" - } - ] + "main": [] }, { "default": [ @@ -8349,7 +8303,7 @@ { "minAmount": "1", "weight": "100.0", - "id": "3186", + "id": "526", "maxAmount": "1" }, { @@ -8393,20 +8347,7 @@ ], "ids": "132,1463,1464,1487,2301,4344,4363,5852,6943,7211,7213,7215,7217,7219,7221,7223,7225,7227", "description": "", - "main": [ - { - "minAmount": "1", - "weight": "50.0", - "id": "7856", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "100.0", - "id": "0", - "maxAmount": "1" - } - ] + "main": [] }, { "default": [ @@ -8457,20 +8398,7 @@ ], "ids": "133", "description": "", - "main": [ - { - "minAmount": "1", - "weight": "25.0", - "id": "7821", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "100.0", - "id": "0", - "maxAmount": "1" - } - ] + "main": [] }, { "default": [ @@ -11580,14 +11508,14 @@ "main": [ { "minAmount": "1", - "weight": "50.0", - "id": "7833", + "weight": "100.0", + "id": "530", "maxAmount": "1" }, { "minAmount": "1", - "weight": "100.0", - "id": "0", + "weight": "25.0", + "id": "7833", "maxAmount": "1" } ] @@ -18575,20 +18503,7 @@ ], "ids": "1196,1197", "description": "", - "main": [ - { - "minAmount": "1", - "weight": "25.0", - "id": "7815", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "100.0", - "id": "0", - "maxAmount": "1" - } - ] + "main": [] }, { "default": [ @@ -27053,12 +26968,6 @@ "weight": "100.0", "id": "526", "maxAmount": "1" - }, - { - "minAmount": "2", - "weight": "100.0", - "id": "526", - "maxAmount": "2" } ], "charm": [], @@ -27112,12 +27021,6 @@ "weight": "50.0", "id": "995", "maxAmount": "15" - }, - { - "minAmount": "1", - "weight": "25.0", - "id": "7910", - "maxAmount": "1" } ] }, @@ -28403,20 +28306,7 @@ ], "ids": "2033,4920,4921", "description": "", - "main": [ - { - "minAmount": "1", - "weight": "25.0", - "id": "7824", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "100.0", - "id": "0", - "maxAmount": "1" - } - ] + "main": [] }, { "default": [], @@ -28454,14 +28344,7 @@ ], "ids": "2035", "description": "", - "main": [ - { - "minAmount": "1", - "weight": "100.0", - "id": "0", - "maxAmount": "1" - } - ] + "main": [] }, { "default": [ @@ -57853,7 +57736,7 @@ { "minAmount": "1", "weight": "100.0", - "id": "3179", + "id": "526", "maxAmount": "1" } ], @@ -59063,5 +58946,19 @@ } ], "main": [] + }, + { + "default": [ + { + "minAmount": "1", + "weight": "1.0", + "id": "526", + "maxAmount": "1" + } + ], + "charm": [], + "ids": "3672,3673,5168,5169,5170", + "description": "Ram", + "main": [] } ] \ No newline at end of file diff --git a/Server/data/configs/item_configs.json b/Server/data/configs/item_configs.json index a550d6995..e1909f094 100644 --- a/Server/data/configs/item_configs.json +++ b/Server/data/configs/item_configs.json @@ -70492,7 +70492,7 @@ "id": "7812" }, { - "examine": "See article", + "examine": "There is a goblin bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70500,7 +70500,7 @@ "id": "7813" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Goblin skull", "archery_ticket_price": "0", @@ -70514,7 +70514,7 @@ "id": "7815" }, { - "examine": "See article", + "examine": "There is a bear bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70522,21 +70522,21 @@ "id": "7816" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Bear ribs", "archery_ticket_price": "0", "id": "7817" }, { - "examine": "Unpolished: This needs a good polish.", + "examine": "This needs a good polish.", "durability": null, "name": "Ram skull", "archery_ticket_price": "0", "id": "7818" }, { - "examine": "See article", + "examine": "There is a ram bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70544,7 +70544,7 @@ "id": "7819" }, { - "examine": "Unpolished: This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Ram skull", "archery_ticket_price": "0", @@ -70558,7 +70558,7 @@ "id": "7821" }, { - "examine": "See article", + "examine": "There is a unicorn bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70566,7 +70566,7 @@ "id": "7822" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Unicorn bone", "archery_ticket_price": "0", @@ -70580,7 +70580,7 @@ "id": "7824" }, { - "examine": "See article", + "examine": "There is a giant rat bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70588,7 +70588,7 @@ "id": "7825" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Giant rat bone", "archery_ticket_price": "0", @@ -70603,7 +70603,7 @@ "id": "7827" }, { - "examine": "See article", + "examine": "There is a giant bat bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70611,7 +70611,7 @@ "id": "7828" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Giant bat wing", "weight": "0.9", @@ -70627,7 +70627,7 @@ "id": "7830" }, { - "examine": "See article", + "examine": "There is a wolf bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70635,7 +70635,7 @@ "id": "7831" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Wolf bone", "weight": "0.9", @@ -70651,7 +70651,7 @@ "id": "7833" }, { - "examine": "See article", + "examine": "There is a bat bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70659,7 +70659,7 @@ "id": "7834" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Bat wing", "weight": "0.9", @@ -70675,7 +70675,7 @@ "id": "7836" }, { - "examine": "See article", + "examine": "There is a rat bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70683,7 +70683,7 @@ "id": "7837" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Rat bone", "weight": "0.9", @@ -70699,7 +70699,7 @@ "id": "7839" }, { - "examine": "See article", + "examine": "There is a baby blue dragon bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70707,7 +70707,7 @@ "id": "7840" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Baby dragon bone", "weight": "0.9", @@ -70723,7 +70723,7 @@ "id": "7842" }, { - "examine": "See article", + "examine": "There is a ogre bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70731,7 +70731,7 @@ "id": "7843" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Ogre ribs", "weight": "0.9", @@ -70747,7 +70747,7 @@ "id": "7845" }, { - "examine": "See article", + "examine": "There is a jogre bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70755,7 +70755,7 @@ "id": "7846" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Jogre bone", "weight": "0.9", @@ -70771,7 +70771,7 @@ "id": "7848" }, { - "examine": "See article", + "examine": "There is a zogre bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70779,7 +70779,7 @@ "id": "7849" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Zogre bone", "weight": "0.9", @@ -70795,7 +70795,7 @@ "id": "7851" }, { - "examine": "See article", + "examine": "There is a mogre bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70803,7 +70803,7 @@ "id": "7852" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Mogre bone", "weight": "0.9", @@ -70811,14 +70811,14 @@ "id": "7853" }, { - "examine": "This needs a good polish./ This belongs in a museum!", + "examine": "This needs a good polish.", "durability": null, "name": "Monkey paw", "archery_ticket_price": "0", "id": "7854" }, { - "examine": "See article", + "examine": "There is a monkey bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70826,7 +70826,7 @@ "id": "7855" }, { - "examine": "This needs a good polish./ This belongs in a museum!", + "examine": "This belongs in a museum!", "durability": null, "name": "Monkey paw", "archery_ticket_price": "0", @@ -70841,7 +70841,7 @@ "id": "7857" }, { - "examine": "See article", + "examine": "There is a Dagannoth bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70849,7 +70849,7 @@ "id": "7858" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Dagannoth ribs", "weight": "0.9", @@ -70865,7 +70865,7 @@ "id": "7860" }, { - "examine": "See article", + "examine": "There is a snake bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70873,7 +70873,7 @@ "id": "7861" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Snake spine", "weight": "0.9", @@ -70889,7 +70889,7 @@ "id": "7863" }, { - "examine": "See article", + "examine": "There is a zombie bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70897,7 +70897,7 @@ "id": "7864" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Zombie bone", "weight": "0.9", @@ -70913,7 +70913,7 @@ "id": "7866" }, { - "examine": "See article", + "examine": "There is a werewolf bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70921,7 +70921,7 @@ "id": "7867" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Werewolf bone", "weight": "0.9", @@ -70937,7 +70937,7 @@ "id": "7869" }, { - "examine": "See article", + "examine": "There is a moss giant bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70945,7 +70945,7 @@ "id": "7870" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Moss giant bone", "weight": "0.9", @@ -70961,7 +70961,7 @@ "id": "7872" }, { - "examine": "See article", + "examine": "There is a fire giant bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70969,7 +70969,7 @@ "id": "7873" }, { - "examine": "This needs a good polish.", + "examine": "This bone belongs in a museum!", "durability": null, "name": "Fire giant bone", "weight": "0.9", @@ -70985,7 +70985,7 @@ "id": "7875" }, { - "examine": "See article", + "examine": "There is an ice giant bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -70993,7 +70993,7 @@ "id": "7876" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Ice giant ribs", "weight": "0.9", @@ -71009,7 +71009,7 @@ "id": "7878" }, { - "examine": "See article", + "examine": "There is a terrorbird bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71017,7 +71017,7 @@ "id": "7879" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Terrorbird wing", "weight": "0.9", @@ -71033,7 +71033,7 @@ "id": "7881" }, { - "examine": "See article", + "examine": "There is a ghoul bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71041,7 +71041,7 @@ "id": "7882" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Ghoul bone", "weight": "0.9", @@ -71057,7 +71057,7 @@ "id": "7884" }, { - "examine": "See article", + "examine": "There is a troll bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71065,7 +71065,7 @@ "id": "7885" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Troll bone", "weight": "0.9", @@ -71081,7 +71081,7 @@ "id": "7887" }, { - "examine": "See article", + "examine": "There is a seagull bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71089,7 +71089,7 @@ "id": "7888" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Seagull wing", "weight": "0.9", @@ -71105,7 +71105,7 @@ "id": "7890" }, { - "examine": "See article", + "examine": "There is an undead cow bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71113,7 +71113,7 @@ "id": "7891" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Undead cow ribs", "weight": "0.9", @@ -71122,7 +71122,7 @@ }, { "shop_price": "160", - "examine": "Unpolished: This needs a good polish. Polished: This bone belongs in a museum!", + "examine": "This needs a good polish.", "durability": null, "name": "Experiment bone", "weight": "0.9", @@ -71130,7 +71130,7 @@ "id": "7893" }, { - "examine": "See article", + "examine": "There is an experiment bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71139,7 +71139,7 @@ }, { "shop_price": "160", - "examine": "Unpolished: This needs a good polish. Polished: This bone belongs in a museum!", + "examine": "This belongs in a museum!", "durability": null, "name": "Experiment bone", "weight": "0.9", @@ -71155,7 +71155,7 @@ "id": "7896" }, { - "examine": "See article", + "examine": "There is a rabbit bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71163,7 +71163,7 @@ "id": "7897" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Rabbit bone", "weight": "0.9", @@ -71171,7 +71171,7 @@ "id": "7898" }, { - "examine": "Dirty:This bone needs a good polish.", + "examine": "This bone needs a good polish.", "durability": null, "name": "Basilisk bone", "weight": "0.9", @@ -71179,7 +71179,7 @@ "id": "7899" }, { - "examine": "See article", + "examine": "There is a basilisk bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71187,7 +71187,7 @@ "id": "7900" }, { - "examine": "Dirty:This bone needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Basilisk bone", "weight": "0.9", @@ -71203,7 +71203,7 @@ "id": "7902" }, { - "examine": "See article", + "examine": "There is a desert lizard bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71211,7 +71211,7 @@ "id": "7903" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Desert lizard bone", "weight": "0.9", @@ -71227,7 +71227,7 @@ "id": "7905" }, { - "examine": "See article", + "examine": "There is a cave goblin bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71235,7 +71235,7 @@ "id": "7906" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Cave goblin skull", "weight": "0.9", @@ -71251,7 +71251,7 @@ "id": "7908" }, { - "examine": "See article", + "examine": "There is a big frog bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71259,7 +71259,7 @@ "id": "7909" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Big frog leg", "weight": "1", @@ -71275,7 +71275,7 @@ "id": "7911" }, { - "examine": "See article", + "examine": "There is a vulture bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71283,7 +71283,7 @@ "id": "7912" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Vulture wing", "weight": "0.9", @@ -71299,7 +71299,7 @@ "id": "7914" }, { - "examine": "See article", + "examine": "There is a jackal bone in here.", "durability": null, "name": "Bone in vinegar", "weight": "1", @@ -71307,7 +71307,7 @@ "id": "7915" }, { - "examine": "This needs a good polish.", + "examine": "This belongs in a museum!", "durability": null, "name": "Jackal bone", "weight": "0.9", diff --git a/Server/data/configs/npc_configs.json b/Server/data/configs/npc_configs.json index a22f83ae9..f40abb12c 100644 --- a/Server/data/configs/npc_configs.json +++ b/Server/data/configs/npc_configs.json @@ -34012,44 +34012,54 @@ "range_level": "1", "attack_level": "59" }, + { + "examine": "That's a lot of bones on his back...", + "name": "Odd Old Man", + "id": "3670" + }, { "examine": "Freshly sheared.", "melee_animation": "5341", "range_animation": "0", + "combat_audio": "757,759,758", "attack_speed": "5", "respawn_delay": "60", - "defence_animation": "0", + "defence_animation": "5337", "weakness": "9", "magic_animation": "0", "death_animation": "5343", "name": "Ram", - "defence_level": "2", + "defence_level": "1", "safespot": null, - "lifepoints": "2", - "strength_level": "2", + "lifepoints": "8", + "strength_level": "1", "id": "3672", "range_level": "1", - "attack_level": "2" + "attack_level": "1" }, { - "examine": "White and shaggy.", + "examine": "White and fluffy.", "melee_animation": "5338", "range_animation": "0", "combat_audio": "757,759,758", "attack_speed": "5", "respawn_delay": "60", - "defence_animation": "0", + "defence_animation": "5337", "weakness": "9", "magic_animation": "0", "death_animation": "5336", "name": "Ram", - "defence_level": "2", + "defence_level": "1", "safespot": null, - "lifepoints": "2", - "strength_level": "2", + "lifepoints": "8", + "strength_level": "1", "id": "3673", "range_level": "1", - "attack_level": "2" + "attack_level": "1" + }, + { + "name": "Sack", + "id": "3674" }, { "examine": "If you see them circling, run.", @@ -44981,42 +44991,46 @@ "attack_level": "1" }, { - "examine": "White and shaggy.", + "examine": "White and fluffy.", "melee_animation": "5338", "combat_audio": "757,759,758", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "5337", + "weakness": "9", "death_animation": "5336", "name": "Ram", "defence_level": "1", "safespot": null, - "lifepoints": "4", + "lifepoints": "8", "strength_level": "1", "id": "5168", "range_level": "1", "attack_level": "1" }, { - "examine": "White and shaggy.", + "examine": "White and fluffy.", "melee_animation": "5338", + "combat_audio": "757,759,758", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "5337", + "weakness": "9", "death_animation": "5336", "name": "Ram", "defence_level": "1", "safespot": null, - "lifepoints": "4", + "lifepoints": "8", "strength_level": "1", "id": "5169", "range_level": "1", "attack_level": "1" }, { - "examine": "White and shaggy.", + "examine": "White and fluffy.", "melee_animation": "5338", "range_animation": "0", + "combat_audio": "757,759,758", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "5337", @@ -45024,13 +45038,13 @@ "magic_animation": "0", "death_animation": "5336", "name": "Ram", - "defence_level": "2", + "defence_level": "1", "safespot": null, - "lifepoints": "2", - "strength_level": "2", + "lifepoints": "8", + "strength_level": "1", "id": "5170", "range_level": "1", - "attack_level": "2" + "attack_level": "1" }, { "examine": "This beast doesn't need climbing boots.", diff --git a/Server/data/configs/npc_spawns.json b/Server/data/configs/npc_spawns.json index 0d0d6cf2b..e0ba93b0b 100644 --- a/Server/data/configs/npc_spawns.json +++ b/Server/data/configs/npc_spawns.json @@ -1161,7 +1161,7 @@ }, { "npc_id": "412", - "loc_data": "{2728,10122,0,1,1}-{2735,10123,0,1,3}-{2733,10129,0,1,1}-{2728,10133,0,1,6}-{2722,10133,0,1,6}-{2736,10137,0,1,1}-{2732,10142,0,1,0}-{2726,10142,0,1,6}-{2729,10140,0,1,3}-{2720,10144,0,1,6}-{2712,10142,0,1,3}-{2760,3402,0,1,4}-{2759,3400,0,1,1}-{2756,3403,0,1,1}-{2759,3400,0,1,3}-{2755,3402,0,1,1}" + "loc_data": "{2728,10122,0,1,1}-{2735,10123,0,1,3}-{2733,10129,0,1,1}-{2728,10133,0,1,6}-{2722,10133,0,1,6}-{2736,10137,0,1,1}-{2732,10142,0,1,0}-{2726,10142,0,1,6}-{2729,10140,0,1,3}-{2720,10144,0,1,6}-{2712,10142,0,1,3}-{3341,3478,0,1,0}-{3343,3484,0,1,0}-{3345,3484,0,1,0}-{3350,3493,0,1,0}-{3353,3494,0,1,0}-{3361,3484,0,1,0}-{3364,3489,0,1,0}-{3370,3497,0,1,0}-{3379,3478,0,1,0}-{3379,3484,0,1,0}-{3387,3483,0,1,0}-{3388,3494,0,1,0}-{3389,3483,0,1,0}-{3411,3536,0,1,0}-{3418,3522,0,1,0}-{3425,3525,0,1,0}-{3429,3522,0,1,0}-{3432,3527,0,1,0}-{3434,3521,0,1,0}-{3445,3526,0,1,0}-{3565,3503,0,1,0}-{3567,3481,0,1,0}-{3580,3491,0,1,0}-{3588,3472,0,1,0}-{3598,3509,0,1,0}-{3599,3486,0,1,0}-{3607,3462,0,1,0}-{3611,3499,0,1,0}-{3613,3482,0,1,0}-{3627,3511,0,1,0}-{3628,3473,0,1,0}-{3636,3466,0,1,0}-{3639,3510,0,1,0}" }, { "npc_id": "419", @@ -2513,7 +2513,7 @@ }, { "npc_id": "970", - "loc_data": "{3082,3248,0,1,4}" + "loc_data": "{3081,3247,0,0,1}" }, { "npc_id": "1005", @@ -3101,11 +3101,15 @@ }, { "npc_id": "1219", - "loc_data": "{3292,5455,0,1,3}-{3295,5452,0,1,0}-{3290,5448,0,1,4}" + "loc_data": "{3537,3496,0,1,0}-{3545,3502,0,1,0}-{3546,3462,0,1,0}-{3548,3480,0,1,0}-{3551,3489,0,1,0}-{3554,3506,0,1,0}-{3560,3462,0,1,0}-{3566,3483,0,1,0}-{3567,3474,0,1,0}-{3572,3492,0,1,0}-{3574,3507,0,1,0}-{3588,3461,0,1,0}-{3589,3493,0,1,0}-{3590,3509,0,1,0}-{3596,3476,0,1,0}-{3599,3483,0,1,0}-{3607,3460,0,1,0}-{3613,3499,0,1,0}-{3614,3515,0,1,0}-{3620,3472,0,1,0}-{3623,3504,0,1,0}-{3626,3475,0,1,0}-{3626,3491,0,1,0}-{3629,3511,0,1,0}-{3633,3463,0,1,0}-{3644,3498,0,1,0}" }, { - "npc_id": "1220", - "loc_data": "{3600,3491,0,1,2}-{3598,3498,0,1,4}-{3600,3496,0,1,0}-{3600,3496,0,1,6}-{3602,3494,0,1,1}-{3597,3490,0,1,6}-{3595,3497,0,1,4}-{3605,3491,0,1,4}-{3604,3495,0,1,0}" + "npc_id": "1221", + "loc_data": "{3566,3457,0,1,0}-{3567,3503,0,1,0}-{3597,3489,0,1,0}-{3611,3462,0,1,0}-{3620,3500,0,1,0}-{3636,3484,0,1,0}" + }, + { + "npc_id": "1223", + "loc_data": "{3585,3478,0,1,0}-{3586,3480,0,1,0}-{3586,3496,0,1,0}-{3592,3477,0,1,0}-{3593,3458,0,1,0}-{3593,3508,0,1,0}-{3595,3491,0,1,0}-{3597,3479,0,1,0}-{3607,3466,0,1,0}-{3617,3477,0,1,0}-{3618,3514,0,1,0}-{3631,3471,0,1,0}-{3631,3499,0,1,0}-{3632,3459,0,1,0}-{3632,3475,0,1,0}-{3638,3472,0,1,0}-{3646,3467,0,1,0}" }, { "npc_id": "1227", @@ -3827,6 +3831,10 @@ "npc_id": "1658", "loc_data": "{2595,3087,1,1,1}" }, + { + "npc_id": "1665", + "loc_data": "{3544,3462,0,0,1}" + }, { "npc_id": "1668", "loc_data": "{3551,3550,0,1,0}" @@ -6311,13 +6319,17 @@ "npc_id": "3667", "loc_data": "{3269,9798,0,1,0}-{3269,9806,0,1,0}-{3269,9814,0,1,0}-{3275,9817,0,1,0}-{3276,9809,0,1,0}-{3280,9803,0,1,0}-{3282,9797,0,1,0}-{3285,9812,0,1,0}-{3288,9819,0,1,0}-{3289,9809,0,1,0}-{3290,9797,0,1,0}" }, + { + "npc_id": "3670", + "loc_data": "{3361,3505,0,1,0}" + }, { "npc_id": "3671", - "loc_data": "{3084,3250,0,1,1}" + "loc_data": "{3085,3251,0,0,3}" }, { "npc_id": "3673", - "loc_data": "{2925,3321,0,1,4}-{2924,3319,0,1,0}-{3196,3264,0,1,0}" + "loc_data": "{2322,3189,0,1,0}-{2924,3318,0,1,0}-{2924,3325,0,1,4}-{3248,3351,0,1,0}-{3195,3265,0,1,0}-{2653,4716,0,1,0}-{2656,3359,0,1,0}-{2656,3375,0,1,0}" }, { "npc_id": "3675", @@ -7794,7 +7806,15 @@ }, { "npc_id": "5168", - "loc_data": "{3207,3260,0,1,3}-{3197,3268,0,1,1}" + "loc_data": "{3260,3349,0,1,0}-{3199,3270,0,1,1}-{2658,4713,0,1,0}-{3209,3259,0,1,3}" + }, + { + "npc_id": "5169", + "loc_data": "{3234,3345,0,1,0}-{3196,3275,0,1,0}-{2657,4705,0,1,0}" + }, + { + "npc_id": "5170", + "loc_data": "{3052,3516,0,1,0}" }, { "npc_id": "5171", diff --git a/Server/data/configs/object_configs.json b/Server/data/configs/object_configs.json index d1c4e0b89..9a638671d 100644 --- a/Server/data/configs/object_configs.json +++ b/Server/data/configs/object_configs.json @@ -20007,6 +20007,26 @@ "examine": "Why do I never take time to look at the grass?", "ids": "14003" }, + { + "examine": "Well, I have the logs in place, now to get something to boil.", + "ids": "14005" + }, + { + "examine": "Covered in a thick layer of grease.", + "ids": "14006" + }, + { + "examine": "I'm glad this isn't for dinner.", + "ids": "14007" + }, + { + "examine": "This smells so very, very bad...", + "ids": "14008" + }, + { + "examine": "It seems to have all boiled away.", + "ids": "14009" + }, { "examine": "Home sweet home?", "ids": "15477" diff --git a/Server/data/configs/shops.json b/Server/data/configs/shops.json index df2d1af5d..714e32a73 100644 --- a/Server/data/configs/shops.json +++ b/Server/data/configs/shops.json @@ -1257,7 +1257,7 @@ "general_store": "false", "id": "143", "title": "Fortunato's Fine Wine", - "stock": "{1993,10,100}-{1937,10,100}-{7919,10,100}-{1935,10,100}" + "stock": "{1993,10,100}-{7810,10,100}-{7919,10,100}-{1935,10,100}" }, { "npcs": "558", diff --git a/Server/src/main/content/global/handlers/npc/ShopNPC.java b/Server/src/main/content/global/handlers/npc/ShopNPC.java index 187e4f017..2e352f58d 100644 --- a/Server/src/main/content/global/handlers/npc/ShopNPC.java +++ b/Server/src/main/content/global/handlers/npc/ShopNPC.java @@ -14,7 +14,7 @@ public class ShopNPC extends AbstractNPC { /** * The NPC ids of NPCs using this plugin. */ - private static final int[] ID = { 410, 528, 529, 525, 524, 1436, 590, 591, 971, 1917, 597, 1083, 3541, 7396, 1040, 563, 5798, 582, 526, 527, 873, 532, 533, 568, 2154, 1334, 2352, 4516, 520, 521, 4716, 3922, 1254, 2086, 1866, 530, 531, 836, 516, 560, 471, 522, 523, 4651, 4652, 4653, 4654, 4655, 4656, 4650, 534, 588, 2356, 1860, 550, 575, 683, 682, 4563, 4558, 4559, 519, 559, 562, 581, 554, 601, 1301, 1039, 2353, 3166, 2161, 2162, 600, 593, 545, 585, 5268, 2305, 2307, 2304, 1783, 557, 1038, 1433, 7053, 571, 5487, 536, 4294, 4293, 584, 570, 540, 2157, 69669, 569, 572, 573, 1303, 595, 297, 704, 587, 5110, 5109, 556, 1865, 543, 2198, 580, 1862, 583, 553, 461, 4513, 3097, 903, 1435, 606, 2623, 594, 579, 2160, 6750, 6898, 6893, 589, 5485, 542, 549, 3038, 544, 1434, 209, 1980, 546, 6988, 3671, 558, 576, 5266, 586, 602, 552, 551, 541, 692, 797, 564, 2152, 1208, 2233, 3205, 70, 1598, 1596, 1597, 1599, 2259, 3162, 1167, 2620, 2151, 5486, 4250, 1079, 970, 793, 2572 }; + private static final int[] ID = { 410, 528, 529, 525, 524, 1436, 590, 591, 971, 1917, 597, 1083, 3541, 7396, 1040, 563, 5798, 582, 526, 527, 873, 532, 533, 568, 2154, 1334, 2352, 4516, 520, 521, 4716, 3922, 1254, 2086, 1866, 530, 531, 836, 516, 560, 471, 522, 523, 4651, 4652, 4653, 4654, 4655, 4656, 4650, 534, 588, 2356, 1860, 550, 575, 683, 682, 4563, 4558, 4559, 519, 559, 562, 581, 554, 601, 1301, 1039, 2353, 3166, 2161, 2162, 600, 593, 545, 585, 5268, 2305, 2307, 2304, 1783, 557, 1038, 1433, 7053, 571, 5487, 536, 4294, 4293, 584, 570, 540, 2157, 69669, 569, 572, 573, 1303, 595, 297, 704, 587, 5110, 5109, 556, 1865, 543, 2198, 580, 1862, 583, 553, 461, 4513, 3097, 903, 1435, 606, 2623, 594, 579, 2160, 6750, 6898, 6893, 589, 5485, 542, 549, 3038, 544, 1434, 209, 1980, 546, 6988, 558, 576, 5266, 586, 602, 552, 551, 541, 692, 797, 564, 2152, 1208, 2233, 3205, 70, 1598, 1596, 1597, 1599, 2259, 3162, 1167, 2620, 2151, 5486, 4250, 1079, 793, 2572 }; /** * Constructs a new {@code ShopNPC} {@code Object}. diff --git a/Server/src/main/content/region/misthalin/draynor/dialogue/FortunatoDialogue.java b/Server/src/main/content/region/misthalin/draynor/dialogue/FortunatoDialogue.java deleted file mode 100644 index 18b909710..000000000 --- a/Server/src/main/content/region/misthalin/draynor/dialogue/FortunatoDialogue.java +++ /dev/null @@ -1,115 +0,0 @@ -package content.region.misthalin.draynor.dialogue; - -import core.game.dialogue.DialoguePlugin; -import core.game.dialogue.FacialExpression; -import core.game.node.entity.npc.NPC; -import core.plugin.Initializable; -import core.game.node.entity.player.Player; - -/** - * Represents the dialogue plugin used for fortunato. - * @author 'Vexia - * @version 1.0 - */ -@Initializable -public final class FortunatoDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code FortunatoDialogue} {@code Object}. - */ - public FortunatoDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code FortunatoDialogue} {@code Object}. - * @param player the player. - */ - public FortunatoDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new FortunatoDialogue(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - interpreter.sendDialogues(npc, FacialExpression.ASKING, "Can I help you at all?"); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - - switch (stage) { - case 0: - interpreter.sendOptions("Select an Option", "Yes, what are you selling?", "Not at the moment."); - stage = 1; - break; - case 1: - - switch (buttonId) { - case 1: - interpreter.sendDialogues(player, FacialExpression.HAPPY, "Yes, what are you selling?"); - stage = 10; - break; - case 2: - interpreter.sendDialogues(npc, FacialExpression.ANGRY, "Then move along, you filthy ragamuffin, I have customers", "to server!"); - stage = 24; - break; - } - - break; - case 10: - end(); - npc.openShop(player); - break; - case 20: - interpreter.sendDialogues(npc, FacialExpression.HAPPY, "Yes, indeed. The finest wine in Misthalin."); - stage = 21; - break; - case 21: - interpreter.sendDialogues(npc, FacialExpression.ASKING, "Care to take a look at my wares?"); - stage = 269; - break; - case 269: - interpreter.sendOptions("Select an Option", "Yes.", "Not at the moment."); - stage = 22; - break; - case 22: - - switch (buttonId) { - case 1: - end(); - stage = 10; - break; - case 2: - interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "Not at the moment."); - stage = 23; - break; - } - - break; - case 23: - interpreter.sendDialogues(npc, FacialExpression.ANGRY, "Then move along, you filthy ragamuffin, I have customers", "to server!"); - stage = 24; - break; - case 24: - end(); - break; - } - - return true; - } - - @Override - public int[] getIds() { - return new int[] { 3671 }; - } -} diff --git a/Server/src/main/content/region/misthalin/draynor/dialogue/FortunatoDialogue.kt b/Server/src/main/content/region/misthalin/draynor/dialogue/FortunatoDialogue.kt new file mode 100644 index 000000000..a26beb3ce --- /dev/null +++ b/Server/src/main/content/region/misthalin/draynor/dialogue/FortunatoDialogue.kt @@ -0,0 +1,41 @@ +package content.region.misthalin.draynor.dialogue + +// import content.region.misthalin.silvarea.quest.ragandboneman.FortunatoDialogueFile +import core.api.* +import core.game.dialogue.DialoguePlugin +import core.game.dialogue.FacialExpression +import core.game.dialogue.Topic +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.tools.END_DIALOGUE +import core.tools.START_DIALOGUE +import org.rs09.consts.NPCs + +@Initializable +class FortunatoDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + // openDialogue(player!!, FortunatoDialogueFile(), npc) + when (stage) { + START_DIALOGUE -> npcl(FacialExpression.ASKING, "Can I help you at all?").also { stage++ } + 1 -> showTopics( + Topic(FacialExpression.FRIENDLY, "Yes, what are you selling?", 2), + Topic(FacialExpression.FRIENDLY, "Not at the moment", 3), + ) + 2 -> openNpcShop(player, NPCs.FORTUNATO_3671).also { + end() + } + 3 -> npcl(FacialExpression.ANGRY, "Then move along, you filthy ragamuffin, I have customers to serve!").also { + stage = END_DIALOGUE + } + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FortunatoDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FORTUNATO_3671) + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/dialogue/OddOldManDialogue.kt b/Server/src/main/content/region/misthalin/silvarea/dialogue/OddOldManDialogue.kt new file mode 100644 index 000000000..6497914a2 --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/dialogue/OddOldManDialogue.kt @@ -0,0 +1,25 @@ +package content.region.misthalin.silvarea.dialogue + +import content.region.misthalin.silvarea.quest.ragandboneman.OddOldManDialogueFile +import core.api.openDialogue +import core.game.dialogue.DialoguePlugin +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +@Initializable +class OddOldManDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + // Fallback to default. Always the start of Rag and Bone Man + openDialogue(player!!, OddOldManDialogueFile(), npc) + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return OddOldManDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ODD_OLD_MAN_3670) + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/BearBehavior.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/BearBehavior.kt new file mode 100644 index 000000000..644372584 --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/BearBehavior.kt @@ -0,0 +1,36 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import core.api.* +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.NPCBehavior +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +class BearBehavior : NPCBehavior(*bearIds) { + companion object { + private val bearIds = intArrayOf( + NPCs.GRIZZLY_BEAR_105, + NPCs.BLACK_BEAR_106, + NPCs.GRIZZLY_BEAR_1195, + NPCs.GRIZZLY_BEAR_CUB_1196, + NPCs.GRIZZLY_BEAR_CUB_1197, + NPCs.BEAR_CUB_1326, + NPCs.BEAR_CUB_1327, + ) + } + + override fun onDropTableRolled(self: NPC, killer: Entity, drops: ArrayList) { + super.onDropTableRolled(self, killer, drops) + // Drops the Bear Ribs during Rag and Bone Man quest + if (killer is Player && isQuestInProgress(killer, RagAndBoneMan.questName, 1, 99)) { + if(RandomFunction.roll(4)) { + drops.add(Item(Items.BEAR_RIBS_7815)); + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/BigFrogBehavior.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/BigFrogBehavior.kt new file mode 100644 index 000000000..f3aede96b --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/BigFrogBehavior.kt @@ -0,0 +1,30 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import core.api.isQuestInProgress +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.NPCBehavior +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +class BigFrogBehavior : NPCBehavior(*bigFrogIds) { + companion object { + private val bigFrogIds = intArrayOf( + NPCs.BIG_FROG_1829, + ) + } + + override fun onDropTableRolled(self: NPC, killer: Entity, drops: ArrayList) { + super.onDropTableRolled(self, killer, drops) + // Drops the Big Frog Leg during Rag and Bone Man quest + if (killer is Player && isQuestInProgress(killer, RagAndBoneMan.questName, 1, 99)) { + if(RandomFunction.roll(4)) { + drops.add(Item(Items.BIG_FROG_LEG_7908)); + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/BoneBoilerEnum.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/BoneBoilerEnum.kt new file mode 100644 index 000000000..337a6c06d --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/BoneBoilerEnum.kt @@ -0,0 +1,65 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import org.rs09.consts.Items + +enum class BoneBoilerEnum(val bone: Int, val boneInVinegar: Int, val polishedBone: Int, val boneDescription: String) { + GOBLIN_SKULL(Items.GOBLIN_SKULL_7812, Items.BONE_IN_VINEGAR_7813, Items.GOBLIN_SKULL_7814, "goblin bone"), + BEAR_RIBS(Items.BEAR_RIBS_7815, Items.BONE_IN_VINEGAR_7816, Items.BEAR_RIBS_7817, "bear bone"), + RAM_SKULL(Items.RAM_SKULL_7818, Items.BONE_IN_VINEGAR_7819, Items.RAM_SKULL_7820, "ram bone"), + UNICORN_BONE(Items.UNICORN_BONE_7821, Items.BONE_IN_VINEGAR_7822, Items.UNICORN_BONE_7823, "unicorn bone"), + GIANT_RAT_BONE(Items.GIANT_RAT_BONE_7824, Items.BONE_IN_VINEGAR_7825, Items.GIANT_RAT_BONE_7826, "giant rat bone"), + GIANT_BAT_WING(Items.GIANT_BAT_WING_7827, Items.BONE_IN_VINEGAR_7828, Items.GIANT_BAT_WING_7829, "giant bat bone"), + WOLF_BONE(Items.WOLF_BONE_7830, Items.BONE_IN_VINEGAR_7831, Items.WOLF_BONE_7832, "wolf bone"), + BAT_WING(Items.BAT_WING_7833, Items.BONE_IN_VINEGAR_7834, Items.BAT_WING_7835, "bat bone"), + RAT_BONE(Items.RAT_BONE_7836, Items.BONE_IN_VINEGAR_7837, Items.RAT_BONE_7838, "rat bone"), + BABY_DRAGON_BONE(Items.BABY_DRAGON_BONE_7839, Items.BONE_IN_VINEGAR_7840, Items.BABY_DRAGON_BONE_7841, "baby blue dragon bone"), + OGRE_RIBS(Items.OGRE_RIBS_7842, Items.BONE_IN_VINEGAR_7843, Items.OGRE_RIBS_7844, "ogre bone"), + JOGRE_BONE(Items.JOGRE_BONE_7845, Items.BONE_IN_VINEGAR_7846, Items.JOGRE_BONE_7847, "jogre bone"), + ZOGRE_BONE(Items.ZOGRE_BONE_7848, Items.BONE_IN_VINEGAR_7849, Items.ZOGRE_BONE_7850, "zogre bone"), + MOGRE_BONE(Items.MOGRE_BONE_7851, Items.BONE_IN_VINEGAR_7852, Items.MOGRE_BONE_7853, "mogre bone"), + MONKEY_PAW(Items.MONKEY_PAW_7854, Items.BONE_IN_VINEGAR_7855, Items.MONKEY_PAW_7856, "monkey bone"), + DAGANNOTH_RIBS(Items.DAGANNOTH_RIBS_7857, Items.BONE_IN_VINEGAR_7858, Items.DAGANNOTH_RIBS_7859, "Dagannoth bone"), + SNAKE_SPINE(Items.SNAKE_SPINE_7860, Items.BONE_IN_VINEGAR_7861, Items.SNAKE_SPINE_7862, "snake bone"), + ZOMBIE_BONE(Items.ZOMBIE_BONE_7863, Items.BONE_IN_VINEGAR_7864, Items.ZOMBIE_BONE_7865, "zombie bone"), + WEREWOLF_BONE(Items.WEREWOLF_BONE_7866, Items.BONE_IN_VINEGAR_7867, Items.WEREWOLF_BONE_7868, "werewolf bone"), + MOSS_GIANT_BONE(Items.MOSS_GIANT_BONE_7869, Items.BONE_IN_VINEGAR_7870, Items.MOSS_GIANT_BONE_7871, "moss giant bone"), + FIRE_GIANT_BONE(Items.FIRE_GIANT_BONE_7872, Items.BONE_IN_VINEGAR_7873, Items.FIRE_GIANT_BONE_7874, "fire giant bone"), + ICE_GIANT_RIBS(Items.ICE_GIANT_RIBS_7875, Items.BONE_IN_VINEGAR_7876, Items.ICE_GIANT_RIBS_7877, "ice giant bone"), + TERRORBIRD_WING(Items.TERRORBIRD_WING_7878, Items.BONE_IN_VINEGAR_7879, Items.TERRORBIRD_WING_7880, "terrorbird bone"), + GHOUL_BONE(Items.GHOUL_BONE_7881, Items.BONE_IN_VINEGAR_7882, Items.GHOUL_BONE_7883, "ghoul bone"), + TROLL_BONE(Items.TROLL_BONE_7884, Items.BONE_IN_VINEGAR_7885, Items.TROLL_BONE_7886, "troll bone"), + SEAGULL_WING(Items.SEAGULL_WING_7887, Items.BONE_IN_VINEGAR_7888, Items.SEAGULL_WING_7889, "seagull bone"), + UNDEAD_COW_RIBS(Items.UNDEAD_COW_RIBS_7890, Items.BONE_IN_VINEGAR_7891, Items.UNDEAD_COW_RIBS_7892, "undead cow bone"), + EXPERIMENT_BONE(Items.EXPERIMENT_BONE_7893, Items.BONE_IN_VINEGAR_7894, Items.EXPERIMENT_BONE_7895, "experiment bone"), + RABBIT_BONE(Items.RABBIT_BONE_7896, Items.BONE_IN_VINEGAR_7897, Items.RABBIT_BONE_7898, "rabbit bone"), + BASILISK_BONE(Items.BASILISK_BONE_7899, Items.BONE_IN_VINEGAR_7900, Items.BASILISK_BONE_7901, "basilisk bone"), + DESERT_LIZARD_BONE(Items.DESERT_LIZARD_BONE_7902, Items.BONE_IN_VINEGAR_7903, Items.DESERT_LIZARD_BONE_7904, "desert lizard bone"), + CAVE_GOBLIN_SKULL(Items.CAVE_GOBLIN_SKULL_7905, Items.BONE_IN_VINEGAR_7906, Items.CAVE_GOBLIN_SKULL_7907, "cave goblin bone"), + BIG_FROG_LEG(Items.BIG_FROG_LEG_7908, Items.BONE_IN_VINEGAR_7909, Items.BIG_FROG_LEG_7910, "big frog bone"), + VULTURE_WING(Items.VULTURE_WING_7911, Items.BONE_IN_VINEGAR_7912, Items.VULTURE_WING_7913, "vulture bone"), + JACKAL_BONE(Items.JACKAL_BONE_7914, Items.BONE_IN_VINEGAR_7915, Items.JACKAL_BONE_7916, "jackal bone"); + + companion object { + @JvmField + val boneList = BoneBoilerEnum.values().map { it.bone }.toIntArray() + + @JvmField + val boneInVinegarList = BoneBoilerEnum.values().map { it.boneInVinegar }.toIntArray() + + @JvmField + val boneMap = values().associateBy { it.bone } + + @JvmField + val boneInVinegarMap = values().associateBy { it.boneInVinegar } + + @JvmStatic + fun forBone(id: Int): BoneBoilerEnum? { + return boneMap[id] + } + + @JvmStatic + fun forBoneInVinegar(id: Int): BoneBoilerEnum? { + return boneInVinegarMap[id] + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/GiantBatBehavior.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/GiantBatBehavior.kt new file mode 100644 index 000000000..3fac39d39 --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/GiantBatBehavior.kt @@ -0,0 +1,39 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import core.api.isQuestInProgress +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.NPCBehavior +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +class GiantBatBehavior : NPCBehavior(*giantBatIds) { + companion object { + private val giantBatIds = intArrayOf( + NPCs.GIANT_BAT_78, + NPCs.GIANT_BAT_1005, + NPCs.GIANT_BAT_2482, + NPCs.GIANT_BAT_2483, + NPCs.GIANT_BAT_2484, + NPCs.GIANT_BAT_2485, + NPCs.GIANT_BAT_2486, + NPCs.GIANT_BAT_2487, + NPCs.GIANT_BAT_2488, + NPCs.GIANT_BAT_3711, + ) + } + + override fun onDropTableRolled(self: NPC, killer: Entity, drops: ArrayList) { + super.onDropTableRolled(self, killer, drops) + // Drops the Giant Bat Wing during Rag and Bone Man quest + if (killer is Player && isQuestInProgress(killer, RagAndBoneMan.questName, 1, 99)) { + if(RandomFunction.roll(4)) { + drops.add(Item(Items.GIANT_BAT_WING_7827)); + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/GiantRatBehavior.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/GiantRatBehavior.kt new file mode 100644 index 000000000..ba1f06f82 --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/GiantRatBehavior.kt @@ -0,0 +1,44 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import core.api.isQuestInProgress +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.NPCBehavior +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +class GiantRatBehavior : NPCBehavior(*giantRatIds) { + companion object { + private val giantRatIds = intArrayOf( + NPCs.GIANT_RAT_4395, + NPCs.GIANT_RAT_446, + NPCs.GIANT_RAT_4922, + NPCs.GIANT_RAT_4923, + NPCs.GIANT_RAT_4924, + NPCs.GIANT_RAT_4925, + NPCs.GIANT_RAT_4926, + NPCs.GIANT_RAT_4927, + NPCs.GIANT_RAT_4942, + NPCs.GIANT_RAT_4943, + NPCs.GIANT_RAT_4944, + NPCs.GIANT_RAT_4945, + NPCs.GIANT_RAT_86, + NPCs.GIANT_RAT_87, + NPCs.GIANT_RAT_950, + ) + } + + override fun onDropTableRolled(self: NPC, killer: Entity, drops: ArrayList) { + super.onDropTableRolled(self, killer, drops) + // Drops the Giant Rat Bone during Rag and Bone Man quest + if (killer is Player && isQuestInProgress(killer, RagAndBoneMan.questName, 1, 99)) { + if(RandomFunction.roll(4)) { + drops.add(Item(Items.GIANT_RAT_BONE_7824)); + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/GoblinBehavior.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/GoblinBehavior.kt new file mode 100644 index 000000000..168f3dcde --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/GoblinBehavior.kt @@ -0,0 +1,188 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import content.global.handlers.npc.ChromaticDragonBehavior +import core.api.isQuestInProgress +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.NPCBehavior +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +class GoblinBehavior : NPCBehavior(*goblinIds) { + companion object { + private val goblinIds = intArrayOf( + NPCs.GOBLIN_100, + NPCs.GOBLIN_101, + NPCs.GOBLIN_102, + NPCs.GOBLIN_1769, + NPCs.GOBLIN_1770, + NPCs.GOBLIN_1771, + NPCs.GOBLIN_1772, + NPCs.GOBLIN_1773, + NPCs.GOBLIN_1774, + NPCs.GOBLIN_1775, + NPCs.GOBLIN_1776, + NPCs.GOBLIN_2274, + NPCs.GOBLIN_2275, + NPCs.GOBLIN_2276, + NPCs.GOBLIN_2277, + NPCs.GOBLIN_2278, + NPCs.GOBLIN_2279, + NPCs.GOBLIN_2280, + NPCs.GOBLIN_2281, + NPCs.GOBLIN_2678, + NPCs.GOBLIN_2679, + NPCs.GOBLIN_2680, + NPCs.GOBLIN_2681, + NPCs.GOBLIN_3264, + NPCs.GOBLIN_3265, + NPCs.GOBLIN_3266, + NPCs.GOBLIN_3267, + NPCs.GOBLIN_3726, + NPCs.GOBLIN_4261, + NPCs.GOBLIN_4262, + NPCs.GOBLIN_4263, + NPCs.GOBLIN_4264, + NPCs.GOBLIN_4265, + NPCs.GOBLIN_4266, + NPCs.GOBLIN_4267, + NPCs.GOBLIN_4268, + NPCs.GOBLIN_4269, + NPCs.GOBLIN_4270, + NPCs.GOBLIN_4271, + NPCs.GOBLIN_4272, + NPCs.GOBLIN_4273, + NPCs.GOBLIN_4274, + NPCs.GOBLIN_4275, + NPCs.GOBLIN_4276, + NPCs.GOBLIN_4407, + NPCs.GOBLIN_4408, + NPCs.GOBLIN_4409, + NPCs.GOBLIN_4410, + NPCs.GOBLIN_4411, + NPCs.GOBLIN_4412, + NPCs.GOBLIN_444, + NPCs.GOBLIN_445, + NPCs.GOBLIN_4479, + NPCs.GOBLIN_4480, + NPCs.GOBLIN_4481, + NPCs.GOBLIN_4482, + NPCs.GOBLIN_4483, + NPCs.GOBLIN_4484, + NPCs.GOBLIN_4485, + NPCs.GOBLIN_4486, + NPCs.GOBLIN_4487, + NPCs.GOBLIN_4488, + NPCs.GOBLIN_4489, + NPCs.GOBLIN_4490, + NPCs.GOBLIN_4491, + NPCs.GOBLIN_4492, + NPCs.GOBLIN_4499, + NPCs.GOBLIN_4633, + NPCs.GOBLIN_4634, + NPCs.GOBLIN_4635, + NPCs.GOBLIN_4636, + NPCs.GOBLIN_4637, + NPCs.GOBLIN_5855, + NPCs.GOBLIN_5856, + NPCs.GOBLIN_6125, + NPCs.GOBLIN_6126, + NPCs.GOBLIN_6132, + NPCs.GOBLIN_6133, + NPCs.GOBLIN_6279, + NPCs.GOBLIN_6280, + NPCs.GOBLIN_6281, + NPCs.GOBLIN_6282, + NPCs.GOBLIN_6283, + NPCs.GOBLIN_6284, + NPCs.GOBLIN_6402, + NPCs.GOBLIN_6403, + NPCs.GOBLIN_6404, + NPCs.GOBLIN_6405, + NPCs.GOBLIN_6406, + NPCs.GOBLIN_6407, + NPCs.GOBLIN_6408, + NPCs.GOBLIN_6409, + NPCs.GOBLIN_6410, + NPCs.GOBLIN_6411, + NPCs.GOBLIN_6412, + NPCs.GOBLIN_6413, + NPCs.GOBLIN_6414, + NPCs.GOBLIN_6415, + NPCs.GOBLIN_6416, + NPCs.GOBLIN_6417, + NPCs.GOBLIN_6418, + NPCs.GOBLIN_6419, + NPCs.GOBLIN_6420, + NPCs.GOBLIN_6421, + NPCs.GOBLIN_6422, + NPCs.GOBLIN_6423, + NPCs.GOBLIN_6424, + NPCs.GOBLIN_6425, + NPCs.GOBLIN_6426, + NPCs.GOBLIN_6427, + NPCs.GOBLIN_6428, + NPCs.GOBLIN_6429, + NPCs.GOBLIN_6430, + NPCs.GOBLIN_6431, + NPCs.GOBLIN_6432, + NPCs.GOBLIN_6433, + NPCs.GOBLIN_6434, + NPCs.GOBLIN_6435, + NPCs.GOBLIN_6436, + NPCs.GOBLIN_6437, + NPCs.GOBLIN_6438, + NPCs.GOBLIN_6439, + NPCs.GOBLIN_6440, + NPCs.GOBLIN_6441, + NPCs.GOBLIN_6442, + NPCs.GOBLIN_6443, + NPCs.GOBLIN_6444, + NPCs.GOBLIN_6445, + NPCs.GOBLIN_6446, + NPCs.GOBLIN_6447, + NPCs.GOBLIN_6448, + NPCs.GOBLIN_6449, + NPCs.GOBLIN_6450, + NPCs.GOBLIN_6451, + NPCs.GOBLIN_6452, + NPCs.GOBLIN_6453, + NPCs.GOBLIN_6454, + NPCs.GOBLIN_6455, + NPCs.GOBLIN_6456, + NPCs.GOBLIN_6457, + NPCs.GOBLIN_6458, + NPCs.GOBLIN_6459, + NPCs.GOBLIN_6460, + NPCs.GOBLIN_6461, + NPCs.GOBLIN_6462, + NPCs.GOBLIN_6463, + NPCs.GOBLIN_6464, + NPCs.GOBLIN_6465, + NPCs.GOBLIN_6466, + NPCs.GOBLIN_6467, + NPCs.GOBLIN_6490, + NPCs.GOBLIN_6491, + NPCs.GOBLIN_6492, + NPCs.GOBLIN_6493, + NPCs.GOBLIN_6494, + NPCs.GOBLIN_6495, + NPCs.GOBLIN_7964, + NPCs.GOBLIN_7965, + ) + } + + override fun onDropTableRolled(self: NPC, killer: Entity, drops: ArrayList) { + super.onDropTableRolled(self, killer, drops) + // Drops the Goblin Skull during Rag and Bone Man quest + if (killer is Player && isQuestInProgress(killer, RagAndBoneMan.questName, 1, 99)) { + if(RandomFunction.roll(4)) { + drops.add(Item(Items.GOBLIN_SKULL_7812)) + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/MonkeyBehavior.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/MonkeyBehavior.kt new file mode 100644 index 000000000..98c505819 --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/MonkeyBehavior.kt @@ -0,0 +1,54 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import core.api.isQuestInProgress +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.NPCBehavior +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +class MonkeyBehavior : NPCBehavior(*monkeyIds) { + companion object { + private val monkeyIds = intArrayOf( + NPCs.MONKEY_132, + NPCs.MONKEY_1463, + NPCs.MONKEY_1464, + NPCs.MONKEY_1487, + NPCs.MONKEY_2301, + NPCs.MONKEY_2302, + NPCs.MONKEY_2303, + NPCs.MONKEY_4344, + NPCs.MONKEY_4363, + NPCs.MONKEY_5852, + NPCs.MONKEY_5853, + NPCs.MONKEY_6943, + NPCs.MONKEY_7211, + NPCs.MONKEY_7213, + NPCs.MONKEY_7215, + NPCs.MONKEY_7217, + NPCs.MONKEY_7219, + NPCs.MONKEY_7221, + NPCs.MONKEY_7223, + NPCs.MONKEY_7225, + NPCs.MONKEY_7227, + NPCs.MONKEY_ZOMBIE_1465, + NPCs.MONKEY_ZOMBIE_1466, + NPCs.MONKEY_ZOMBIE_1467, + ) + } + + + override fun onDropTableRolled(self: NPC, killer: Entity, drops: ArrayList) { + super.onDropTableRolled(self, killer, drops) + // Drops the Monkey Paw during Rag and Bone Man quest + if (killer is Player && isQuestInProgress(killer, RagAndBoneMan.questName, 1, 99)) { + if(RandomFunction.roll(4)) { + drops.add(Item(Items.MONKEY_PAW_7854)); + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/OddOldManDialogueFile.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/OddOldManDialogueFile.kt new file mode 100644 index 000000000..440a279b4 --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/OddOldManDialogueFile.kt @@ -0,0 +1,233 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import content.region.asgarnia.burthorpe.quest.deathplateau.DeathPlateau +import core.api.* +import core.game.dialogue.DialogueFile +import core.game.dialogue.FacialExpression +import core.game.dialogue.Topic +import core.game.node.entity.player.Player +import core.tools.END_DIALOGUE +import core.tools.START_DIALOGUE +import org.rs09.consts.NPCs + +class OddOldManDialogueFile : DialogueFile() { + // BONES_3674 is the Sack on ODD_OLD_MAN_3670 + // There are probably FacialExpressions for the bone sack, but that's too much work. + override fun handle(componentID: Int, buttonID: Int) { + when (getQuestStage(player!!, RagAndBoneMan.questName)) { + 0 -> { + when (stage) { + START_DIALOGUE -> npcl(FacialExpression.FRIENDLY, "Can I help you with something?").also { stage++ } + 1 -> playerl(FacialExpression.FRIENDLY, "Well, err...who are you, and what are all these bones doing here?").also { stage++ } + 2 -> npcl(FacialExpression.FRIENDLY, "Errr...").also { stage++ } + 3 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble").also { stage++ } + 4 -> npcl(FacialExpression.FRIENDLY, "I'm an archaeologist. I work with the museum.").also { stage++ } + 5 -> playerl(FacialExpression.FRIENDLY, "An archaeologist?").also { stage++ } + 6 -> npcl(FacialExpression.FRIENDLY, "Yes.").also { stage++ } + 7 -> playerl(FacialExpression.FRIENDLY, "Well that explains the bones...sort of...but what are you doing all the way out here?").also { stage++ } + 8 -> npcl(FacialExpression.FRIENDLY, "Errr...").also { stage++ } + 9 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble. Mumblemumblemumble.").also { stage++ } + 10 -> npcl(FacialExpression.FRIENDLY, "I'm collecting bones for the museum.").also { stage++ } + 11 -> npcl(FacialExpression.FRIENDLY, "They have asked me to rig up some displays of second and third age creatures using their bones, so that people can come and...well, look at them.").also { stage++ } + 12 -> npcl(FacialExpression.FRIENDLY, "I need to get them into some sort of order before I begin, but I've run into a bit of a snag.").also { stage++ } + 13 -> playerl(FacialExpression.FRIENDLY, "What sort of a snag?").also { stage++ } + 14 -> npcl(FacialExpression.FRIENDLY, "Well, I need to have all the bones I'm going to use here, and placed into some sort of order.").also { stage++ } + 15 -> npcl(FacialExpression.FRIENDLY, "However, I seem to have discovered I am a few short.").also { stage++ } + 16 -> showTopics( + Topic("Anything I can do to help?", 20, true), + Topic("Well, good luck with that.", 70), + Topic("Where is that mumbling coming from?", 80) + ) + 20 -> playerl(FacialExpression.FRIENDLY, "Anything I can do to help?").also { stage++ } + 21 -> npcl(FacialExpression.FRIENDLY, "Errr...").also { stage++ } + 22 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble").also { stage++ } + 23 -> npcl(FacialExpression.FRIENDLY, "There is something you could do for me. I'm going to be busy...err...").also { stage++ } + 24 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumble").also { stage++ } + 25 -> npcl(FacialExpression.FRIENDLY, "Sorting, yes, sorting these bones out ready for the museum, but I need a few more.").also { stage++ } + 26 -> npcl(FacialExpression.FRIENDLY, "Will you help me out by grabbing some?").also { stage++ } + 27 -> showTopics( + Topic(FacialExpression.FRIENDLY, "Yes", 28, true), + Topic(FacialExpression.FRIENDLY, "No", 60), + Topic("Where is that mumbling coming from?", 80) + ) + 28 -> playerl(FacialExpression.FRIENDLY, "Yes. I'll give you a hand.").also { stage++ } + 29 -> npcl(FacialExpression.FRIENDLY, "You will? Excellent!").also { stage++ } + 30 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Sniggersnigger").also { stage++ } + 31 -> playerl(FacialExpression.FRIENDLY, "Where do you need me to dig?").also { stage++ } + 32 -> npcl(FacialExpression.FRIENDLY, "Dig?").also { stage++ } + 33 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble").also { stage++ } + 34 -> npcl(FacialExpression.FRIENDLY, "Oh, you must have got the wrong end of the stick.").also { stage++ } + 35 -> npcl(FacialExpression.FRIENDLY, "I need some fresh, whole bones to replace ones that have become damaged.").also { stage++ } + 36 -> playerl(FacialExpression.FRIENDLY, "What?").also { stage++ } + 37 -> npcl(FacialExpression.FRIENDLY, "Err...").also { stage++ } + 38 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumblemumblemumblemumble. Mumblemumblemumblemumble. Mumble.").also { stage++ } + 39 -> playerl(FacialExpression.FRIENDLY, "Excuse me...").also { stage++ } + 40 -> npcl(FacialExpression.FRIENDLY, "Shhh!").also { stage++ } + 41 -> playerl(FacialExpression.FRIENDLY, "Sorry...").also { stage++ } + 42 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble. Mumblemumblemumble.").also { stage++ } + 43 -> npcl(FacialExpression.FRIENDLY, "Ok, got it.").also { stage++ } + 44 -> npcl(FacialExpression.FRIENDLY, "Ok, here is the thing. While sorting out what bones I do have I managed to lose or damage a few. If you can get me some fresh, unbroken bones to use as replacements then I can get on with things.").also { stage++ } + 45 -> npcl(FacialExpression.FRIENDLY, "That make things clearer?").also { stage++ } + 46 -> playerl(FacialExpression.FRIENDLY, "Well, it makes some sense I suppose...").also { stage++ } + 47 -> npcl(FacialExpression.FRIENDLY, "Great. If you can get me a bone from a Goblin, a Bear, a Big Frog, a Ram, a Unicorn, a Monkey, a Giant rat and a Giant Bat then I'll be able to move on with the...").also { stage++ } + 48 -> npcl(FacialExpression.FRIENDLY, "Displays...").also { stage++ } + 49 -> playerl(FacialExpression.FRIENDLY, "So you just want me to bring you these bones and that will be that?").also { stage++ } + 50 -> npcl(FacialExpression.FRIENDLY, "Well, I wouldn't mind you sticking them in a pot and boiling them in vinegar first, if you don't mind.").also { stage++ } + 51 -> npcl(FacialExpression.FRIENDLY, "There is a Wine Merchant in Draynor called Fortunato that sells the stuff you'll need.").also { stage++ } + 52 -> npcl(FacialExpression.FRIENDLY, "You can even use my pot-boiler if you want.").also { stage++ } + 53 -> playerl(FacialExpression.FRIENDLY, "Why do I need to boil them in vinegar?").also { stage++ } + 54 -> npcl(FacialExpression.FRIENDLY, "It gets them bright and sparking white.").also { stage++ } + 55 -> npcl(FacialExpression.FRIENDLY, "It's an archaeologist thing.").also { stage++ } + 56 -> npcl(FacialExpression.FRIENDLY, "Just put the bone in a pot of vinegar, throw some logs on the fire, put the pot in the holder and light the logs.").also { stage++ } + 57 -> npcl(FacialExpression.FRIENDLY, "It takes a while for the vinegar to evaporate, but the bone will be nice and clean in the end.").also { stage++ } + 58 -> playerl(FacialExpression.FRIENDLY, "All right, I'll be back later.").also { stage++ } + 59 -> npcl(FacialExpression.FRIENDLY, "Bye!").also { + setQuestStage(player!!, RagAndBoneMan.questName, 1) + stage = END_DIALOGUE + } + + 60 -> npcl(FacialExpression.FRIENDLY, "Oh...I see.").also { stage++ } + 61 -> npcl(FacialExpression.FRIENDLY, "Well, never mind me young man, I'll just stagger over here under my massive burden, and continue my thankless task.").also { stage++ } + 62 -> npcl(FacialExpression.FRIENDLY, "Unaided and alone...").also { stage++ } + 63 -> playerl(FacialExpression.FRIENDLY, "Wow, trying a guilt trip much?").also { + stage = END_DIALOGUE + } + + 70 -> npcl(FacialExpression.FRIENDLY, "Thanks stranger!").also { stage++ } + 71 -> npcl(FacialExpression.FRIENDLY, "What a polite young man...").also { stage++ } + 72 -> npcl(FacialExpression.FRIENDLY, "Well, back to work!").also { + stage = END_DIALOGUE + } + + 80 -> npcl(FacialExpression.FRIENDLY, "Errr...").also { stage++ } + 81 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble").also { stage++ } + 82 -> npcl(FacialExpression.FRIENDLY, "What mumbling?").also { stage++ } + 83 -> npcl(FacialExpression.FRIENDLY, "Anyway, I have enough problems of my own without dealing with a delusional adventurer.").also { + stage = 16 + } + } + } + in 1 .. 3 -> { + when(stage) { + START_DIALOGUE -> { + if (checkBonesInInventory(player!!)) { + playerl(FacialExpression.FRIENDLY, "I have some bones for you...").also { stage = 1 } + } else { + npcl(FacialExpression.FRIENDLY, "Have you brought me any bones?").also { stage = 20 } + } + } + 1 -> npcl(FacialExpression.FRIENDLY, "Great! Let me take a look at them.").also { + stage++ + } + 2 -> { + submitBonesInInventory(player!!) + if (hasAllBones(player!!)) { + npcl(FacialExpression.FRIENDLY, "That's the last of them!").also { stage = 4 } + } else { + npcl(FacialExpression.FRIENDLY, "Thanks the museum will be so pleased.").also { stage = 3 } + } + } + 3 -> npcl(FacialExpression.FRIENDLY, "Come and see me when you have the rest.").also { + stage = END_DIALOGUE + } + 4 -> npcl(FacialExpression.FRIENDLY, "The museum will be thrilled to know I've completed the collection.").also { stage++ } + 5 -> playerl(FacialExpression.FRIENDLY, "Well I'm just glad I could help.").also { stage++ } + 6 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble").also { stage++ } + 7 -> npcl(FacialExpression.FRIENDLY, "Well you've been a big help and no mistake.").also { stage++ } + 8 -> npcl(FacialExpression.FRIENDLY, "I'm always on the lookout for fresh bones, so if you see some bring them right over.").also { stage++ } + 9 -> playerl(FacialExpression.FRIENDLY, "No problem, I'll be sure to bring anything you might like over if I find something.").also { stage++ } + 10 -> playerl(FacialExpression.FRIENDLY, "I can't wait to see the displays once they are finished.").also { stage++ } + 11 -> finishQuest(player!!, RagAndBoneMan.questName).also { + end() + } + 20 -> playerl(FacialExpression.FRIENDLY, "Not at the moment. Can you just give me a run down on which bones I have left to get?").also { stage++ } + 21 -> npcl(FacialExpression.FRIENDLY, "Sure.").also {stage = 30 } + 30, 40, 50, 60, 70, 80, 90, 100, 110 -> { + if (!getAttribute(player!!, RagAndBoneMan.attributeGoblinBone, false) && stage <= 30) { npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble"); stage = 31 } + else if (!getAttribute(player!!, RagAndBoneMan.attributeBearBone, false) && stage <= 40) { npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble"); stage = 41 } + else if (!getAttribute(player!!, RagAndBoneMan.attributeBigFrogBone, false) && stage <= 50) { npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble"); stage = 51 } + else if (!getAttribute(player!!, RagAndBoneMan.attributeRamBone, false) && stage <= 60) { npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble"); stage = 61 } + else if (!getAttribute(player!!, RagAndBoneMan.attributeUnicornBone, false) && stage <= 70) { npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble"); stage = 71 } + else if (!getAttribute(player!!, RagAndBoneMan.attributeMonkeyBone, false) && stage <= 80) { npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble"); stage = 81 } + else if (!getAttribute(player!!, RagAndBoneMan.attributeGiantRatBone, false) && stage <= 90) { npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble"); stage = 91 } + else if (!getAttribute(player!!, RagAndBoneMan.attributeGiantBatBone, false) && stage <= 100) { npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble"); stage = 101 } + else { + npcl(FacialExpression.FRIENDLY, "Did you get all that?") + stage = 111 + } + } + 31 -> npcl(FacialExpression.FRIENDLY, "You still need to bring me a Goblin bone.").also { stage++ } + 32 -> npcl(FacialExpression.FRIENDLY, "Goblins are relatively common. I hear there is a house full of them around Lumbridge in fact.").also { stage = 40 } + + 41 -> npcl(FacialExpression.FRIENDLY, "You still need to bring me a Bear bone.").also { stage++ } + 42 -> npcl(FacialExpression.FRIENDLY, "I heard that there are some Bears over by the Legends' Guild, near Ardougne.").also { stage = 50 } + + 51 -> npcl(FacialExpression.FRIENDLY, "You still need to bring me a Big Frog bone.").also { stage++ } + 52 -> npcl(FacialExpression.FRIENDLY, "This might be a little tricky as you will need to go into the Lumbridge Swamp caves. You will need a light source! Never forget your light source down there!").also { stage = 60 } + + 61 -> npcl(FacialExpression.FRIENDLY, "You still need to bring me a Ram bone.").also { stage++ } + 62 -> npcl(FacialExpression.FRIENDLY, "I'm sure you will be able to find a ram wherever there are sheep.").also { stage = 70 } + + 71 -> npcl(FacialExpression.FRIENDLY, "You still need to bring me a Unicorn bone.").also { stage++ } + 72 -> npcl(FacialExpression.FRIENDLY, "I seem to remember that there were Unicorns south of Varrock, I think they might be there still.").also { stage = 80 } + + 81 -> npcl(FacialExpression.FRIENDLY, "You still need to bring me a Monkey bone.").also { stage++ } + 82 -> npcl(FacialExpression.FRIENDLY, "Monkeys tend to live in Jungle areas, like Karamja. I think they are pretty plentiful there if I remember correctly.").also { stage = 90 } + + 91 -> npcl(FacialExpression.FRIENDLY, "You still need to bring me a Giant Rat bone.").also { stage++ } + 92 -> npcl(FacialExpression.FRIENDLY, "If you can't find one in a sewer, then you might want to try looking in some caves.").also { stage = 100 } + + 101 -> npcl(FacialExpression.FRIENDLY, "You still need to bring me a Giant Bat bone.").also { stage++ } + 102 -> npcl(FacialExpression.FRIENDLY, "Giant bats tend to live underground, but I have heard there are a few near the Coal Pits.").also { stage = 110 } + + 111 -> playerl(FacialExpression.FRIENDLY, "Yes. I'll get right on it.").also { stage++ } + 112 -> npcl(NPCs.BONES_3674, "Sack", FacialExpression.OLD_HAPPY, "Mumblemumble").also { stage++ } + 113 -> npcl(FacialExpression.FRIENDLY, "Don't forget to boil them in vinegar first.").also { stage++ } + 114 -> npcl(FacialExpression.FRIENDLY, "Just chuck some logs into the pit, put the bone in the pot of vinegar and drop it onto the pot-boiler. Then light the logs and wait for the the vinegar to boil away.").also { stage++ } + 115 -> playerl(FacialExpression.FRIENDLY, "Ok, I'll remember.").also { + stage = END_DIALOGUE + } + } + } + } + /* + Unfortunately from OSRS 2016: https://www.youtube.com/watch?v=31QNg1E0qf0 + Wonderful! I'll put this with the rest. + No problem. I'll be back if I find some more. + + This one is closest RS 2012: https://www.youtube.com/watch?v=0I8fNTeAwA8 + I have some bones for you... + Great! Let me take a look at them. + Thanks the museum will be so pleased. + Come and see me when you have the rest. + */ + } + + private fun checkBonesInInventory(player: Player) : Boolean { + var hasBone = false + RagAndBoneMan.requiredBonesMap.forEach { + if (inInventory(player, it.key)) { + hasBone = true + } + } + return hasBone + } + + private fun submitBonesInInventory(player: Player) { + RagAndBoneMan.requiredBonesMap.forEach { + if (!getAttribute(player, it.value, false) && removeItem(player, it.key)) { + setAttribute(player, it.value, true) + } + } + } + + private fun hasAllBones(player: Player) : Boolean { + var hasBoneAllBones = true + RagAndBoneMan.requiredBonesMap.values.forEach { + if (!getAttribute(player, it, false)) { + hasBoneAllBones = false + } + } + return hasBoneAllBones + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/RagAndBoneMan.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/RagAndBoneMan.kt new file mode 100644 index 000000000..0da5e32ec --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/RagAndBoneMan.kt @@ -0,0 +1,145 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import core.api.* +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.quest.Quest +import core.game.node.entity.skill.Skills +import core.plugin.Initializable +import org.rs09.consts.Items + +/** + * Rag and Bone Man Quest + * @author ovenbread + * + * Do note: + * Before, the Rag and Bone Man WISHLIST(a.k.a part 2) used to reward 1 quest point, + * thus required to wear the quest cape. + * This was changed on 11 August 2009. + * Rag and Bone Man Quest now rewards 2 quest points. + * The follow-up hidden quest called Rag and Bone Man WISHLIST is not a quest cape req. + * + * https://www.youtube.com/watch?v=6tdNqNa4zGw + * https://www.youtube.com/watch?v=aVyBzqyuPYs + * + * Quest Journal 2012 https://www.youtube.com/watch?v=0I8fNTeAwA8&t=764 + */ +@Initializable +class RagAndBoneMan : Quest("Rag and Bone Man",100, 99, 2, 714, 0, 1, 4) { + companion object { + const val questName = "Rag and Bone Man" + const val attributeGoblinBone = "/save:quest:ragandboneman-goblinbonesubmit" + const val attributeBearBone = "/save:quest:ragandboneman-bearbonesubmit" + const val attributeBigFrogBone = "/save:quest:ragandboneman-bigfrogbonesubmit" + const val attributeRamBone = "/save:quest:ragandboneman-rambonesubmit" + const val attributeUnicornBone = "/save:quest:ragandboneman-unicornbonesubmit" + const val attributeMonkeyBone = "/save:quest:ragandboneman-monkeybonesubmit" + const val attributeGiantRatBone = "/save:quest:ragandboneman-giantratbonesubmit" + const val attributeGiantBatBone = "/save:quest:ragandboneman-giantbatbonesubmit" + + val requiredBonesMap = mapOf( + Items.GOBLIN_SKULL_7814 to attributeGoblinBone, + Items.BEAR_RIBS_7817 to attributeBearBone, + Items.BIG_FROG_LEG_7910 to attributeBigFrogBone, + Items.RAM_SKULL_7820 to attributeRamBone, + Items.UNICORN_BONE_7823 to attributeUnicornBone, + Items.MONKEY_PAW_7856 to attributeMonkeyBone, + Items.GIANT_RAT_BONE_7826 to attributeGiantRatBone, + Items.GIANT_BAT_WING_7829 to attributeGiantBatBone + ) + } + + override fun drawJournal(player: Player?, stage: Int) { + super.drawJournal(player, stage) + var line = 12 + var stage = getStage(player) + + when (stage) { + 0 -> { + line(player, "I can start this quest by talking to the !!Odd Old Man?? to the", line++) + line(player, "West of the !!Limestone Mine??", line++) + } + in 1 .. 3 -> { + line(player, "I have spoken to the Odd Old Man and have agreed to help him ", line++, true) + line(player, "complete his collection of bones. I should check which ones", line++, true) + line(player, "he needs.", line++, true) + line++ + line(player,"The !!Odd Old Man?? has instructed me on which bones to collect", line++, false) + line(player,"and how to prepare them. I must find !!whole, unbroken bones??", line++, false) + line(player,"and put them into a !!pot of vinegar??. I must then put some", line++, false) + line(player,"!!logs?? under the !!pot boiler??, !!put the bone in vinegar on it??,", line++, false) + line(player,"!!and light the logs??. This will clean the bone.", line++, false) + line++ + line(player,"I need to buy the !!vinegar?? from the !!wine merchant?? in !!Draynor??.", line++, false) + line++ + line(player,"I need to give the !!Odd Old Man?? the following polished bones:", line++, false) + boneChecklist(player, line, "Goblin", BoneBoilerEnum.GOBLIN_SKULL, attributeGoblinBone) + line++ + boneChecklist(player, line, "Bear", BoneBoilerEnum.BEAR_RIBS, attributeBearBone) + line++ + boneChecklist(player, line, "Big frog", BoneBoilerEnum.BIG_FROG_LEG, attributeBigFrogBone) + line++ + boneChecklist(player, line, "Ram", BoneBoilerEnum.RAM_SKULL, attributeRamBone) + line++ + boneChecklist(player, line, "Unicorn", BoneBoilerEnum.UNICORN_BONE, attributeUnicornBone) + line++ + boneChecklist(player, line, "Monkey", BoneBoilerEnum.MONKEY_PAW, attributeMonkeyBone) + line++ + boneChecklist(player, line, "Giant rat", BoneBoilerEnum.GIANT_RAT_BONE, attributeGiantRatBone) + line++ + boneChecklist(player, line, "Giant bat", BoneBoilerEnum.GIANT_BAT_WING, attributeGiantBatBone) + line++ + } + 100 -> { + line(player, "I have spoken to the Odd Old Man and have agreed to help him ", line++, true) + line(player, "complete his collection of bones. I should check which ones", line++, true) + line(player, "he needs.", line++, true) + line++ + line(player,"The !!Odd Old Man?? has instructed me on which bones to collect", line++, true) + line(player,"and how to prepare them. I must find !!whole, unbroken bones??", line++, true) + line(player,"and put them into a !!pot of vinegar??. I must then put some", line++, true) + line(player,"!!logs?? under the !!pot boiler??, !!put the bone in vinegar on it??,", line++, true) + line(player,"!!and light the logs??. This will clean the bone.", line++, true) + line++ + line(player,"I have given the last of the bones to the Odd Old Man.", line++, true) + line(player,"I am sure he will reward me.", line++, true) + line++ + line(player,"The Odd Old Man has given me a reward. I will see if I can", line++, false) + line(player,"find any more bones from his wish list, and will bring them", line++, false) + line(player,"them to him if I do.", line++, false) + line++ + line(player,"%%QUEST COMPLETE!&&",line++) + } + } + } + + private fun boneChecklist(player: Player?, line: Int, mob: String, boneEnum: BoneBoilerEnum, questAttribute: String) { + line(player, + if (getAttribute(player!!, questAttribute, false)) + "!!$mob.??" + else if (inInventory(player, boneEnum.polishedBone)) + "!!$mob.?? (I have a prepared one !!with me.??)" + else if (inInventory(player, boneEnum.bone) || inInventory(player, boneEnum.boneInVinegar)) + "!!$mob.?? (I have an unprepared one !!with me.??)" + else + "!!$mob.??", + line, getAttribute(player, questAttribute, false)) + } + + override fun finish(player: Player) { + var ln = 10 + super.finish(player) + player.packetDispatch.sendString("You have completed Rag and Bone Man!", 277, 4) + player.packetDispatch.sendItemZoomOnInterface(Items.BONE_IN_VINEGAR_7813, 240, 277, 5) + + drawReward(player,"2 Quest Points", ln++) + drawReward(player,"500 Cooking XP and 500", ln++) + drawReward(player,"Prayer XP", ln++) + + player.skills.addExperience(Skills.COOKING, 500.0) + player.skills.addExperience(Skills.PRAYER, 500.0) + } + + override fun newInstance(`object`: Any?): Quest { + return this + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/RagAndBoneManListeners.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/RagAndBoneManListeners.kt new file mode 100644 index 000000000..72119a2b9 --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/RagAndBoneManListeners.kt @@ -0,0 +1,102 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import core.api.* +import core.game.interaction.IntType +import core.game.interaction.InteractionListener +import core.game.node.entity.impl.PulseType +import core.game.system.task.Pulse +import org.rs09.consts.Animations +import org.rs09.consts.Items +import org.rs09.consts.Scenery + +class RagAndBoneManListeners : InteractionListener { + + companion object { + const val ATTRIBUTE_ACTIVE_POT_OF_VINEGAR = "ragandboneman:potofvinegar" + } + + override fun defineListeners() { + // Pouring vinegar from jug to pot. + onUseWith(IntType.ITEM, Items.JUG_OF_VINEGAR_7810, Items.EMPTY_POT_1931) { player, _, _ -> + if (removeItem(player, Items.JUG_OF_VINEGAR_7810) && (removeItem(player, Items.EMPTY_POT_1931))) { + addItem(player, Items.POT_OF_VINEGAR_7811) + addItem(player, Items.JUG_1935) + sendMessage(player, "You pour the vinegar into the pot.") + } + return@onUseWith true + } + + // Adding a bone to the pot. + onUseWith(IntType.ITEM, BoneBoilerEnum.boneList, Items.POT_OF_VINEGAR_7811) { player, used, with -> + if (removeItem(player, used) && (removeItem(player, with))) { + addItem(player, BoneBoilerEnum.forBone(used.id)!!.boneInVinegar) + sendMessage(player, "You add the bone to the pot of vinegar.") + } + return@onUseWith true + } + + // Scenery: Placing logs on grate. + onUseWith(IntType.SCENERY, intArrayOf(Items.LOGS_1511, Items.OAK_LOGS_1521, Items.WILLOW_LOGS_1519, Items.MAPLE_LOGS_1517, Items.YEW_LOGS_1515, Items.MAGIC_LOGS_1513), Scenery.POT_BOILER_14006) { player, used, _ -> + if (removeItem(player, used)) { + sendMessage(player, "You place the logs into the grate.") + setVarbit(player, 2046, 1) + } + return@onUseWith true + } + + // Scenery: Placing bone in vinegar pot on pot boiler. + onUseWith(IntType.SCENERY, BoneBoilerEnum.boneInVinegarList, Scenery.POT_BOILER_14005) { player, used, _ -> + val potOfVinegar = used.id + if ((removeItem(player, potOfVinegar))) { + setAttribute(player, ATTRIBUTE_ACTIVE_POT_OF_VINEGAR, potOfVinegar) + sendMessage(player, "You place the pot on the pot boiler.") + setVarbit(player, 2046, 2) + } + return@onUseWith true + } + + // Scenery: Remove bone in vinegar pot from pot boiler. + on(Scenery.POT_BOILER_14007, SCENERY, "remove-pot") { player, _ -> + val potOfVinegar = getAttribute(player, ATTRIBUTE_ACTIVE_POT_OF_VINEGAR, 0) + if (BoneBoilerEnum.forBoneInVinegar(potOfVinegar) != null) { + setAttribute(player, ATTRIBUTE_ACTIVE_POT_OF_VINEGAR, 0) + addItemOrDrop(player, potOfVinegar) + sendMessage(player, "You remove the pot from the pot boiler.") + } + setVarbit(player, 2046, 1) + return@on true + } + + // Scenery: Lighting pot boiler and cooking the bone in vinegar to yield bone. + onUseWith(IntType.SCENERY, Items.TINDERBOX_590, Scenery.POT_BOILER_14007) { player, _, _ -> + sendMessage(player, "You light the logs under the pot.") + animate(player, Animations.HUMAN_LIGHT_FIRE_WITH_TINDERBOX_733) + runTask(player, 3) { + animate(player, -1, true) + setVarbit(player, 2046, 3) + // Player can do something else while the pot is lit, so a side pulse should be used. + player.pulseManager.run(object : Pulse(20) { // 20 * 600ms(1 tick) = 12000ms = 12s + override fun pulse(): Boolean { + setVarbit(player, 2046, 4) + return true + } + }, PulseType.CUSTOM_1) + } + return@onUseWith true + } + + // Taking bone and pot from boiled pot boiler. + on(Scenery.POT_BOILER_14009, SCENERY, "remove-bone") { player, _ -> + val potOfVinegar = getAttribute(player, ATTRIBUTE_ACTIVE_POT_OF_VINEGAR, 0) + if (BoneBoilerEnum.forBoneInVinegar(potOfVinegar) != null) { + val boneBoiler = BoneBoilerEnum.forBoneInVinegar(potOfVinegar)!! + setAttribute(player, ATTRIBUTE_ACTIVE_POT_OF_VINEGAR, 0) + addItemOrDrop(player, boneBoiler.polishedBone) + addItemOrDrop(player, Items.EMPTY_POT_1931) + sendMessage(player, "You retrieve a polished " + boneBoiler.boneDescription + " from the pot.") + } + setVarbit(player, 2046, 0) + return@on true + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/RamBehavior.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/RamBehavior.kt new file mode 100644 index 000000000..fa54dabbe --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/RamBehavior.kt @@ -0,0 +1,34 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import core.api.* +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.NPCBehavior +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +class RamBehavior : NPCBehavior(*ramIds) { + companion object { + private val ramIds = intArrayOf( + NPCs.RAM_3672, + NPCs.RAM_3673, + NPCs.RAM_5168, + NPCs.RAM_5169, + NPCs.RAM_5170, + ) + } + + override fun onDropTableRolled(self: NPC, killer: Entity, drops: ArrayList) { + super.onDropTableRolled(self, killer, drops) + // Drops the Ram Skull during Rag and Bone Man quest + if (killer is Player && isQuestInProgress(killer, RagAndBoneMan.questName, 1, 99)) { + if(RandomFunction.roll(4)) { + drops.add(Item(Items.RAM_SKULL_7818)); + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/UnicornBehavior.kt b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/UnicornBehavior.kt new file mode 100644 index 000000000..54f5ba15e --- /dev/null +++ b/Server/src/main/content/region/misthalin/silvarea/quest/ragandboneman/UnicornBehavior.kt @@ -0,0 +1,32 @@ +package content.region.misthalin.silvarea.quest.ragandboneman + +import core.api.isQuestInProgress +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.NPCBehavior +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +class UnicornBehavior : NPCBehavior(*unicornIds) { + companion object { + private val unicornIds = intArrayOf( + NPCs.UNICORN_89, + NPCs.UNICORN_987, + NPCs.BLACK_UNICORN_133, + ) + } + + override fun onDropTableRolled(self: NPC, killer: Entity, drops: ArrayList) { + super.onDropTableRolled(self, killer, drops) + // Drops the Unicorn Bone during Rag and Bone Man quest + if (killer is Player && isQuestInProgress(killer, RagAndBoneMan.questName, 1, 99)) { + if(RandomFunction.roll(4)) { + drops.add(Item(Items.UNICORN_BONE_7821)); + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/core/game/dialogue/DialogueFile.kt b/Server/src/main/core/game/dialogue/DialogueFile.kt index 3ddf241b4..92beaf0a6 100644 --- a/Server/src/main/core/game/dialogue/DialogueFile.kt +++ b/Server/src/main/core/game/dialogue/DialogueFile.kt @@ -1,6 +1,7 @@ package core.game.dialogue import core.api.splitLines +import core.cache.def.impl.NPCDefinition import core.game.component.Component import core.game.node.entity.Entity import core.game.node.entity.npc.NPC @@ -46,6 +47,17 @@ abstract class DialogueFile { } else interpreter!!.sendDialogues(npc, expression, *messages) } + open fun npc(id: Int, expression: FacialExpression?, vararg messages: String?): Component? { + val chatBoxComponent = interpreter!!.sendDialogues(id, expression, *messages) + return chatBoxComponent + } + + open fun npc(id: Int, title: String, expression: FacialExpression?, vararg messages: String?): Component? { + val chatBoxComponent = interpreter!!.sendDialogues(id, expression, *messages) + player!!.packetDispatch.sendString(title, chatBoxComponent.id, 3) + return chatBoxComponent + } + open fun player(vararg messages: String?): Component? { return interpreter!!.sendDialogues(player, null, *messages) } @@ -63,6 +75,14 @@ abstract class DialogueFile { return npc(expr, *splitLines(msg!!)) } + open fun npcl(id: Int, expr: FacialExpression?, msg: String?): Component? { + return npc(id, expr, *splitLines(msg!!)) + } + + open fun npcl(id: Int, title: String, expr: FacialExpression?, msg: String?): Component? { + return npc(id, title, expr, *splitLines(msg!!)) + } + open fun npcl(msg: String?): Component? { return npc(*splitLines(msg!!)) }