diff --git a/Server/data/CELEDT.xml b/Server/data/CELEDT.xml new file mode 100644 index 000000000..965f4bbfd --- /dev/null +++ b/Server/data/CELEDT.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Server/data/ObjectParser.xml b/Server/data/ObjectParser.xml index a2c8b6492..3a354d63b 100644 --- a/Server/data/ObjectParser.xml +++ b/Server/data/ObjectParser.xml @@ -24,5 +24,6 @@ + diff --git a/Server/data/botdata/bot_dialogue.json b/Server/data/botdata/bot_dialogue.json index be4ee4ae3..48bee0a54 100644 --- a/Server/data/botdata/bot_dialogue.json +++ b/Server/data/botdata/bot_dialogue.json @@ -218,10 +218,17 @@ "no", "We are no strangers to love", "You know the rules and so do I", - "A full commitments what Im thinking of", + "A full commitment's what I'm thinking of", + "You wouldn't get this from any other guy", + "I just wanna tell you how I'm feeling", + "Gotta make you understand", "You wouldnt get this from any other guy", "Never gonna give you up", "Never gonna let you down", + "Never gonna run around and desert you", + "Never gonna make you cry", + "Never gonna say goodbye", + "Never gonna tell a lie and hurt you", "why", "why", "why", @@ -243,7 +250,7 @@ "A blessing in disguise @name", "Break a leg", "Cut somebody some slack", - "Youre in the right place!", + "You're in the right place!", "Thanks so much.", "I really appreciate you @name", "Excuse me @name?", @@ -252,7 +259,7 @@ "How does that sound @name?", "That sounds great @name.", "I’m learning English.", - "I dont understand.", + "I don't understand.", "Could you repeat that please @name?", "Could you please talk slower @name?", "Thank you. That helps a lot.", @@ -310,11 +317,11 @@ "bowdi boy", "i love bowdi... sometimes", "@name = @name", - "Im bacon.. go on dad... say it", - "Im going to leave.", - "Im happy @name", - "Im not ready yet @name", - "Im very busy. I dont have time now.", + "I'm bacon.. go on dad... say it", + "I'm going to leave.", + "I'm happy @name", + "I'm not ready yet @name", + "I'm very busy. I don't have time now.", "Is that enough @name?", "I thought the clothes were cheaper @name", "Ive been here for two days @name.", @@ -329,7 +336,7 @@ "Very good, thanks @name", "Your things are all here i think?", "Long time no see @name", - "I couldnt agree more @name", + "I couldn't agree more @name", "It cost me a fortune @name", "I am dog tired", "Don’t take it personally", @@ -338,7 +345,187 @@ "No problem", "Anyway I should get going @name", "I cant help you there @name", - "I agree 100% @name" + "I agree 100% @name", + "I've gone mentally insane", + "My descent into madness is complete", + "Get real", + "Cry about it", + "Cope", + "Seethe", + "Yes mate", + "I am mentally deranged", + "I've gone past the point of insanity", + "I am beyond the point of no return", + "Sounds tricky.", + "Guthiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxx!!!!!!", + "530 gang for life", + "${real.username}, have you read the rules?", + "${real.username}, have you checked out the Discord?", + "why are the leprechauns moving?", + "I am beyond the point of no return!", + "Nothin' personnel, kid.", + "All your base are belong to us", + "May Guthix bring you balance.", + "May Guthix bring you balance.", + "May Guthix bring you balance.", + "Thy death was not in vain, for it brought some balance to the world. May Guthix bring you rest.", + "May you walk the path, and never fall, for Guthix walks beside thee on thy journey. May Guthix bring you peace.", + "All things must end, as all begin; Only Guthix knows the role thou must play. May Guthix bring you balance.", + "In life, in death, in joy, in sorrow: May thine experience show thee balance. May Guthix bring you balance.", + "Thou must do as thou must, no matter what. Thine actions bring balance to this world. May Guthix bring you balance.", + "The river flows, the sun ignites, May you stand with Guthix in thy fights. May Guthix bring you balance.", + "A journey of a single step, May take thee over a thousand miles. May Guthix bring you balance.", + "Zamorak give me strength!", + "Zamorak give me strength!", + "Zamorak give me strength!", + "May your bloodthirst never be sated, and may all your battles be glorious. Zamorak bring you strength.", + "There is no opinion that cannot be proven true...by crushing those who choose to disagree with it. Zamorak give me strength!", + "Battles are not lost and won; They simply remove the weak from the equation. Zamorak give me strength!", + "Those who fight, then run away, shame Zamorak with their cowardice. Zamorak give me strength!", + "Battle is by those who choose to disagree with it. Zamorak give me strength!", + "Strike fast, strike hard, strike true: The strength of Zamorak will be with you. Zamorak give me strength!", + "The weak deserve to die, so the strong may flourish. This is the creed of Zamorak.", + "This is Saradomin's wisdom.", + "This is Saradomin's wisdom.", + "This is Saradomin's wisdom.", + "Go in peace in the name of Saradomin; may his glory shine upon you like the sun.", + "Thy cause was false, thy skills did lack; See you in Lumbridge when you get back.", + "Protect your self, protect your friends. Mine is the glory that never ends. This is Saradomin's wisdom.", + "The darkness in life may be avoided, by the light of wisdom shining. This is Saradomin's wisdom.", + "Show love to your friends, and mercy to your enemies, and know that the wisdom of Saradomin will follow. This is Saradomin's wisdom.", + "A fight begun, when the cause is just, will prevail over all others. This is Saradomin's wisdom.", + "The currency of goodness is honour; It retains its value through scarcity. This is Saradomin's wisdom.", + "For Camelot!", + "Firmly grasp it!", + "My legs!", + "Build more farms.", + "B sale at Varrock ${real.username}, don't miss out!", + "Drop party follow me", + "Ryan where is barbass, you said two days Ryan", + "Barbass never", + "What da dog doin' doe?", + "A", + "Ae", + "Mof", + "Moth", + "Fluff", + "Bwuh", + "I'm literally just mothin' bro", + "Certified 2009scape classic.", + "Make sure to like, comment and subscribe ${real.username} it really helps", + "Real 2009scape hours!!! Murder that like if you up!!!!", + "W00t!", + "Owned!", + "Pwned!", + "Lol n00b", + "Epic ownage ${real.username}", + "Gielinor is a strange place, ${real.username}. Best have your wits about you.", + "Mad bloggers bro", + "Vibe check", + "Drip check", + "Uhuhuhuhuhuhuhuhu", + "Ahhhhhhhhhhhhhhhh", + "yall got any deez?", + "Deez nuts", + "When she give you that yoinky sploinky", + "Sir, this is a 2009scape.", + "Oh dear! You are dead!", + "Cor blimey, mate! What are ye doing in me pockets?", + "yeah i got funnies", + "read muv luv", + "Why doesn't she love me bros?", + "${real.username} is off the goop don't listen to the clown", + "do yall got laptops", + "cfunny play the alien warp sound effect", + "Ware to all whom doom hither, where cope is all yet constant.", + "Who wants to come GWD?", + "How do I make money?", + "Ironmen stand alone together!", + "based", + "where is she", + "*S N I I I I I I I I I F F F F F F F F F F F*", + "Hey ${real.username}, who was in Paris?", + "Huh whuh?", + "who's lone?", + "who *is* he?", + "Hi ${real.username}, I'm Dad!", + "anyone wanna play melty blood after I high alch these bows?", + "buru nyaaaa", + "Number 15, Taverley Dungeon Black Dragons.", + "House party at Rimmington! Host: ${real.username}!", + "Spending 200m! Trade me, no junk!", + "Surprise exam, ${real.username}!", + "Nice outfit ${real.username}, does it come in mens?", + "Nice outfit ${real.username}, does it come in womens?", + "Nice outfit ${real.username}, does it come in children's size 12?", + ":)", + ":D", + "die screaming", + "Only on Tuesdays", + "we stan 2009scape", + "There is no spoon", + "Where's the cow level?", + "Join 2009scape Clan Chat!", + "Join 2009scape Cc!", + "Chop chop!", + "Runescape rox my sox!!!!!!1", + "Type ::scripts for all 99s", + "Help I just died to Evil Chicken and I lost my stuff!", + "Can you fight Bandos in this game?", + "one bad gloop", + "${real.username} is not cute or funny", + "You have committed crimes against Gielinor and her people. What say you?", + "Barrows trauma", + "Uhuhuhuhuhu please Barrows give me the K top ahhhhhh", + "Selling rare lobby 1m", + "Rise and grind bloatscapers, let's get this bread", + "Nice", + "Sandwiches, ${real.username}!", + "What a grand and intoxicating innocence!", + "With this character's death, the thread of prophecy is severed.", + "You must gather your party before venturing forth.", + "Praise Andrew Gower", + "Please help me I can't stop playing 2009scape", + "Are you ignoring me, ${real.username}?!", + "i agree with this rfc can we put it in the game please" + ], + "halloween": [ + "Trick or treat!!!", + "Boo! Hahahahaha!!", + "Have you got your costume on, ${real.username}?", + "How much candy did you get, ${real.username}?", + "Don't dead open inside", + "Costume party at my POH!! Follow me!", + "Trick, then!", + "Brrrainssssssss...", + "'Cause this is thriller, thriller night, and no one's gonna save you from the beast about to strike!", + "This is Hallowe'en, this is Hallowe'en, pumpkins scream in the dead of night!", + "This is Hallowe'en, everybody make a scene, Trick or treat till the neighbors gonna die of fright!", + "In this town we call home, everyone hail to the pumpkin song!", + "Watch out for Skeleton Jack!", + "The headless-what-man? Horse? Never heard of those.", + "Bring me their souls!", + "I'll take any sweets you don't want, ${real.username}", + "Whatever you do, don't come to Draynor Manor on this spooky night.", + "Ahhhh! ${real.username}, you scared me! :(", + "I'm making soup from some leftover pumpkins, want any?", + "I'm gonna be so sick from eating all these sweets...", + "Rise from the grave, my minions! Tis' Hallowe'en!", + "This Scream Fortress 2 update hits kinda different...", + "Nice costume Woah", + "Nice costume, ${real.username}!", + "Ooh, a piece of candy.", + "Time to join the skeleton war, ${real.username}.", + "Spooky scary skeletons!", + "Spooky scary skeletons!", + "Spooky scary skeletons!", + "Spooky scary skeletons, send shivers down your spine!", + "Shrieking skulls will shock your soul, seal your doom tonight!", + "Spooky scary skeletons, speak with such a screech!", + "You'll shake and shudder in surprise, when you hear these zombies shriek!", + "'Cause spooky scary skeletons, shout startling shrilly screams!", + "Spooky scary skeletons, will wake you with a boo!", + "*doot doot*" ], "approaching_christmas": [ "Only @timer days left till christmas!", diff --git a/Server/data/configs/drop_tables.json b/Server/data/configs/drop_tables.json index 33cd196d8..abd2d0fac 100644 --- a/Server/data/configs/drop_tables.json +++ b/Server/data/configs/drop_tables.json @@ -13220,66 +13220,6 @@ "id": "199", "maxAmount": "2" }, - { - "minAmount": "1", - "weight": "50.0", - "id": "222", - "maxAmount": "6" - }, - { - "minAmount": "1", - "weight": "50.0", - "id": "238", - "maxAmount": "6" - }, - { - "minAmount": "1", - "weight": "50.0", - "id": "226", - "maxAmount": "6" - }, - { - "minAmount": "1", - "weight": "50.0", - "id": "1939", - "maxAmount": "6" - }, - { - "minAmount": "1", - "weight": "50.0", - "id": "224", - "maxAmount": "6" - }, - { - "minAmount": "1", - "weight": "50.0", - "id": "1581", - "maxAmount": "6" - }, - { - "minAmount": "1", - "weight": "50.0", - "id": "1976", - "maxAmount": "6" - }, - { - "minAmount": "1", - "weight": "40.0", - "id": "240", - "maxAmount": "6" - }, - { - "minAmount": "1", - "weight": "50.0", - "id": "2152", - "maxAmount": "6" - }, - { - "minAmount": "1", - "weight": "50.0", - "id": "9737", - "maxAmount": "6" - }, { "minAmount": "1", "weight": "50.0", @@ -13340,12 +13280,6 @@ "id": "217", "maxAmount": "2" }, - { - "minAmount": "12", - "weight": "50.0", - "id": "556", - "maxAmount": "12" - }, { "minAmount": "36", "weight": "50.0", @@ -14442,7 +14376,7 @@ ], "charm": [], "ids": "438,439,440,441,442,443,655,4470", - "description": "", + "description": "Tree Spirit (Hostile Woodcutting Random Event/Enchanted Valley)", "main": [ { "minAmount": "1", @@ -14464,7 +14398,7 @@ }, { "minAmount": "1", - "weight": "5.0", + "weight": "13.0", "id": "1359", "maxAmount": "1" }, @@ -14474,12 +14408,6 @@ "id": "561", "maxAmount": "22" }, - { - "minAmount": "1", - "weight": "1.0", - "id": "1462", - "maxAmount": "1" - }, { "minAmount": "1", "weight": "50.0", @@ -14552,35 +14480,95 @@ "id": "5301", "maxAmount": "1" }, - { - "minAmount": "1", - "weight": "5.0", - "id": "1619", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "5.0", - "id": "1617", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "25.0", - "id": "1621", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "25.0", - "id": "1623", - "maxAmount": "1" - }, { "minAmount": "1", "weight": "25.0", "id": "946", "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50.0", + "id": "3051", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50.0", + "id": "3049", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20.0", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20.0", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "19.0", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "18.0", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "12.0", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3.0", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3.0", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3.0", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "2.0", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1.5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1.5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3.0", + "id": "31", + "maxAmount": "1" } ] }, @@ -24004,12 +23992,6 @@ "weight": "2.0", "id": "12163", "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "120.0", - "id": "0", - "maxAmount": "1" } ], "ids": "2455,2456", @@ -24338,6 +24320,12 @@ "weight": "16.0", "id": "5733", "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1400.0", + "id": "0", + "maxAmount": "1" } ] }, @@ -30479,8 +30467,8 @@ "main": [ { "minAmount": "1", - "weight": "5.0", - "id": "5733", + "weight": "1.0", + "id": "0", "maxAmount": "1" } ] @@ -35694,10 +35682,10 @@ "maxAmount": "1" }, { - "minAmount": "29", + "minAmount": "2", "weight": "25.0", "id": "558", - "maxAmount": "29" + "maxAmount": "9" }, { "minAmount": "10", @@ -35718,10 +35706,10 @@ "maxAmount": "7" }, { - "minAmount": "46", + "minAmount": "4", "weight": "25.0", "id": "562", - "maxAmount": "46" + "maxAmount": "6" }, { "minAmount": "2", @@ -35730,10 +35718,10 @@ "maxAmount": "2" }, { - "minAmount": "34", + "minAmount": "3", "weight": "25.0", "id": "563", - "maxAmount": "34" + "maxAmount": "4" }, { "minAmount": "6", @@ -39016,159 +39004,166 @@ ] }, { - "default": [], + "default": [ + { + "minAmount": "1", + "weight": "1.0", + "id": "799", + "maxAmount": "1" + } + ], "charm": [], "ids": "3200", - "description": "", + "description": "Chaos Elemental (Boss)", "main": [ { "minAmount": "1", - "weight": "5.0", - "id": "5733", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "5.0", - "id": "31", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "5.0", - "id": "7158", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "25.0", + "weight": "100.0", "id": "1215", "maxAmount": "1" }, { - "minAmount": "250", - "weight": "50.0", - "id": "562", - "maxAmount": "250" - }, - { - "minAmount": "300", - "weight": "50.0", - "id": "809", - "maxAmount": "300" + "minAmount": "1", + "weight": "10.0", + "id": "7158", + "maxAmount": "1" }, { "minAmount": "500", - "weight": "25.0", + "weight": "98.0", "id": "556", "maxAmount": "500" }, - { - "minAmount": "1", - "weight": "25.0", - "id": "560", - "maxAmount": "125" - }, { "minAmount": "75", - "weight": "25.0", + "weight": "98.0", "id": "565", "maxAmount": "75" }, + { + "minAmount": "250", + "weight": "98.0", + "id": "562", + "maxAmount": "250" + }, + { + "minAmount": "125", + "weight": "98.0", + "id": "560", + "maxAmount": "125" + }, + { + "minAmount": "300", + "weight": "100.0", + "id": "809", + "maxAmount": "300" + }, { "minAmount": "150", - "weight": "25.0", + "weight": "100.0", "id": "892", "maxAmount": "150" }, { "minAmount": "1", - "weight": "50.0", - "id": "2440", - "maxAmount": "1" + "weight": "10.0", + "id": "199", + "maxAmount": "4" }, { "minAmount": "1", - "weight": "50.0", - "id": "2436", - "maxAmount": "1" + "weight": "10.0", + "id": "201", + "maxAmount": "4" }, { "minAmount": "1", - "weight": "50.0", - "id": "2442", - "maxAmount": "1" + "weight": "10.0", + "id": "203", + "maxAmount": "4" }, { - "minAmount": "3", - "weight": "50.0", - "id": "2297", - "maxAmount": "3" + "minAmount": "1", + "weight": "7.5", + "id": "205", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5.0", + "id": "207", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "3.0", + "id": "209", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "2.0", + "id": "211", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "2.0", + "id": "213", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "1.0", + "id": "215", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "1.0", + "id": "2485", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "1.0", + "id": "217", + "maxAmount": "1" }, { "minAmount": "10", - "weight": "50.0", - "id": "265", + "weight": "100.0", + "id": "465", "maxAmount": "10" }, - { - "minAmount": "5", - "weight": "25.0", - "id": "361", - "maxAmount": "5" - }, { "minAmount": "1", - "weight": "25.0", - "id": "5940", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "25.0", + "weight": "98.0", "id": "5952", "maxAmount": "1" }, { - "minAmount": "4", - "weight": "50.0", - "id": "526", - "maxAmount": "4" - }, - { - "minAmount": "5", - "weight": "50.0", - "id": "530", - "maxAmount": "5" - }, - { - "minAmount": "3", - "weight": "50.0", - "id": "532", - "maxAmount": "3" + "minAmount": "1", + "weight": "98.0", + "id": "5940", + "maxAmount": "1" }, { "minAmount": "7500", - "weight": "25.0", + "weight": "105.0", "id": "995", "maxAmount": "7500" }, { "minAmount": "1", - "weight": "25.0", - "id": "536", + "weight": "10.0", + "id": "31", "maxAmount": "1" }, - { - "minAmount": "2", - "weight": "25.0", - "id": "534", - "maxAmount": "2" - }, { "minAmount": "1", - "weight": "5.0", - "id": "1462", + "weight": "8.0", + "id": "5733", "maxAmount": "1" } ] @@ -40302,66 +40297,6 @@ "id": "556", "maxAmount": "105" }, - { - "minAmount": "1", - "weight": "20.0", - "id": "232", - "maxAmount": "10" - }, - { - "minAmount": "1", - "weight": "20.0", - "id": "12110", - "maxAmount": "10" - }, - { - "minAmount": "1", - "weight": "20.0", - "id": "222", - "maxAmount": "20" - }, - { - "minAmount": "1", - "weight": "20.0", - "id": "238", - "maxAmount": "15" - }, - { - "minAmount": "1", - "weight": "15.0", - "id": "2971", - "maxAmount": "10" - }, - { - "minAmount": "1", - "weight": "20.0", - "id": "10110", - "maxAmount": "10" - }, - { - "minAmount": "1", - "weight": "20.0", - "id": "226", - "maxAmount": "10" - }, - { - "minAmount": "1", - "weight": "20.0", - "id": "9018", - "maxAmount": "5" - }, - { - "minAmount": "1", - "weight": "20.0", - "id": "224", - "maxAmount": "10" - }, - { - "minAmount": "1", - "weight": "15.0", - "id": "240", - "maxAmount": "10" - }, { "minAmount": "105", "weight": "50.0", @@ -40467,7 +40402,7 @@ { "minAmount": "1", "weight": "5.0", - "id": "1", + "id": "12070", "maxAmount": "1" }, { @@ -40495,10 +40430,10 @@ "maxAmount": "1" }, { - "minAmount": "1", - "weight": "100.0", - "id": "0", - "maxAmount": "1" + "minAmount": "100", + "weight": "25.0", + "id": "441", + "maxAmount": "100" } ] }, @@ -48738,8 +48673,8 @@ "main": [ { "minAmount": "1", - "weight": "5.0", - "id": "5733", + "weight": "1.0", + "id": "0", "maxAmount": "1" } ] @@ -48753,7 +48688,7 @@ { "minAmount": "1", "weight": "5.0", - "id": "5733", + "id": "0", "maxAmount": "1" } ] @@ -63897,5 +63832,288 @@ "maxAmount": "1" } ] + }, + { + "default": [ + { + "minAmount": "1", + "weight": "1.0", + "id": "0", + "maxAmount": "1" + } + ], + "charm": [], + "ids": "391,392,393,394,395,396", + "description": "River Troll (Hostile Fishing Random Event)", + "main": [ + { + "minAmount": "1", + "weight": "10.0", + "id": "371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "383", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3.2", + "id": "331", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3.2", + "id": "327", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3.0", + "id": "345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1.0", + "id": "359", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "10.0", + "id": "313", + "maxAmount": "5" + }, + { + "minAmount": "30", + "weight": "10.0", + "id": "313", + "maxAmount": "30" + }, + { + "minAmount": "15", + "weight": "10.0", + "id": "313", + "maxAmount": "15" + }, + { + "minAmount": "20", + "weight": "3.2", + "id": "314", + "maxAmount": "20" + }, + { + "minAmount": "40", + "weight": "3.2", + "id": "314", + "maxAmount": "40" + }, + { + "minAmount": "50", + "weight": "2.0", + "id": "313", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "407", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "8.0", + "id": "405", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "2.5", + "id": "151", + "maxAmount": "1" + } + ] + }, + { + "default": [], + "charm": [], + "ids": "413,414,415,416", + "description": "Rock Golem (Combat lvl 14-79) (Hostile Mining Random Event)", + "main": [ + { + "minAmount": "5", + "weight": "20.0", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "42", + "weight": "5.0", + "id": "557", + "maxAmount": "42" + }, + { + "minAmount": "2", + "weight": "5.0", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5.0", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "2.0", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "2.0", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "2.0", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "1913", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "2347", + "maxAmount": "1" + } + ] + }, + { + "default": [], + "charm": [], + "ids": "417,418", + "description": "Rock Golem (Combat lvl 120-159) (Hostile Mining Random Event)", + "main": [ + { + "minAmount": "1", + "weight": "6.0", + "id": "1265", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1.5", + "id": "1271", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1.5", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "20.0", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "42", + "weight": "18.0", + "id": "557", + "maxAmount": "42" + }, + { + "minAmount": "2", + "weight": "18.0", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "20.0", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "17.0", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "17.0", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10.0", + "id": "449", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1.5", + "id": "451", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20.0", + "id": "1913", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20.0", + "id": "2347", + "maxAmount": "1" + } + ] } ] diff --git a/Server/data/configs/ground_spawns.json b/Server/data/configs/ground_spawns.json index 6e0b55b9b..41de69786 100644 --- a/Server/data/configs/ground_spawns.json +++ b/Server/data/configs/ground_spawns.json @@ -409,7 +409,7 @@ }, { "item_id": "1973", - "loc_data": "{1,3143,3453,0,5242920}" + "loc_data": "{1,3143,3453,0,5242920}-{1,2384,4440,0,5242920}" }, { "item_id": "1982", diff --git a/Server/data/configs/item_configs.json b/Server/data/configs/item_configs.json index 05572e770..d29bc0c9f 100644 --- a/Server/data/configs/item_configs.json +++ b/Server/data/configs/item_configs.json @@ -5862,6 +5862,7 @@ "name": "Wizard hat", "tradeable": "true", "archery_ticket_price": "0", + "hat": "true", "id": "579", "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0" }, @@ -6590,9 +6591,11 @@ { "ge_buy_limit": "100", "grand_exchange_price": "677", + "examine": "A silly pointed hat.", "durability": null, "name": "Hat", "archery_ticket_price": "0", + "hat": "true", "id": "656", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "equipment_slot": "0" @@ -6609,9 +6612,11 @@ { "ge_buy_limit": "100", "grand_exchange_price": "480", + "examine": "A silly pointed hat.", "durability": null, "name": "Hat", "archery_ticket_price": "0", + "hat": "true", "id": "658", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "equipment_slot": "0" @@ -6628,9 +6633,11 @@ { "ge_buy_limit": "100", "grand_exchange_price": "421", + "examine": "A silly pointed hat.", "durability": null, "name": "Hat", "archery_ticket_price": "0", + "hat": "true", "id": "660", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "equipment_slot": "0" @@ -6647,9 +6654,11 @@ { "ge_buy_limit": "100", "grand_exchange_price": "1102", + "examine": "A silly pointed hat.", "durability": null, "name": "Hat", "archery_ticket_price": "0", + "hat": "true", "id": "662", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "equipment_slot": "0" @@ -6669,12 +6678,14 @@ "durability": null, "name": "Hat", "archery_ticket_price": "0", + "hat": "true", "id": "664", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "equipment_slot": "0" }, { "ge_buy_limit": "100", + "examine": "A silly pointed hat.", "grand_exchange_price": "295", "durability": null, "name": "Hat", @@ -6794,7 +6805,7 @@ "id": "676" }, { - "examine": "An empty tray for panning./This tray contains mud.", + "examine": "An empty tray for panning.", "durability": null, "name": "Panning tray", "high_alchemy": "1", @@ -6802,7 +6813,7 @@ "id": "677" }, { - "examine": "An empty tray for panning./This tray contains mud.", + "examine": "This tray contains gold nuggets.", "durability": null, "name": "Panning tray", "high_alchemy": "1", @@ -6810,7 +6821,7 @@ "id": "678" }, { - "examine": "An empty tray for panning./This tray contains mud.", + "examine": "This tray contains mud.", "durability": null, "name": "Panning tray", "high_alchemy": "1", @@ -7275,6 +7286,7 @@ "name": "Blue hat", "tradeable": "true", "archery_ticket_price": "0", + "hat": "true", "id": "740", "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0" }, @@ -10047,6 +10059,7 @@ "name": "Wizard hat", "tradeable": "true", "archery_ticket_price": "0", + "hat": "true", "id": "1017", "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0" }, @@ -10458,6 +10471,7 @@ "name": "Santa hat", "tradeable": "true", "archery_ticket_price": "0", + "hat": "true", "id": "1050" }, { @@ -15843,7 +15857,7 @@ "archery_ticket_price": "0", "id": "1391", "stand_turn_anim": "1209", - "bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,0,0,0", + "bonuses": "7,-1,25,12,0,2,3,1,12,0,0,32,0,0,0", "requirements": "{0,30}-{6,30}", "shop_price": "7000", "durability": null, @@ -15882,7 +15896,7 @@ "archery_ticket_price": "0", "id": "1393", "stand_turn_anim": "1209", - "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0", "requirements": "{0,30}-{6,30}", "shop_price": "19600", "durability": null, @@ -15922,7 +15936,7 @@ "archery_ticket_price": "0", "id": "1395", "stand_turn_anim": "1209", - "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0", "requirements": "{0,30}-{6,30}", "durability": null, "high_alchemy": "9300", @@ -15961,7 +15975,7 @@ "archery_ticket_price": "0", "id": "1397", "stand_turn_anim": "1209", - "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0", "requirements": "{0,30}-{6,30}", "shop_price": "7000", "durability": null, @@ -16001,7 +16015,7 @@ "archery_ticket_price": "0", "id": "1399", "stand_turn_anim": "1209", - "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0", "requirements": "{0,30}-{6,30}", "shop_price": "1500", "durability": null, @@ -16041,7 +16055,7 @@ "archery_ticket_price": "0", "id": "1401", "stand_turn_anim": "1209", - "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0", "requirements": "{0,40}-{6,40}", "durability": null, "high_alchemy": "25500", @@ -16079,7 +16093,7 @@ "archery_ticket_price": "0", "id": "1403", "stand_turn_anim": "1209", - "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0", "requirements": "{0,40}-{6,40}", "durability": null, "high_alchemy": "25500", @@ -16116,7 +16130,7 @@ "archery_ticket_price": "0", "id": "1405", "stand_turn_anim": "1209", - "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0", "requirements": "{0,40}-{6,40}", "durability": null, "high_alchemy": "25500", @@ -16154,7 +16168,7 @@ "archery_ticket_price": "0", "id": "1407", "stand_turn_anim": "1209", - "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0", "requirements": "{0,40}-{6,40}", "shop_price": "40000", "durability": null, @@ -27879,6 +27893,7 @@ "name": "Robin hood hat", "tradeable": "true", "archery_ticket_price": "0", + "hat": "true", "id": "2581", "bonuses": "0,0,0,-10,8,4,6,8,4,4,7,0,0,0,0" }, @@ -28788,6 +28803,7 @@ "low_alchemy": "72", "high_alchemy": "108", "archery_ticket_price": "0", + "hat": "true", "id": "2651", "equipment_slot": "0" }, @@ -28873,7 +28889,7 @@ "tradeable": "true", "archery_ticket_price": "0", "id": "2657", - "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0" + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,1" }, { "ge_buy_limit": "2", @@ -28942,7 +28958,7 @@ { "requirements": "{1,40}", "ge_buy_limit": "2", - "examine": "Rune platelegs in the colours of Saradomin!", + "examine": "Rune platelegs in the colours of Saradomin.", "durability": null, "low_alchemy": "25600", "high_alchemy": "38400", @@ -29095,7 +29111,7 @@ "tradeable": "true", "archery_ticket_price": "0", "id": "2673", - "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0" + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,1,0,0" }, { "ge_buy_limit": "2", @@ -30882,6 +30898,7 @@ "name": "Hat", "tradeable": "true", "archery_ticket_price": "0", + "hat": "true", "id": "2900", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "equipment_slot": "0" @@ -32495,7 +32512,7 @@ "archery_ticket_price": "0", "id": "3053", "stand_turn_anim": "1209", - "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0", "requirements": "{0,30}-{6,30}", "durability": null, "high_alchemy": "10200", @@ -32525,7 +32542,7 @@ "archery_ticket_price": "0", "id": "3054", "stand_turn_anim": "1209", - "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0", "requirements": "{0,40}-{6,40}", "shop_price": "160", "durability": null, @@ -39292,7 +39309,7 @@ "id": "4020" }, { - "examine": "It's an unstrung Amulet of Monkey Speak. It makes vague chattering noises.", + "examine": "It's an Amulet of Monkey Speak. It makes vague chattering noises.", "durability": null, "name": "M'speak amulet", "weight": "1.3", @@ -63469,7 +63486,7 @@ "archery_ticket_price": "0", "id": "6562", "stand_turn_anim": "1209", - "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0", "requirements": "{0,30}-{6,30}", "durability": null, "high_alchemy": "10200", @@ -63497,7 +63514,7 @@ "archery_ticket_price": "0", "id": "6563", "stand_turn_anim": "1209", - "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0", "requirements": "{0,40}-{6,40}", "shop_price": "40000", "durability": null, @@ -71231,16 +71248,17 @@ { "ge_buy_limit": "2", "examine": "A silly pointed hat with colourful trim.", - "grand_exchange_price": "1400000", "durability": null, - "name": "Wizard hat (g)", - "tradeable": "true", "high_alchemy": "1", "weight": "1", + "equipment_slot": "0", + "grand_exchange_price": "1400000", + "name": "Wizard hat (g)", + "tradeable": "true", "archery_ticket_price": "0", + "hat": "true", "id": "7394", - "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", - "equipment_slot": "0" + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0" }, { "ge_buy_limit": "2", @@ -71254,16 +71272,17 @@ { "ge_buy_limit": "2", "examine": "A silly pointed hat, with colourful trim.", - "grand_exchange_price": "352700", "durability": null, - "name": "Wizard hat (t)", - "tradeable": "true", "high_alchemy": "1", "weight": "0.4", + "equipment_slot": "0", + "grand_exchange_price": "352700", + "name": "Wizard hat (t)", + "tradeable": "true", "archery_ticket_price": "0", + "hat": "true", "id": "7396", - "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", - "equipment_slot": "0" + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0" }, { "ge_buy_limit": "2", @@ -93676,7 +93695,7 @@ "id": "10371" }, { - "requirements": "{1,40}-{4,70}", + "requirements": "{4,70}", "ge_buy_limit": "2", "examine": "Zamorak blessed dragonhide chaps.", "durability": null, @@ -93781,7 +93800,7 @@ "id": "10379" }, { - "requirements": "{1,40}-{4,70}", + "requirements": "{4,70}", "ge_buy_limit": "2", "examine": "Guthix blessed dragonhide chaps.", "durability": null, @@ -93888,7 +93907,7 @@ "id": "10387" }, { - "requirements": "{1,40}-{4,70}", + "requirements": "{4,70}", "ge_buy_limit": "2", "examine": "Saradomin blessed dragonhide chaps.", "durability": null, @@ -98229,7 +98248,7 @@ "tradeable": "true", "archery_ticket_price": "0", "id": "10780", - "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,1" + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,0" }, { "examine": "Rune platebody with complete gold trim & plating.", @@ -105823,9 +105842,9 @@ "examine": "Part of the Godsword blade.", "grand_exchange_price": "150200", "durability": null, + "rare_item": "true", "name": "Godsword shard 1", "tradeable": "true", - "rare_item": "true", "low_alchemy": "100000", "high_alchemy": "150000", "weight": "2", @@ -105844,15 +105863,15 @@ { "ge_buy_limit": "10", "examine": "Part of the Godsword blade.", - "grand_exchange_price": "149100", "durability": null, - "name": "Godsword shard 2", - "tradeable": "true", "rare_item": "true", "low_alchemy": "100000", "high_alchemy": "150000", "destroy": "true", "weight": "2", + "grand_exchange_price": "149100", + "name": "Godsword shard 2", + "tradeable": "true", "archery_ticket_price": "0", "id": "11712" }, @@ -105870,9 +105889,9 @@ "examine": "Part of the Godsword blade.", "grand_exchange_price": "149800", "durability": null, + "rare_item": "true", "name": "Godsword shard 3", "tradeable": "true", - "rare_item": "true", "low_alchemy": "100000", "high_alchemy": "150000", "weight": "2", @@ -106206,7 +106225,7 @@ "archery_ticket_price": "0", "id": "11736", "stand_turn_anim": "1209", - "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0", "requirements": "{0,30}-{6,30}", "durability": null, "high_alchemy": "10200", @@ -106243,7 +106262,7 @@ "archery_ticket_price": "0", "id": "11738", "stand_turn_anim": "1209", - "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0", "requirements": "{0,40}-{6,40}", "durability": null, "high_alchemy": "27000", @@ -129223,7 +129242,7 @@ "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0" }, { - "examine": "Rune platelegs in the colours of Saradomin!", + "examine": "Rune platelegs in the colours of Saradomin.", "durability": null, "low_alchemy": "25600", "high_alchemy": "38400", @@ -129661,7 +129680,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "12,6,0", "equipment_slot": "4", @@ -129669,6 +129688,7 @@ "remove_sleeves": "true", "grand_exchange_price": "1412812", "name": "Zuriel's robe top", + "tradeable": "true", "archery_ticket_price": "0", "id": "13858", "bonuses": "0,0,0,35,-10,63,45,74,35,0,60,0,0,0,0" @@ -129680,7 +129700,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "1412812", @@ -129715,13 +129735,14 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "8,4,0", "equipment_slot": "7", "destroy_message": "Drop", "grand_exchange_price": "986668", "name": "Zuriel's robe bottom", + "tradeable": "true", "archery_ticket_price": "0", "id": "13861", "bonuses": "0,0,0,25,-7,38,35,44,24,0,30,0,0,0,0" @@ -129733,7 +129754,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "986668", @@ -129768,13 +129789,14 @@ "durability": null, "low_alchemy": "100000", "high_alchemy": "150000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "6,3,0", "equipment_slot": "0", "destroy_message": "Drop", "grand_exchange_price": "361542", "name": "Zuriel's hood", + "tradeable": "true", "archery_ticket_price": "0", "id": "13864", "bonuses": "0,0,0,8,-2,20,16,22,8,0,15,0,0,0,0" @@ -129786,7 +129808,7 @@ "durability": null, "low_alchemy": "100000", "high_alchemy": "150000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "361542", @@ -129830,6 +129852,7 @@ "destroy_message": "Drop", "grand_exchange_price": "2116989", "stand_anim": "813", + "tradeable": "true", "run_anim": "1210", "archery_ticket_price": "0", "id": "13867", @@ -129839,7 +129862,7 @@ "shop_price": "300000", "durability": null, "high_alchemy": "180000", - "destroy": "true", + "destroy": "false", "weapon_interface": "1", "render_anim": "28", "attack_audios": "2555,0,0,0", @@ -129852,7 +129875,7 @@ "durability": null, "low_alchemy": "120000", "high_alchemy": "180000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "2116989", @@ -129899,7 +129922,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "0,12,6", "equipment_slot": "4", @@ -129907,6 +129930,7 @@ "remove_sleeves": "true", "grand_exchange_price": "926341", "name": "Morrigan's leather body", + "tradeable": "true", "archery_ticket_price": "0", "id": "13870", "bonuses": "0,0,0,-15,36,61,53,66,75,62,60,0,0,0,0" @@ -129918,7 +129942,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "926341", @@ -129953,13 +129977,14 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "0,8,4", "equipment_slot": "7", "destroy_message": "Drop, Destroy after degrading.", "grand_exchange_price": "510395", "name": "Morrigan's leather chaps", + "tradeable": "true", "archery_ticket_price": "0", "id": "13873", "bonuses": "0,0,0,-10,23,35,29,37,46,35,30,0,0,0,0" @@ -129971,7 +129996,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop, Destroy after degrading.", "grand_exchange_price": "510395", @@ -130006,13 +130031,14 @@ "durability": null, "low_alchemy": "100000", "high_alchemy": "150000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "0,6,3", "equipment_slot": "0", "destroy_message": "Drop", "grand_exchange_price": "236411", "name": "Morrigan's coif", + "tradeable": "true", "archery_ticket_price": "0", "id": "13876", "bonuses": "0,0,0,-5,13,8,11,14,8,12,15,0,0,0,0" @@ -130024,7 +130050,7 @@ "durability": null, "low_alchemy": "100000", "high_alchemy": "150000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "236411", @@ -130060,7 +130086,7 @@ "durability": null, "low_alchemy": "1600", "high_alchemy": "2400", - "destroy": "true", + "destroy": "false", "attack_speed": "6", "weapon_interface": "18", "absorb": "0,0,0", @@ -130069,6 +130095,7 @@ "destroy_message": "Drop", "grand_exchange_price": "19944", "name": "Morrigan's javelin", + "tradeable": "true", "archery_ticket_price": "0", "id": "13879", "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0" @@ -130081,7 +130108,7 @@ "durability": null, "low_alchemy": "1600", "high_alchemy": "2400", - "destroy": "true", + "destroy": "false", "attack_speed": "6", "weapon_interface": "18", "absorb": "0,0,0", @@ -130090,6 +130117,7 @@ "destroy_message": "Drop", "grand_exchange_price": "19944", "name": "Morrigan's javelin(p)", + "tradeable": "true", "archery_ticket_price": "0", "id": "13880", "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0" @@ -130102,7 +130130,7 @@ "durability": null, "low_alchemy": "1600", "high_alchemy": "2400", - "destroy": "true", + "destroy": "false", "attack_speed": "6", "weapon_interface": "18", "absorb": "0,0,0", @@ -130111,6 +130139,7 @@ "destroy_message": "Drop", "grand_exchange_price": "19944", "name": "Morrigan's javelin(p+)", + "tradeable": "true", "archery_ticket_price": "0", "id": "13881", "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0" @@ -130123,7 +130152,7 @@ "durability": null, "low_alchemy": "1600", "high_alchemy": "2400", - "destroy": "true", + "destroy": "false", "attack_speed": "6", "weapon_interface": "18", "absorb": "0,0,0", @@ -130132,6 +130161,7 @@ "destroy_message": "Drop", "grand_exchange_price": "19944", "name": "Morrigan's javelin(p++)", + "tradeable": "true", "archery_ticket_price": "0", "id": "13882", "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0" @@ -130144,7 +130174,7 @@ "durability": null, "low_alchemy": "1600", "high_alchemy": "2400", - "destroy": "true", + "destroy": "false", "attack_speed": "5", "weapon_interface": "18", "absorb": "0,0,0", @@ -130152,6 +130182,7 @@ "destroy_message": "Drop", "grand_exchange_price": "9994", "name": "Morrigan's throwing axe", + "tradeable": "true", "archery_ticket_price": "0", "id": "13883", "bonuses": "0,0,0,0,93,0,0,0,0,0,0,0,0,0,0" @@ -130163,7 +130194,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "6,0,12", "equipment_slot": "4", @@ -130171,6 +130202,7 @@ "remove_sleeves": "true", "grand_exchange_price": "1619096", "name": "Statius's platebody", + "tradeable": "true", "archery_ticket_price": "0", "id": "13884", "bonuses": "5,5,7,-30,-10,154,145,121,-6,157,60,5,0,0,0" @@ -130182,7 +130214,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "1619096", @@ -130217,7 +130249,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "6,0,12", "equipment_slot": "4", @@ -130225,6 +130257,7 @@ "remove_sleeves": "true", "grand_exchange_price": "2154168", "name": "Vesta's chainbody", + "tradeable": "true", "archery_ticket_price": "0", "id": "13887", "bonuses": "5,7,7,-15,0,120,131,145,-3,140,60,6,0,0,0" @@ -130236,7 +130269,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop, Destroy once it has been degraded.", "grand_exchange_price": "2154168", @@ -130271,13 +130304,14 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "4,0,8", "equipment_slot": "7", "destroy_message": "Drop", "grand_exchange_price": "1735029", "name": "Statius's platelegs", + "tradeable": "true", "archery_ticket_price": "0", "id": "13890", "bonuses": "3,3,5,-21,-7,110,106,97,-4,121,30,3,0,0,0" @@ -130289,7 +130323,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "1735029", @@ -130323,13 +130357,14 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "4,0,8", "equipment_slot": "7", "destroy_message": "Drop", "grand_exchange_price": "1860767", "name": "Vesta's plateskirt", + "tradeable": "true", "archery_ticket_price": "0", "id": "13893", "bonuses": "3,5,5,-17,-4,86,100,112,-2,118,30,3,0,0,0" @@ -130341,7 +130376,7 @@ "durability": null, "low_alchemy": "200000", "high_alchemy": "300000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "1860767", @@ -130376,13 +130411,14 @@ "durability": null, "low_alchemy": "100000", "high_alchemy": "150000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "absorb": "3,0,6", "equipment_slot": "0", "destroy_message": "Drop", "grand_exchange_price": "1301986", "name": "Statius's full helm", + "tradeable": "true", "archery_ticket_price": "0", "id": "13896", "bonuses": "3,3,4,-6,-2,65,70,63,-1,71,15,3,0,0,0" @@ -130394,7 +130430,7 @@ "durability": null, "low_alchemy": "100000", "high_alchemy": "150000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "1301986", @@ -130438,6 +130474,7 @@ "attack_anims": "381,390,390,390", "destroy_message": "Drop", "grand_exchange_price": "10464249", + "tradeable": "true", "run_anim": "824", "archery_ticket_price": "0", "id": "13899", @@ -130447,7 +130484,7 @@ "shop_price": "300000", "durability": null, "high_alchemy": "180000", - "destroy": "true", + "destroy": "false", "weapon_interface": "5", "render_anim": "1426", "attack_audios": "2500,2500,2517,2500", @@ -130460,7 +130497,7 @@ "durability": null, "low_alchemy": "120000", "high_alchemy": "180000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop", "grand_exchange_price": "10464249", @@ -130516,6 +130553,7 @@ "destroy_message": "Drop, Destroy once it has been degraded.", "grand_exchange_price": "7424450", "stand_anim": "808", + "tradeable": "true", "run_anim": "1210", "archery_ticket_price": "0", "id": "13902", @@ -130525,7 +130563,7 @@ "shop_price": "300000", "durability": null, "high_alchemy": "180000", - "destroy": "true", + "destroy": "false", "weapon_interface": "10", "attack_audios": "2504,0,0,0", "name": "Statius's warhammer" @@ -130537,7 +130575,7 @@ "durability": null, "low_alchemy": "120000", "high_alchemy": "180000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "destroy_message": "Drop, Destroy once it has been degraded.", "grand_exchange_price": "7424450", @@ -130593,6 +130631,7 @@ "destroy_message": "Drop", "grand_exchange_price": "5264612", "stand_anim": "813", + "tradeable": "true", "run_anim": "1210", "archery_ticket_price": "0", "id": "13905", @@ -130602,7 +130641,7 @@ "shop_price": "300000", "durability": null, "high_alchemy": "180000", - "destroy": "true", + "destroy": "false", "weight": "4.2", "weapon_interface": "14", "render_anim": "28", @@ -130615,7 +130654,7 @@ "durability": null, "low_alchemy": "120000", "high_alchemy": "180000", - "destroy": "true", + "destroy": "false", "attack_speed": "4", "two_handed": "true", "destroy_message": "Drop", @@ -139623,5 +139662,10 @@ "render_anim": "28", "attack_audios": "2555,0,0,0", "name": "Staff of the raven" + }, + { + "examine": "Item container for C. Ele Minor Drop Table. You should not be able to obtain this item.", + "name": "C. Ele Minor Drop Table", + "id": "799" } -] +] \ No newline at end of file diff --git a/Server/data/configs/music_configs.json b/Server/data/configs/music_configs.json index f9b48736b..b7023d96a 100644 --- a/Server/data/configs/music_configs.json +++ b/Server/data/configs/music_configs.json @@ -2181,7 +2181,7 @@ "id": "573", "name": "The Mad Mole", "indexId": "393", - "borders": "{1728,5120,1791,5183}" + "borders": "{1728,5120,1791,5247}" }, { "id": "575", diff --git a/Server/data/configs/npc_configs.json b/Server/data/configs/npc_configs.json index 0486441e3..db5f53094 100644 --- a/Server/data/configs/npc_configs.json +++ b/Server/data/configs/npc_configs.json @@ -946,8 +946,8 @@ "attack_level": "240" }, { - "examine": "A dragon covered in frost and ice.", - "combat_audio": "408,410,409", + "examine": "Young but still dangerous.", + "combat_audio": "407,405,406", "magic_level": "116", "respawn_delay": "25", "weakness": "0", @@ -965,7 +965,7 @@ { "examine": "Young but still dangerous.", "slayer_task": "11", - "combat_audio": "408,410,409", + "combat_audio": "405,407,406", "melee_animation": "25", "attack_speed": "4", "magic_level": "1", @@ -1625,7 +1625,7 @@ "slayer_task": "8", "melee_animation": "64", "range_animation": "64", - "combat_audio": "400,404,403", + "combat_audio": "397,399,398", "attack_speed": "4", "magic_level": "1", "respawn_delay": "30", @@ -2003,6 +2003,7 @@ "attack_level": "17" }, { + "examine": "An extremely vicious scorpion.", "melee_animation": "6254", "combat_audio": "3611,3612,3610", "respawn_delay": "60", @@ -2071,7 +2072,7 @@ "slayer_task": "33", "melee_animation": "4666", "range_animation": "4666", - "combat_audio": "449,451,450", + "combat_audio": "447,451,450", "attack_speed": "5", "magic_level": "1", "respawn_delay": "20", @@ -2232,6 +2233,7 @@ "slayer_task": "44", "melee_animation": "4652", "range_animation": "4652", + "combat_audio": "448,451,450", "attack_speed": "6", "magic_level": "1", "respawn_delay": "30", @@ -3263,24 +3265,6 @@ "range_level": "1", "attack_level": "7" }, - { - "examine": "Rogueish.", - "melee_animation": "386", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Rogue", - "defence_level": "7", - "safespot": null, - "lifepoints": "10", - "strength_level": "7", - "id": "187", - "range_level": "1", - "attack_level": "7" - }, { "examine": "An evil human cleric.", "start_gfx": "99", @@ -3539,6 +3523,7 @@ "slayer_task": "69", "melee_animation": "1595", "range_animation": "1595", + "combat_audio": "729,731,730", "attack_speed": "5", "magic_level": "1", "defence_animation": "1596", @@ -3560,6 +3545,7 @@ "slayer_task": "69", "melee_animation": "1595", "range_animation": "1595", + "combat_audio": "729,731,730", "attack_speed": "5", "magic_level": "1", "defence_animation": "1596", @@ -3649,7 +3635,7 @@ "lifepoints": "17", "strength_level": "12", "id": "206", - "aggressive": "true", + "aggressive": "false", "clue_level": "1", "range_level": "1", "attack_level": "12" @@ -4627,7 +4613,7 @@ "attack_level": "1" }, { - "examine": "A mourner", + "examine": "A mourner, or plague healer.", "melee_animation": "414", "range_animation": "0", "defence_animation": "0", @@ -4644,7 +4630,7 @@ "attack_level": "24" }, { - "examine": "A mourner", + "examine": "A mourner, or plague healer.", "melee_animation": "422", "range_animation": "0", "defence_animation": "0", @@ -4769,6 +4755,7 @@ "attack_level": "1" }, { + "examine": "Man...", "name": "Man", "defence_level": "1", "safespot": null, @@ -4873,6 +4860,7 @@ "attack_level": "1" }, { + "examine": "A holy warrior.", "name": "Paladin", "defence_level": "1", "safespot": null, @@ -4974,7 +4962,7 @@ "attack_level": "27" }, { - "examine": "A pirate.", + "examine": "A pirate. Smells of brine and brimstone. Also vomit.", "melee_animation": "0", "range_animation": "0", "combat_audio": "498,500,499", @@ -5114,20 +5102,24 @@ "attack_level": "3" }, { - "examine": "A brightly coloured game bird.", - "melee_animation": "2371", + "examine": "Likes fish... hates people.", + "melee_animation": "284", "range_animation": "0", - "defence_animation": "0", + "attack_speed": "4", + "magic_level": "1", + "defence_animation": "285", "magic_animation": "0", - "death_animation": "2373", + "death_animation": "287", "name": "River troll", - "defence_level": "3", + "defence_level": "32", "safespot": null, - "lifepoints": "50", - "strength_level": "3", + "lifepoints": "35", + "strength_level": "32", "id": "392", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", "range_level": "1", - "attack_level": "3" + "attack_level": "32" }, { "examine": "Beefy.", @@ -5497,6 +5489,25 @@ "range_level": "1", "attack_level": "1" }, + { + "examine": "A very angry nymph.", + "melee_animation": "94", + "combat_audio": "498,500,499", + "attack_speed": "4", + "magic_level": "1", + "defence_animation": "95", + "death_animation": "97", + "name": "Tree spirit", + "defence_level": "8", + "safespot": null, + "lifepoints": "25", + "strength_level": "8", + "id": "438", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "1", + "attack_level": "8" + }, { "examine": "A very angry nymph.", "melee_animation": "94", @@ -5508,9 +5519,11 @@ "name": "Tree spirit", "defence_level": "17", "safespot": null, - "lifepoints": "50", + "lifepoints": "40", "strength_level": "17", - "id": "438", + "id": "439", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", "range_level": "1", "attack_level": "17" }, @@ -5523,30 +5536,15 @@ "defence_animation": "95", "death_animation": "97", "name": "Tree spirit", - "defence_level": "32", - "safespot": null, - "lifepoints": "55", - "strength_level": "32", - "id": "439", - "range_level": "1", - "attack_level": "32" - }, - { - "examine": "A very angry nymph.", - "melee_animation": "94", - "combat_audio": "498,500,499", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "95", - "death_animation": "97", - "name": "Tree spirit", - "defence_level": "48", + "defence_level": "38", "safespot": null, "lifepoints": "60", - "strength_level": "48", + "strength_level": "38", "id": "440", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", "range_level": "1", - "attack_level": "48" + "attack_level": "38" }, { "examine": "A very angry nymph.", @@ -5557,13 +5555,15 @@ "defence_animation": "95", "death_animation": "97", "name": "Tree spirit", - "defence_level": "65", + "defence_level": "64", "safespot": null, "lifepoints": "86", - "strength_level": "65", + "strength_level": "64", "id": "441", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", "range_level": "1", - "attack_level": "65" + "attack_level": "64" }, { "examine": "A very angry nymph.", @@ -5579,6 +5579,8 @@ "lifepoints": "120", "strength_level": "100", "id": "442", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", "range_level": "1", "attack_level": "100" }, @@ -5596,6 +5598,8 @@ "lifepoints": "170", "strength_level": "130", "id": "443", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", "range_level": "1", "attack_level": "130" }, @@ -6443,7 +6447,7 @@ "attack_level": "1" }, { - "examine": "Likes you more", + "examine": "Likes you more, the more you spend.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -6475,7 +6479,7 @@ "attack_level": "1" }, { - "examine": "Likes you more", + "examine": "Likes you more, the more you spend.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -6620,7 +6624,7 @@ "attack_level": "1" }, { - "examine": "Ironically", + "examine": "Ironically, makes a living from swords.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -7512,7 +7516,7 @@ "slayer_task": "8", "melee_animation": "64", "range_animation": "64", - "combat_audio": "400,404,403", + "combat_audio": "397,399,398", "attack_speed": "4", "magic_level": "1", "respawn_delay": "30", @@ -7845,7 +7849,7 @@ }, { "slayer_exp": "0", - "examine": "It's an NPC.", + "examine": "A local civilian.", "name": "Edmond", "defence_level": "1", "safespot": null, @@ -8869,19 +8873,21 @@ "examine": "Tough-looking.", "slayer_task": "64", "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", + "attack_speed": "4", + "magic_level": "1", + "respawn_delay": "300", "defence_animation": "0", "weakness": "7", "magic_animation": "0", "name": "Ogre chieftain", - "defence_level": "58", + "defence_level": "75", "safespot": null, - "lifepoints": "331", - "strength_level": "58", + "lifepoints": "60", + "strength_level": "71", "id": "852", + "bonuses": "5,5,5,0,0,0,0,0,0,0,0,7,0,0,0", "range_level": "1", - "attack_level": "58" + "attack_level": "75" }, { "name": "Gorad", @@ -10222,6 +10228,7 @@ "attack_level": "24" }, { + "examine": "Incey wincey.", "melee_animation": "6249", "respawn_delay": "60", "defence_animation": "6250", @@ -10238,6 +10245,7 @@ }, { "slayer_exp": "8", + "examine": "An annoying flappy thing.", "name": "Giant bat", "defence_level": "1", "safespot": null, @@ -10372,6 +10380,7 @@ "examine": "A fire elemental.", "melee_animation": "1029", "range_animation": "0", + "combat_audio": "1534,1536,1535", "magic_level": "32", "respawn_delay": "60", "defence_animation": "0", @@ -10392,6 +10401,7 @@ "examine": "An earth elemental.", "melee_animation": "4868", "range_animation": "0", + "combat_audio": "1531,1533,1532", "attack_speed": "7", "respawn_delay": "60", "defence_animation": "0", @@ -10413,6 +10423,7 @@ "examine": "An air elemental.", "melee_animation": "1040", "range_animation": "0", + "combat_audio": "1527,1529,1528", "respawn_delay": "60", "defence_animation": "0", "weakness": "1", @@ -10432,6 +10443,7 @@ "examine": "A water elemental.", "melee_animation": "1044", "range_animation": "0", + "combat_audio": "1546,1543,1545", "respawn_delay": "60", "defence_animation": "0", "weakness": "1", @@ -10541,7 +10553,7 @@ "attack_level": "25" }, { - "examine": "Arrghhh... A Ghast.", + "examine": "Arrghhh... a Ghast.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -10993,7 +11005,7 @@ "attack_level": "63" }, { - "examine": "A big", + "examine": "Careful, he is a big.", "slayer_task": "83", "range_animation": "0", "attack_speed": "7", @@ -12195,6 +12207,7 @@ "combat_style": "1", "melee_animation": "428", "range_animation": "426", + "combat_audio": "425,427,426", "respawn_delay": "60", "defence_animation": "0", "weakness": "2", @@ -12216,6 +12229,7 @@ "slayer_task": "31", "melee_animation": "428", "range_animation": "0", + "combat_audio": "425,427,426", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -12400,6 +12414,7 @@ "start_gfx": "250", "combat_style": "1", "melee_animation": "426", + "combat_audio": "425,427,426", "respawn_delay": "60", "defence_animation": "425", "death_animation": "836", @@ -12516,6 +12531,7 @@ "slayer_task": "37", "melee_animation": "422", "range_animation": "422", + "combat_audio": "442,444,443", "attack_speed": "4", "magic_level": "1", "respawn_delay": "35", @@ -13106,6 +13122,7 @@ "attack_level": "46" }, { + "examine": "Slightly more magical.", "name": "Wizard", "defence_level": "1", "safespot": null, @@ -15049,51 +15066,63 @@ "melee_animation": "1383", "range_animation": "0", "combat_audio": "629,631,630", - "defence_animation": "0", + "attack_speed": "4", + "magic_level": "60", + "respawn_delay": "50", + "defence_animation": "1393", "weakness": "6", "magic_animation": "0", "death_animation": "1384", "name": "Monkey Zombie", - "defence_level": "55", - "safespot": null, - "lifepoints": "78", - "strength_level": "55", - "id": "1465", - "aggressive": "true", - "range_level": "1", - "attack_level": "55" - }, - { - "melee_animation": "1392", - "combat_audio": "629,631,630", - "respawn_delay": "60", - "defence_animation": "1393", - "death_animation": "1384", - "name": "Monkey Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "90", - "strength_level": "1", - "id": "1466", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "1392", - "combat_audio": "629,631,630", - "respawn_delay": "60", - "defence_animation": "1393", - "death_animation": "1384", - "name": "Monkey Zombie", - "defence_level": "1", + "defence_level": "60", "safespot": null, "lifepoints": "60", - "strength_level": "1", + "strength_level": "60", + "id": "1465", + "aggressive": "true", + "bonuses": "35,35,35,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "1", + "attack_level": "150" + }, + { + "examine": "A large and lumbering undead monkey stands here, blocking the way.", + "melee_animation": "1392", + "combat_audio": "629,631,630", + "attack_speed": "4", + "magic_level": "90", + "respawn_delay": "13", + "defence_animation": "1393", + "death_animation": "1384", + "name": "Monkey Zombie", + "defence_level": "90", + "safespot": null, + "lifepoints": "90", + "strength_level": "110", + "id": "1466", + "aggressive": "true", + "bonuses": "35,35,35,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "1", + "attack_level": "150" + }, + { + "examine": "A recently deceased monkey. Its flesh seems to be worse for the wear.", + "melee_animation": "1392", + "combat_audio": "629,631,630", + "attack_speed": "4", + "magic_level": "60", + "respawn_delay": "50", + "defence_animation": "1393", + "death_animation": "1384", + "name": "Monkey Zombie", + "defence_level": "60", + "safespot": null, + "lifepoints": "60", + "strength_level": "60", "id": "1467", "aggressive": "true", + "bonuses": "15,15,15,0,0,0,0,0,0,0,0,0,0,0,0", "range_level": "1", - "attack_level": "1" + "attack_level": "100" }, { "examine": "He looks like the type of guy who would mind monkeys.", @@ -15779,7 +15808,7 @@ "slayer_task": "33", "melee_animation": "4666", "range_animation": "4666", - "combat_audio": "449,451,450", + "combat_audio": "447,451,450", "attack_speed": "5", "magic_level": "1", "respawn_delay": "20", @@ -15804,7 +15833,7 @@ "slayer_task": "33", "melee_animation": "4666", "range_animation": "4666", - "combat_audio": "449,451,450", + "combat_audio": "447,451,450", "attack_speed": "5", "magic_level": "1", "respawn_delay": "20", @@ -15829,7 +15858,7 @@ "slayer_task": "33", "melee_animation": "4666", "range_animation": "4666", - "combat_audio": "449,451,450", + "combat_audio": "447,451,450", "attack_speed": "5", "magic_level": "1", "respawn_delay": "20", @@ -15854,7 +15883,7 @@ "slayer_task": "33", "melee_animation": "4666", "range_animation": "4666", - "combat_audio": "449,451,450", + "combat_audio": "447,451,450", "attack_speed": "5", "magic_level": "1", "respawn_delay": "20", @@ -15879,7 +15908,7 @@ "slayer_task": "33", "melee_animation": "4666", "range_animation": "4666", - "combat_audio": "449,451,450", + "combat_audio": "447,451,450", "attack_speed": "5", "magic_level": "1", "respawn_delay": "20", @@ -15954,7 +15983,7 @@ "slayer_task": "68", "melee_animation": "25", "range_animation": "25", - "combat_audio": "408,410,409", + "combat_audio": "405,407,406", "attack_speed": "5", "magic_level": "40", "respawn_delay": "32", @@ -16098,6 +16127,7 @@ "slayer_task": "16", "melee_animation": "266", "range_animation": "266", + "combat_audio": "341,343,342", "attack_speed": "4", "poisonous": "true", "respawn_delay": "25", @@ -16120,6 +16150,7 @@ "examine": "A spiky crawling critter. ", "melee_animation": "266", "range_animation": "266", + "combat_audio": "341,343,342", "attack_speed": "4", "poisonous": "true", "respawn_delay": "25", @@ -16141,6 +16172,7 @@ "examine": "A spiky crawling critter. ", "melee_animation": "266", "range_animation": "266", + "combat_audio": "341,343,342", "attack_speed": "4", "poisonous": "true", "respawn_delay": "25", @@ -16162,6 +16194,7 @@ "examine": "A spiky crawling critter. ", "melee_animation": "266", "range_animation": "266", + "combat_audio": "341,343,342", "attack_speed": "4", "poisonous": "true", "respawn_delay": "25", @@ -16291,6 +16324,7 @@ "examine": "Large, heavy, with sharp things attached to its head.", "melee_animation": "9439", "range_animation": "9439", + "combat_audio": "588,590,589", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -16313,6 +16347,7 @@ "examine": "Large, heavy, with sharp things attached to its head.", "melee_animation": "9439", "range_animation": "9439", + "combat_audio": "588,590,589", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -16335,6 +16370,7 @@ "examine": "Flies like a rock.", "melee_animation": "9454", "range_animation": "1516", + "combat_audio": "428,430,429", "attack_speed": "4", "magic_level": "1", "defence_animation": "9455", @@ -16398,6 +16434,7 @@ "examine": "An evil death demon.", "melee_animation": "9487", "range_animation": "1528", + "combat_audio": "645,647,646", "attack_speed": "4", "magic_level": "1", "defence_animation": "9489", @@ -16441,6 +16478,7 @@ "slayer_task": "1", "melee_animation": "1537", "range_animation": "1537", + "combat_audio": "276,278,277", "attack_speed": "4", "magic_level": "1", "defence_animation": "0", @@ -16501,6 +16539,7 @@ "examine": "The tongue of evil.", "melee_animation": "9130", "range_animation": "1552", + "combat_audio": "312,314,313", "attack_speed": "4", "respawn_delay": "60", "defence_animation": "9132", @@ -16522,6 +16561,7 @@ "examine": "The tongue of evil.", "melee_animation": "9130", "range_animation": "1552", + "combat_audio": "312,314,313", "attack_speed": "4", "respawn_delay": "60", "defence_animation": "9132", @@ -16544,6 +16584,7 @@ "slayer_task": "19", "melee_animation": "7762", "range_animation": "7762", + "combat_audio": "363,365,364", "attack_speed": "5", "defence_animation": "7761", "weakness": "2", @@ -16565,6 +16606,7 @@ "examine": "The winged reptile.", "melee_animation": "7762", "range_animation": "7762", + "combat_audio": "363,365,364", "attack_speed": "5", "defence_animation": "7761", "slayer_exp": "37", @@ -16585,6 +16627,7 @@ "examine": "He's one big leg short!", "melee_animation": "9471", "range_animation": "9471", + "combat_audio": "873,875,874", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -16598,6 +16641,7 @@ "strength_level": "85", "id": "1622", "bonuses": "0,0,0,0,0,0,20,20,0,0,0,0,0,0,0", + "clue_level": "2", "range_level": "1", "attack_level": "55" }, @@ -16605,6 +16649,7 @@ "examine": "He's one big leg short!", "melee_animation": "9471", "range_animation": "9471", + "combat_audio": "873,875,874", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -16618,6 +16663,7 @@ "strength_level": "88", "id": "1623", "bonuses": "0,0,0,0,0,0,20,20,0,0,0,0,0,0,0", + "clue_level": "2", "range_level": "1", "attack_level": "58" }, @@ -16626,6 +16672,7 @@ "slayer_task": "28", "melee_animation": "1557", "range_animation": "1557", + "combat_audio": "414,416,415", "attack_speed": "4", "defence_animation": "1555", "weakness": "2", @@ -16663,6 +16710,7 @@ "examine": "She's one leg short!", "melee_animation": "9471", "range_animation": "9471", + "combat_audio": "873,875,874", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -16684,6 +16732,7 @@ "examine": "It's one leg short!", "melee_animation": "9471", "range_animation": "9471", + "combat_audio": "873,875,874", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -16705,6 +16754,7 @@ "examine": "It's one small leg short!", "melee_animation": "9471", "range_animation": "9471", + "combat_audio": "873,875,874", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -16726,6 +16776,7 @@ "examine": "He's one big leg short!", "melee_animation": "9471", "range_animation": "9471", + "combat_audio": "873,875,874", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -16747,6 +16798,7 @@ "examine": "He's one big leg short!", "melee_animation": "9471", "range_animation": "9471", + "combat_audio": "873,875,874", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -16764,53 +16816,12 @@ "range_level": "1", "attack_level": "57" }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "9506", - "range_animation": "9506", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "9508", - "weakness": "7", - "magic_animation": "9506", - "death_animation": "9507", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1631", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "9506", - "range_animation": "9506", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "9508", - "weakness": "7", - "magic_animation": "9506", - "death_animation": "9507", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1632", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, { "spawn_animation": "8081", "examine": "A small fire demon.", "slayer_task": "66", "melee_animation": "8080", + "combat_audio": "696,698,697", "attack_speed": "5", "magic_level": "10", "respawn_delay": "60", @@ -16834,6 +16845,7 @@ "examine": "A small fire demon.", "slayer_task": "66", "melee_animation": "8080", + "combat_audio": "696,698,697", "attack_speed": "5", "magic_level": "10", "respawn_delay": "60", @@ -16857,6 +16869,7 @@ "examine": "A small fire demon.", "slayer_task": "66", "melee_animation": "8080", + "combat_audio": "696,698,697", "attack_speed": "5", "magic_level": "10", "respawn_delay": "60", @@ -16880,6 +16893,7 @@ "examine": "A small fire demon.", "slayer_task": "66", "melee_animation": "8080", + "combat_audio": "696,698,697", "attack_speed": "5", "magic_level": "10", "respawn_delay": "60", @@ -16903,6 +16917,7 @@ "slayer_task": "51", "melee_animation": "8569", "range_animation": "8569", + "combat_audio": "547,550,549", "attack_speed": "5", "magic_level": "40", "defence_animation": "8571", @@ -16925,6 +16940,7 @@ "slayer_task": "51", "melee_animation": "8569", "range_animation": "0", + "combat_audio": "547,550,549", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -16947,6 +16963,7 @@ "slayer_task": "51", "melee_animation": "8569", "range_animation": "0", + "combat_audio": "547,550,549", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -16969,6 +16986,7 @@ "slayer_task": "51", "melee_animation": "8569", "range_animation": "0", + "combat_audio": "547,550,549", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -16988,6 +17006,7 @@ }, { "melee_animation": "8569", + "combat_audio": "547,550,549", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "8571", @@ -17004,6 +17023,7 @@ }, { "melee_animation": "8569", + "combat_audio": "547,550,549", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "8571", @@ -17147,6 +17167,7 @@ "slayer_task": "21", "melee_animation": "9125", "range_animation": "9125", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "20", "defence_animation": "9127", @@ -17169,6 +17190,7 @@ "slayer_task": "21", "melee_animation": "9125", "range_animation": "0", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -17190,6 +17212,7 @@ "slayer_task": "21", "melee_animation": "9125", "range_animation": "0", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -17210,6 +17233,7 @@ "slayer_task": "21", "melee_animation": "9125", "range_animation": "0", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -17231,6 +17255,7 @@ "slayer_task": "21", "melee_animation": "9125", "range_animation": "0", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -17252,6 +17277,7 @@ "slayer_task": "21", "melee_animation": "9444", "range_animation": "0", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -17273,6 +17299,7 @@ "slayer_task": "21", "melee_animation": "9444", "range_animation": "0", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -17294,6 +17321,7 @@ "slayer_task": "21", "melee_animation": "9444", "range_animation": "0", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -17314,6 +17342,7 @@ "slayer_task": "21", "melee_animation": "9444", "range_animation": "0", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -17335,6 +17364,7 @@ "slayer_task": "21", "melee_animation": "9444", "range_animation": "0", + "combat_audio": "377,379,378", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -17638,22 +17668,22 @@ "melee_animation": "422", "range_animation": "0", "attack_speed": "5", - "magic_level": "38", + "magic_level": "1", "respawn_delay": "60", "defence_animation": "0", "weakness": "3", - "slayer_exp": "25", + "slayer_exp": "51", "magic_animation": "0", "death_animation": "836", "name": "Tortured soul", "defence_level": "38", "safespot": null, - "lifepoints": "85", - "strength_level": "28", + "lifepoints": "51", + "strength_level": "62", "id": "1698", "aggressive": "true", "range_level": "1", - "attack_level": "28" + "attack_level": "52" }, { "examine": "Beware the ghostly shopkeeper's wares!", @@ -18907,6 +18937,7 @@ "examine": "Flies like a rock.", "melee_animation": "9454", "range_animation": "1516", + "combat_audio": "428,430,429", "attack_speed": "4", "magic_level": "1", "defence_animation": "9455", @@ -20316,6 +20347,7 @@ }, { "melee_animation": "7588", + "combat_audio": "386,388,387", "attack_speed": "6", "respawn_delay": "60", "defence_animation": "7590", @@ -20700,6 +20732,7 @@ "examine": "A vengeful spirit corrupted by dark magic.", "melee_animation": "2062", "range_animation": "2062", + "combat_audio": "", "attack_speed": "5", "magic_level": "1", "defence_animation": "2063", @@ -20840,6 +20873,7 @@ "defence_level": "1", "safespot": null, "lifepoints": "71", + "combat_audio": "", "strength_level": "1", "id": "2044", "aggressive": "true", @@ -22071,22 +22105,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A rich landlord", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Inn Keeper", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2177", - "range_level": "1", - "attack_level": "1" - }, { "examine": "These Dwarf ladies are so attractive!", "melee_animation": "0", @@ -22395,6 +22413,7 @@ "attack_level": "1" }, { + "examine": "It's one of General Khazard's warriors.", "melee_animation": "401", "attack_speed": "6", "respawn_delay": "60", @@ -22429,8 +22448,10 @@ "attack_level": "32" }, { + "examine": "It's a tree gnome trooper.", "combat_style": "1", "melee_animation": "190", + "attack_speed": "5", "respawn_delay": "60", "defence_animation": "193", "death_animation": "196", @@ -22444,8 +22465,10 @@ "attack_level": "1" }, { + "examine": "It's a tree gnome trooper.", "combat_style": "1", "melee_animation": "190", + "attack_speed": "5", "respawn_delay": "60", "defence_animation": "193", "death_animation": "196", @@ -22493,6 +22516,7 @@ "examine": "A blood-drinking denizen of the abyss.", "melee_animation": "2181", "range_animation": "0", + "combat_audio": "232,231,230", "attack_speed": "3", "respawn_delay": "60", "defence_animation": "0", @@ -22535,6 +22559,7 @@ "examine": "Apparently walks the abyss.", "melee_animation": "2192", "range_animation": "2192", + "combat_audio": "233,235,234", "attack_speed": "5", "defence_animation": "2193", "weakness": "8", @@ -22776,6 +22801,7 @@ "attack_level": "1" }, { + "examine": "A warrior blessed by Saradomin.", "melee_animation": "400", "respawn_delay": "60", "defence_animation": "425", @@ -22903,17 +22929,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "2309", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Young, but still beefy.", "slayer_task": "20", @@ -23207,6 +23222,7 @@ "slayer_task": "31", "melee_animation": "428", "range_animation": "0", + "combat_audio": "425,427,426", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -23228,6 +23244,7 @@ "slayer_task": "31", "melee_animation": "428", "range_animation": "0", + "combat_audio": "425,427,426", "attack_speed": "5", "respawn_delay": "60", "defence_animation": "0", @@ -23251,6 +23268,7 @@ "combat_style": "1", "melee_animation": "428", "range_animation": "426", + "combat_audio": "425,427,426", "respawn_delay": "60", "defence_animation": "0", "weakness": "2", @@ -23274,6 +23292,7 @@ "combat_style": "1", "melee_animation": "428", "range_animation": "426", + "combat_audio": "425,427,426", "respawn_delay": "60", "defence_animation": "0", "weakness": "2", @@ -23555,6 +23574,7 @@ "examine": "A fearsome magical creature from the deep.", "combat_style": "2", "melee_animation": "2365", + "combat_audio": "1077,1079,1078", "attack_speed": "6", "spell_id": "48", "magic_level": "100", @@ -25033,7 +25053,7 @@ "attack_level": "1" }, { - "examine": "A strange man with a strange name. Probably a strange past", + "examine": "A strange man with a strange name. Probably a strange past, too.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -25089,6 +25109,7 @@ "attack_level": "1" }, { + "examine": "This one's had too much to drink!", "melee_animation": "422", "combat_audio": "703,705,704", "respawn_delay": "60", @@ -25380,7 +25401,7 @@ "attack_level": "1" }, { - "examine": "His hands are covered in mud. At least", + "examine": "His hands are covered in mud, at least.", "start_gfx": "96", "combat_style": "2", "start_height": "80", @@ -25468,7 +25489,7 @@ "attack_level": "1" }, { - "examine": "A wise barbarian", + "examine": "A wise barbarian, apparently. He still looks like a thug.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -25887,6 +25908,7 @@ "slayer_task": "25", "melee_animation": "2731", "range_animation": "2731", + "combat_audio": "389,391,390", "attack_speed": "4", "magic_level": "160", "defence_animation": "2732", @@ -26947,28 +26969,6 @@ "range_level": "255", "attack_level": "255" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, { "melee_animation": "1312", "attack_speed": "5", @@ -27037,6 +27037,7 @@ "examine": "It wasn't a rock... It was a rock lobster!", "melee_animation": "2860", "range_animation": "2860", + "combat_audio": "726,728,727", "attack_speed": "2", "defence_animation": "2861", "weakness": "7", @@ -27193,7 +27194,7 @@ "attack_level": "1" }, { - "examine": "Lovely", + "examine": "Lovely, cute, and possibly what dreams are made of.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -27241,7 +27242,7 @@ "attack_level": "1" }, { - "examine": "Once beautiful", + "examine": "Once beautiful, now repugnant.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -27470,6 +27471,7 @@ "attack_level": "1" }, { + "examine": "The master of all rats.", "name": "King rat", "defence_level": "1", "safespot": null, @@ -27498,7 +27500,7 @@ "attack_level": "1" }, { - "examine": "A not-so friendly", + "examine": "A not-so friendly, not-so little cat.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -28227,6 +28229,7 @@ "examine": "Champion of the ghouls.", "melee_animation": "422", "range_animation": "0", + "combat_audio": "441,444,443", "attack_speed": "4", "magic_level": "1", "respawn_delay": "60", @@ -28329,7 +28332,7 @@ "examine": "Champion of the lesser demons.", "melee_animation": "64", "range_animation": "0", - "combat_audio": "400,404,403", + "combat_audio": "396,402,401", "magic_level": "81", "respawn_delay": "60", "defence_animation": "65", @@ -29371,6 +29374,7 @@ "bonuses": "0,0,0,0,0,70,70,70,70,70,0,0,0,0,0", "agg_radius": "16", "range_animation": "5443", + "combat_audio": "345,351,347", "magic_level": "270", "end_gfx": "558", "defence_animation": "3149", @@ -29514,24 +29518,6 @@ "range_level": "1", "attack_level": "28" }, - { - "examine": "One of RuneScape's many citizens", - "melee_animation": "422", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Drunken man", - "defence_level": "4", - "safespot": null, - "lifepoints": "5", - "strength_level": "4", - "id": "3222", - "range_level": "1", - "attack_level": "4" - }, { "examine": "One of RuneScape's many citizens.", "melee_animation": "422", @@ -29937,7 +29923,7 @@ "attack_level": "1" }, { - "examine": "Alberich", + "examine": "Alberich, a fierce barbarian warrior.", "melee_animation": "2067", "range_animation": "0", "defence_animation": "0", @@ -29955,7 +29941,7 @@ "attack_level": "22" }, { - "examine": "Fafner", + "examine": "Fafner, a tough barbarian warrior.", "melee_animation": "7048", "range_animation": "7048", "attack_speed": "6", @@ -29974,7 +29960,7 @@ "attack_level": "22" }, { - "examine": "Fasolt", + "examine": "Fasolt, a strong barbarian warrior.", "melee_animation": "2067", "range_animation": "0", "defence_animation": "0", @@ -29992,7 +29978,7 @@ "attack_level": "22" }, { - "examine": "Siegmund", + "examine": "Siegmund, a guard in the Barbarian Village.", "melee_animation": "401", "range_animation": "0", "defence_animation": "0", @@ -30010,7 +29996,7 @@ "attack_level": "22" }, { - "examine": "Siegfried", + "examine": "Siegfried, a young guard in the Barbarian Village.", "melee_animation": "2067", "range_animation": "0", "defence_animation": "0", @@ -30028,7 +30014,7 @@ "attack_level": "22" }, { - "examine": "Lydspor", + "examine": "Lydspor, a well-traveld barbarian warrior.", "melee_animation": "7048", "range_animation": "0", "defence_animation": "0", @@ -30046,7 +30032,7 @@ "attack_level": "22" }, { - "examine": "Hagen", + "examine": "Hagen, a guard in the Barbarian Village.", "melee_animation": "2067", "range_animation": "0", "defence_animation": "0", @@ -30064,7 +30050,7 @@ "attack_level": "22" }, { - "examine": "Minarch", + "examine": "Minarch, a barbarian who likes his beer.", "melee_animation": "401", "range_animation": "0", "defence_animation": "0", @@ -30082,7 +30068,7 @@ "attack_level": "22" }, { - "examine": "Wotan", + "examine": "Wotan, a sturdy barbarian warrior.", "melee_animation": "401", "range_animation": "0", "defence_animation": "0", @@ -30100,7 +30086,7 @@ "attack_level": "22" }, { - "examine": "Acelin", + "examine": "Acelin, a guard in the Barbarian Village.", "melee_animation": "390", "range_animation": "0", "defence_animation": "0", @@ -30118,7 +30104,7 @@ "attack_level": "22" }, { - "examine": "Adelino", + "examine": "Adelino, a barbarian warrior with a big axe.", "melee_animation": "2067", "range_animation": "0", "defence_animation": "0", @@ -30136,7 +30122,7 @@ "attack_level": "22" }, { - "examine": "Adolpho", + "examine": "Adolpho, a barbarian warrior with a warhammer.", "melee_animation": "401", "range_animation": "0", "defence_animation": "0", @@ -30154,7 +30140,7 @@ "attack_level": "22" }, { - "examine": "Aitan", + "examine": "Aitan, a barbarian archer.", "melee_animation": "426", "range_animation": "426", "defence_animation": "0", @@ -30172,7 +30158,7 @@ "attack_level": "22" }, { - "examine": "Brunnhilde", + "examine": "Brunnhilde, a fierce barbarian warrior.", "melee_animation": "428", "range_animation": "0", "defence_animation": "0", @@ -30190,7 +30176,7 @@ "attack_level": "20" }, { - "examine": "Gutrune", + "examine": "Gutrune, a mighty barbarian warrior.", "melee_animation": "428", "range_animation": "0", "defence_animation": "0", @@ -30208,7 +30194,7 @@ "attack_level": "20" }, { - "examine": "Edelschwarz", + "examine": "Edelschwarz, a barbarian warrior with a spear.", "melee_animation": "428", "range_animation": "0", "defence_animation": "0", @@ -30226,7 +30212,7 @@ "attack_level": "20" }, { - "examine": "Sieglinde", + "examine": "Sieglinde, a muscular barbarian warrior.", "melee_animation": "428", "range_animation": "428", "attack_speed": "6", @@ -30834,22 +30820,6 @@ "range_level": "41", "attack_level": "1" }, - { - "examine": "Likes to cook with mushrooms.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Fairy chef", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3322", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Rather more tired than most.", "melee_animation": "0", @@ -30902,6 +30872,7 @@ "examine": "Holy Mole-y!", "melee_animation": "3312", "range_animation": "3312", + "combat_audio": "1642,1646,1645", "attack_speed": "4", "magic_level": "200", "respawn_delay": "56", @@ -30920,7 +30891,7 @@ "attack_level": "200" }, { - "examine": "I will call him", + "examine": "I will call him, Mini Mole.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -30932,12 +30903,12 @@ "lifepoints": "10", "strength_level": "1", "id": "3341", - "aggressive": "true", + "aggressive": "false", "range_level": "1", "attack_level": "1" }, { - "examine": "A fun guy. No wait", + "examine": "A fun guy. No wait, that's awful. Plus it doesn't even make sense.", "melee_animation": "0", "range_animation": "0", "attack_speed": "5", @@ -30955,6 +30926,7 @@ "attack_level": "1" }, { + "examine": "A fun guy. No wait, that's awful. Plus it doesn't even make sense.", "melee_animation": "2776", "attack_speed": "5", "respawn_delay": "60", @@ -30990,6 +30962,7 @@ "attack_level": "1" }, { + "examine": "Have a fungus.", "melee_animation": "2776", "attack_speed": "5", "respawn_delay": "60", @@ -31145,7 +31118,7 @@ "slayer_task": "68", "melee_animation": "25", "range_animation": "25", - "combat_audio": "408,410,409", + "combat_audio": "405,407,406", "attack_speed": "5", "magic_level": "40", "respawn_delay": "32", @@ -31460,7 +31433,7 @@ "attack_level": "65" }, { - "examine": "He may be a funky cook", + "examine": "He's got funky socks, but he's still an ugly green creature.", "melee_animation": "0", "range_animation": "0", "combat_audio": "469,472,471", @@ -31494,6 +31467,7 @@ "attack_level": "1" }, { + "examine": "Half way up the wall is maybe not a naturally tenable position for a goblin.", "name": "Goblin Cook", "defence_level": "1", "safespot": null, @@ -32486,7 +32460,7 @@ "examine": "Young but still dangerous.", "melee_animation": "25", "range_animation": "25", - "combat_audio": "408,410,409", + "combat_audio": "405,407,406", "attack_speed": "5", "magic_level": "40", "respawn_delay": "32", @@ -32549,6 +32523,7 @@ "attack_level": "234" }, { + "examine": "A darkened horror from the ocean depths.", "name": "Dagannoth", "defence_level": "1", "safespot": null, @@ -32895,6 +32870,7 @@ "attack_level": "25" }, { + "examine": "He looks a little on the cross side!", "name": "Angry unicorn", "defence_level": "1", "safespot": null, @@ -32906,6 +32882,7 @@ "attack_level": "1" }, { + "examine": "He looks a little on the cross side!", "name": "Angry giant rat", "defence_level": "1", "safespot": null, @@ -32936,6 +32913,7 @@ "attack_level": "25" }, { + "examine": "He looks a little on the cross side!", "name": "Angry bear", "defence_level": "1", "safespot": null, @@ -32985,7 +32963,7 @@ "attack_level": "2" }, { - "examine": "If you see them circling", + "examine": "If you see them circling, run.", "melee_animation": "2019", "range_animation": "0", "respawn_delay": "60", @@ -33003,18 +32981,19 @@ "attack_level": "38" }, { + "examine": "If you see them circling, run.", + "melee_animation": "2025", + "respawn_delay": "60", + "defence_animation": "2024", "death_animation": "2026", "name": "Vulture", "defence_level": "1", "safespot": null, "lifepoints": "10", - "melee_animation": "2025", "strength_level": "1", "id": "3676", "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "2024" + "attack_level": "1" }, { "examine": "A young boy handing out flyers.", @@ -33145,6 +33124,7 @@ "examine": "Don't burst its bubble!", "melee_animation": "3891", "range_animation": "3891", + "combat_audio": "809,811,810", "magic_level": "5", "respawn_delay": "120", "defence_animation": "3890", @@ -33165,6 +33145,7 @@ "examine": "Don't burst its bubble!", "melee_animation": "3891", "range_animation": "3891", + "combat_audio": "809,811,810", "magic_level": "10", "respawn_delay": "120", "defence_animation": "3890", @@ -33184,6 +33165,7 @@ "examine": "Don't burst its bubble!", "melee_animation": "3891", "range_animation": "3891", + "combat_audio": "809,811,810", "magic_level": "10", "respawn_delay": "120", "defence_animation": "3890", @@ -33203,6 +33185,7 @@ "examine": "Don't burst its bubble!", "melee_animation": "3891", "range_animation": "3891", + "combat_audio": "809,811,810", "magic_level": "15", "respawn_delay": "120", "defence_animation": "3890", @@ -33222,6 +33205,7 @@ "examine": "Don't burst its bubble!", "melee_animation": "3891", "range_animation": "3891", + "combat_audio": "809,811,810", "magic_level": "20", "respawn_delay": "120", "defence_animation": "3890", @@ -33241,6 +33225,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "14", "respawn_delay": "127", "defence_animation": "3902", @@ -33263,6 +33248,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "14", "respawn_delay": "127", "defence_animation": "3902", @@ -33284,6 +33270,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "20", "respawn_delay": "127", "defence_animation": "3902", @@ -33305,6 +33292,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "20", "respawn_delay": "127", "defence_animation": "3902", @@ -33326,6 +33314,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "25", "respawn_delay": "127", "defence_animation": "3902", @@ -33347,6 +33336,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "25", "respawn_delay": "127", "defence_animation": "3902", @@ -33368,6 +33358,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "30", "respawn_delay": "127", "defence_animation": "3902", @@ -33389,6 +33380,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "30", "respawn_delay": "127", "defence_animation": "3902", @@ -33410,6 +33402,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "35", "respawn_delay": "127", "defence_animation": "3902", @@ -33431,6 +33424,7 @@ "examine": "Nippy little thing!", "melee_animation": "3901", "range_animation": "3901", + "combat_audio": "766,768,767", "magic_level": "35", "respawn_delay": "127", "defence_animation": "3902", @@ -33452,6 +33446,7 @@ "examine": "Worse than termites!", "melee_animation": "3915", "range_animation": "3915", + "combat_audio": "714,716,715", "attack_speed": "5", "magic_level": "10", "respawn_delay": "120", @@ -33473,6 +33468,7 @@ "examine": "Worse than termites!", "melee_animation": "3915", "range_animation": "3915", + "combat_audio": "714,716,715", "attack_speed": "5", "magic_level": "15", "respawn_delay": "120", @@ -33493,6 +33489,7 @@ "examine": "Worse than termites!", "melee_animation": "3915", "range_animation": "3915", + "combat_audio": "714,716,715", "attack_speed": "5", "magic_level": "20", "respawn_delay": "120", @@ -33513,6 +33510,7 @@ "examine": "Worse than termites!", "melee_animation": "3915", "range_animation": "3915", + "combat_audio": "714,716,715", "attack_speed": "5", "magic_level": "30", "respawn_delay": "120", @@ -33533,6 +33531,7 @@ "examine": "Worse than termites!", "melee_animation": "3915", "range_animation": "3915", + "combat_audio": "714,716,715", "attack_speed": "5", "magic_level": "40", "respawn_delay": "120", @@ -33553,6 +33552,7 @@ "examine": "Eeewww!", "melee_animation": "3908", "range_animation": "3908", + "combat_audio": "805,807,806", "magic_level": "10", "respawn_delay": "125", "defence_animation": "3909", @@ -33573,6 +33573,7 @@ "examine": "Eeewww!", "melee_animation": "3908", "range_animation": "3908", + "combat_audio": "805,807,806", "magic_level": "15", "respawn_delay": "125", "defence_animation": "3909", @@ -33592,6 +33593,7 @@ "examine": "Eeewww!", "melee_animation": "3908", "range_animation": "3908", + "combat_audio": "805,807,806", "magic_level": "20", "respawn_delay": "125", "defence_animation": "3909", @@ -33611,6 +33613,7 @@ "examine": "Eeewww!", "melee_animation": "3908", "range_animation": "3908", + "combat_audio": "805,807,806", "magic_level": "30", "respawn_delay": "125", "defence_animation": "3909", @@ -33630,6 +33633,7 @@ "examine": "Eeewww!", "melee_animation": "3908", "range_animation": "3908", + "combat_audio": "805,807,806", "magic_level": "25", "respawn_delay": "125", "defence_animation": "3909", @@ -33651,6 +33655,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "25", "respawn_delay": "120", "end_gfx": "648", @@ -33676,6 +33681,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "25", "respawn_delay": "120", "end_gfx": "648", @@ -33700,6 +33706,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "40", "respawn_delay": "120", "end_gfx": "648", @@ -33724,6 +33731,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "40", "respawn_delay": "120", "end_gfx": "648", @@ -33748,6 +33756,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "50", "respawn_delay": "120", "end_gfx": "648", @@ -33772,6 +33781,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "50", "respawn_delay": "120", "end_gfx": "648", @@ -33796,6 +33806,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "60", "respawn_delay": "120", "end_gfx": "648", @@ -33820,6 +33831,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "60", "respawn_delay": "120", "end_gfx": "648", @@ -33844,6 +33856,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "70", "respawn_delay": "120", "end_gfx": "648", @@ -33868,6 +33881,7 @@ "combat_style": "2", "melee_animation": "3882", "range_animation": "3882", + "combat_audio": "845,848,846", "magic_level": "70", "respawn_delay": "120", "end_gfx": "648", @@ -33892,6 +33906,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "30", "respawn_delay": "120", "defence_animation": "3921", @@ -33915,6 +33930,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "30", "respawn_delay": "120", "defence_animation": "3921", @@ -33938,6 +33954,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "40", "respawn_delay": "120", "defence_animation": "3921", @@ -33960,6 +33977,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "40", "respawn_delay": "120", "defence_animation": "3921", @@ -33983,6 +34001,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "50", "respawn_delay": "120", "defence_animation": "3921", @@ -34005,6 +34024,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "50", "respawn_delay": "120", "defence_animation": "3921", @@ -34028,6 +34048,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "60", "respawn_delay": "120", "defence_animation": "3921", @@ -34050,6 +34071,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "60", "respawn_delay": "120", "defence_animation": "3921", @@ -34073,6 +34095,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "70", "respawn_delay": "120", "defence_animation": "3921", @@ -34095,6 +34118,7 @@ "combat_style": "1", "melee_animation": "3920", "range_animation": "3920", + "combat_audio": "392,394,393", "magic_level": "70", "respawn_delay": "120", "defence_animation": "3921", @@ -34116,6 +34140,7 @@ "examine": "Mind your toes!", "melee_animation": "3896", "range_animation": "3896", + "combat_audio": "323,326,325", "magic_level": "14", "respawn_delay": "120", "defence_animation": "3895", @@ -34137,6 +34162,7 @@ "examine": "Mind your toes!", "melee_animation": "3896", "range_animation": "3896", + "combat_audio": "323,326,325", "magic_level": "21", "respawn_delay": "120", "defence_animation": "3895", @@ -34157,6 +34183,7 @@ "examine": "Mind your toes!", "melee_animation": "3896", "range_animation": "3896", + "combat_audio": "323,326,325", "magic_level": "32", "respawn_delay": "120", "defence_animation": "3895", @@ -34177,6 +34204,7 @@ "examine": "Mind your toes!", "melee_animation": "3896", "range_animation": "3896", + "combat_audio": "323,326,325", "magic_level": "38", "respawn_delay": "120", "defence_animation": "3895", @@ -34197,6 +34225,7 @@ "examine": "Mind your toes!", "melee_animation": "3896", "range_animation": "3896", + "combat_audio": "323,326,325", "magic_level": "45", "respawn_delay": "120", "defence_animation": "3895", @@ -35018,6 +35047,7 @@ "examine": "Large, heavy, with sharp things attached to its head.", "melee_animation": "9439", "range_animation": "9439", + "combat_audio": "588,590,589", "attack_speed": "4", "magic_level": "1", "respawn_delay": "15", @@ -35041,6 +35071,7 @@ "slayer_task": "1", "melee_animation": "1537", "range_animation": "1537", + "combat_audio": "276,278,277", "attack_speed": "4", "magic_level": "1", "defence_animation": "0", @@ -36056,7 +36087,7 @@ "attack_level": "63" }, { - "examine": "A horrible", + "examine": "A horrible, emaciated ape like creature with beady red eyes.", "slayer_task": "52", "melee_animation": "4235", "range_animation": "0", @@ -36078,6 +36109,7 @@ "attack_level": "48" }, { + "examine": "A horrible, emaciated ape like creature with beady yellow eyes.", "melee_animation": "4234", "respawn_delay": "60", "defence_animation": "4232", @@ -36095,7 +36127,7 @@ "attack_level": "1" }, { - "examine": "A horrible", + "examine": "A horrible, emaciated ape like creature with beady green eyes.", "slayer_task": "52", "melee_animation": "4235", "range_animation": "0", @@ -36117,6 +36149,7 @@ "attack_level": "48" }, { + "examine": "A horrible, emaciated ape like creature with beady blue eyes.", "melee_animation": "4234", "respawn_delay": "60", "defence_animation": "4232", @@ -36134,6 +36167,7 @@ "attack_level": "1" }, { + "examine": "A horrible, emaciated ape like creature with beady pink eyes.", "melee_animation": "4234", "respawn_delay": "60", "defence_animation": "4232", @@ -36490,7 +36524,7 @@ "attack_level": "1" }, { - "examine": "I don't think insect repellent will work…", + "examine": "I don't think insect repellent will work.", "slayer_task": "34", "melee_animation": "1184", "range_animation": "1184", @@ -36513,7 +36547,7 @@ "attack_level": "60" }, { - "examine": "I don't think insect repellent will work…", + "examine": "I don't think insect repellent will work.", "melee_animation": "1184", "range_animation": "1184", "attack_speed": "3", @@ -36534,7 +36568,7 @@ "attack_level": "80" }, { - "examine": "I don't think insect repellent will work…", + "examine": "I don't think insect repellent will work.", "melee_animation": "1184", "range_animation": "1184", "attack_speed": "3", @@ -36555,7 +36589,7 @@ "attack_level": "100" }, { - "examine": "Examine not added", + "examine": "The walking dead.", "melee_animation": "5568", "range_animation": "5568", "combat_audio": "931,923,922", @@ -36576,7 +36610,7 @@ "attack_level": "24" }, { - "examine": "Examine not added", + "examine": "Dead (wo)man walking.", "melee_animation": "5578", "range_animation": "5578", "combat_audio": "931,923,922", @@ -36598,7 +36632,7 @@ "attack_level": "35" }, { - "examine": "Examine not added", + "examine": "Could his name be \"Lurch\"?", "melee_animation": "5578", "range_animation": "5578", "combat_audio": "931,923,922", @@ -37099,7 +37133,7 @@ "attack_level": "1" }, { - "examine": "Half horse", + "examine": "Horseplay.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -37653,7 +37687,7 @@ "attack_level": "1" }, { - "examine": "He knows the past", + "examine": "He knows the past, present and future. But what of my shoe size?", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -37929,7 +37963,7 @@ "attack_level": "30" }, { - "examine": "Either a very fremennikey pirate", + "examine": "Either a very fremennikey pirate, or a very piratey fremnnik.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -38729,7 +38763,7 @@ "attack_level": "1" }, { - "examine": "A weasly", + "examine": "A weasly, shifty-looking Gnome Mage.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -38745,7 +38779,7 @@ "attack_level": "1" }, { - "examine": "With the prices he charges", + "examine": "With the prices he charges, no wonder he can afford to look so sharp.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -38761,7 +38795,7 @@ "attack_level": "1" }, { - "examine": "Looks very stylish", + "examine": "Looks very stylish.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -38931,7 +38965,7 @@ "slayer_task": "11", "melee_animation": "25", "range_animation": "25", - "combat_audio": "408,410,409", + "combat_audio": "405,407,406", "attack_speed": "4", "magic_level": "1", "respawn_delay": "30", @@ -38954,7 +38988,7 @@ { "examine": "Young but still dangerous.", "slayer_task": "11", - "combat_audio": "408,410,409", + "combat_audio": "405,407,406", "melee_animation": "25", "attack_speed": "4", "magic_level": "1", @@ -38976,11 +39010,12 @@ "attack_level": "45" }, { + "examine": "Young but still dangerous.", "name": "Baby red dragon", "defence_level": "1", "safespot": null, "lifepoints": "50", - "combat_audio": "408,410,409", + "combat_audio": "405,407,406", "strength_level": "1", "id": "4667", "aggressive": "true", @@ -38989,11 +39024,12 @@ "attack_level": "1" }, { + "examine": "Young but still dangerous.", "name": "Baby red dragon", "defence_level": "1", "safespot": null, "lifepoints": "50", - "combat_audio": "408,410,409", + "combat_audio": "405,407,406", "strength_level": "1", "id": "4668", "aggressive": "true", @@ -39522,6 +39558,7 @@ "slayer_task": "44", "melee_animation": "4652", "range_animation": "4652", + "combat_audio": "448,451,450", "attack_speed": "6", "magic_level": "1", "respawn_delay": "30", @@ -39546,6 +39583,7 @@ "slayer_task": "44", "melee_animation": "4652", "range_animation": "4652", + "combat_audio": "448,451,450", "attack_speed": "6", "magic_level": "1", "respawn_delay": "30", @@ -39570,6 +39608,7 @@ "slayer_task": "44", "melee_animation": "4652", "range_animation": "4652", + "combat_audio": "448,451,450", "attack_speed": "6", "magic_level": "1", "respawn_delay": "30", @@ -39594,6 +39633,7 @@ "slayer_task": "44", "melee_animation": "4652", "range_animation": "4652", + "combat_audio": "448,451,450", "attack_speed": "6", "magic_level": "1", "respawn_delay": "30", @@ -39618,6 +39658,7 @@ "slayer_task": "44", "melee_animation": "4652", "range_animation": "4652", + "combat_audio": "448,451,450", "attack_speed": "6", "magic_level": "1", "respawn_delay": "30", @@ -39846,7 +39887,7 @@ "slayer_task": "8", "melee_animation": "64", "range_animation": "64", - "combat_audio": "400,404,403", + "combat_audio": "397,399,398", "attack_speed": "4", "magic_level": "1", "respawn_delay": "30", @@ -39871,7 +39912,7 @@ "slayer_task": "8", "melee_animation": "64", "range_animation": "64", - "combat_audio": "400,404,403", + "combat_audio": "397,399,398", "attack_speed": "4", "magic_level": "1", "respawn_delay": "30", @@ -39896,7 +39937,7 @@ "slayer_task": "8", "melee_animation": "64", "range_animation": "64", - "combat_audio": "400,404,403", + "combat_audio": "397,399,398", "attack_speed": "4", "magic_level": "1", "respawn_delay": "30", @@ -39921,7 +39962,7 @@ "slayer_task": "8", "melee_animation": "64", "range_animation": "64", - "combat_audio": "400,404,403", + "combat_audio": "397,399,398", "attack_speed": "4", "magic_level": "1", "respawn_delay": "30", @@ -43952,6 +43993,7 @@ "attack_level": "58" }, { + "examine": "Seems intelligent. For an ogre.", "combat_style": "2", "name": "Ogre shaman", "defence_level": "1", @@ -43965,6 +44007,7 @@ "attack_level": "1" }, { + "examine": "Seems intelligent. For an ogre.", "combat_style": "2", "name": "Ogre shaman", "defence_level": "1", @@ -44069,6 +44112,7 @@ "attack_level": "1" }, { + "examine": "Shooty-shooty.", "combat_style": "1", "melee_animation": "5395", "respawn_delay": "60", @@ -44085,6 +44129,7 @@ "attack_level": "1" }, { + "examine": "Shooty-shooty.", "combat_style": "1", "melee_animation": "5395", "respawn_delay": "60", @@ -44153,7 +44198,7 @@ "attack_level": "1" }, { - "examine": "Part scarab", + "examine": "Part scarab, part man.", "slayer_task": "70", "combat_style": "2", "melee_animation": "7615", @@ -44233,6 +44278,7 @@ "attack_level": "62" }, { + "examine": "Part scarab, part man.", "combat_style": "2", "melee_animation": "7615", "respawn_delay": "60", @@ -44348,6 +44394,7 @@ "attack_level": "80" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44365,6 +44412,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44382,6 +44430,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44399,6 +44448,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44416,6 +44466,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44433,6 +44484,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44450,6 +44502,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44467,6 +44520,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44484,6 +44538,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44501,6 +44556,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44518,6 +44574,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44535,6 +44592,7 @@ "attack_level": "1" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44552,7 +44610,7 @@ "attack_level": "1" }, { - "examine": "Examine not added", + "examine": "Brains!", "melee_animation": "5568", "range_animation": "5568", "combat_audio": "931,923,922", @@ -44573,6 +44631,7 @@ "attack_level": "11" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44590,7 +44649,7 @@ "attack_level": "1" }, { - "examine": "Examine not added", + "examine": "Brains!", "melee_animation": "5568", "range_animation": "5568", "combat_audio": "931,923,922", @@ -44611,6 +44670,7 @@ "attack_level": "11" }, { + "examine": "Brains!", "melee_animation": "5568", "combat_audio": "931,923,922", "respawn_delay": "60", @@ -44628,7 +44688,7 @@ "attack_level": "1" }, { - "examine": "Examine not added", + "examine": "Brains!", "melee_animation": "5571", "range_animation": "5571", "combat_audio": "931,923,922", @@ -45063,6 +45123,7 @@ "attack_level": "1" }, { + "examine": "Eeek! A ghost!", "melee_animation": "5532", "combat_audio": "436,439,438", "attack_speed": "5", @@ -45129,6 +45190,7 @@ "attack_level": "1" }, { + "examine": "Eeek! A ghost!", "melee_animation": "5532", "combat_audio": "436,439,438", "attack_speed": "5", @@ -45195,6 +45257,7 @@ "attack_level": "1" }, { + "examine": "Eeek! A ghost!", "melee_animation": "5532", "combat_audio": "436,439,438", "attack_speed": "5", @@ -45213,6 +45276,7 @@ "attack_level": "1" }, { + "examine": "Eeek! A ghost!", "melee_animation": "5532", "combat_audio": "436,439,438", "attack_speed": "5", @@ -45231,6 +45295,7 @@ "attack_level": "1" }, { + "examine": "Eeek! A ghost!", "melee_animation": "5532", "combat_audio": "436,439,438", "attack_speed": "5", @@ -45249,6 +45314,7 @@ "attack_level": "1" }, { + "examine": "Eeek! A ghost!", "melee_animation": "5532", "combat_audio": "436,439,438", "attack_speed": "5", @@ -45496,6 +45562,7 @@ "attack_level": "70" }, { + "examine": "Eeek! A ghost!", "melee_animation": "5532", "combat_audio": "436,439,438", "attack_speed": "5", @@ -45514,6 +45581,7 @@ "attack_level": "1" }, { + "examine": "Eeek! A ghost!", "melee_animation": "5532", "combat_audio": "436,439,438", "attack_speed": "5", @@ -45532,6 +45600,7 @@ "attack_level": "1" }, { + "examine": "Eeek! A ghost!", "melee_animation": "5532", "combat_audio": "436,439,438", "attack_speed": "5", @@ -46667,6 +46736,7 @@ "examine": "A hairy, smelly, grazing animal.", "melee_animation": "5782", "range_animation": "5782", + "combat_audio": "3378,3380,3379", "attack_speed": "4", "defence_animation": "5783", "weakness": "7", @@ -49387,7 +49457,7 @@ "attack_level": "20" }, { - "examine": "A greasy", + "examine": "A greasy, grimy gourmet.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -51035,6 +51105,7 @@ "attack_level": "20" }, { + "examine": "Not man's best friend.", "melee_animation": "6559", "respawn_delay": "60", "defence_animation": "6557", @@ -51050,6 +51121,7 @@ "attack_level": "1" }, { + "examine": "An impling who likes the word \"dragon\".", "name": "Dragon impling", "defence_level": "1", "safespot": null, @@ -51061,6 +51133,7 @@ "attack_level": "1" }, { + "examine": "An impling who likes the word \"dragon.\"", "name": "Dragon impling", "defence_level": "1", "safespot": null, @@ -51486,35 +51559,37 @@ "attack_level": "38" }, { + "examine": "These gnomes know how to get around!", + "melee_animation": "6790", + "respawn_delay": "60", + "defence_animation": "6792", "death_animation": "6791", "name": "Mounted terrorbird gnome", "defence_level": "1", "safespot": null, "lifepoints": "55", - "melee_animation": "6790", "strength_level": "1", "id": "6110", "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "6792" + "attack_level": "1" }, { + "examine": "These gnomes know how to get around!", + "melee_animation": "6790", + "respawn_delay": "60", + "defence_animation": "6792", "death_animation": "6791", "name": "Mounted terrorbird gnome", "defence_level": "1", "safespot": null, "lifepoints": "55", - "melee_animation": "6790", "strength_level": "1", "id": "6111", "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "6792" + "attack_level": "1" }, { - "examine": "Aww", + "examine": "Aww, cute.", "slayer_task": "7", "melee_animation": "0", "range_animation": "0", @@ -51533,18 +51608,19 @@ "attack_level": "1" }, { + "examine": "Quackers.", + "melee_animation": "747", + "respawn_delay": "60", + "defence_animation": "3268", "death_animation": "750", "name": "Duck", "defence_level": "1", "safespot": null, "lifepoints": "3", - "melee_animation": "747", "strength_level": "1", "id": "6113", "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "3268" + "attack_level": "1" }, { "examine": "A messy bird.", @@ -52507,6 +52583,7 @@ "examine": "The tongue of evil.", "melee_animation": "9130", "range_animation": "1552", + "combat_audio": "312,314,313", "attack_speed": "4", "respawn_delay": "60", "defence_animation": "9132", @@ -52529,6 +52606,7 @@ "slayer_task": "66", "melee_animation": "1582", "range_animation": "1582", + "combat_audio": "696,698,697", "respawn_delay": "25", "defence_animation": "1581", "weakness": "7", @@ -53254,6 +53332,7 @@ "examine": "The bane of darkness.", "melee_animation": "6376", "range_animation": "6376", + "combat_audio": "3829,3866,3849", "magic_level": "125", "respawn_delay": "50", "defence_animation": "6375", @@ -53301,6 +53380,7 @@ "prj_height": "0", "agg_radius": "64", "range_animation": "7019", + "combat_audio": "3830,3869,3867", "magic_level": "150", "end_gfx": "1186", "defence_animation": "7017", @@ -55195,6 +55275,7 @@ "examine": "Flies like a rock.", "melee_animation": "9454", "range_animation": "1516", + "combat_audio": "428,430,429", "attack_speed": "4", "magic_level": "1", "defence_animation": "9455", @@ -59477,7 +59558,7 @@ "attack_level": "55" }, { - "examine": "A giant", + "examine": "A giant, mountable locust.", "melee_animation": "7586", "range_animation": "0", "respawn_delay": "60", @@ -59540,6 +59621,7 @@ }, { "melee_animation": "7588", + "combat_audio": "386,388,387", "attack_speed": "6", "respawn_delay": "60", "defence_animation": "7590", @@ -59556,7 +59638,7 @@ "attack_level": "1" }, { - "examine": "Part scarab", + "examine": "Part scarab, part man.", "slayer_task": "70", "combat_style": "2", "melee_animation": "7615", @@ -59578,6 +59660,7 @@ "attack_level": "41" }, { + "examine": "Part scarab, part man.", "combat_style": "2", "melee_animation": "7620", "respawn_delay": "60", @@ -61505,7 +61588,7 @@ "defence_level": "1", "safespot": null, "lifepoints": "10", - "combat_audio": "408,410,409", + "combat_audio": "407,405,406", "strength_level": "1", "id": "6901", "range_level": "1", @@ -61527,7 +61610,7 @@ "defence_level": "1", "safespot": null, "lifepoints": "10", - "combat_audio": "408,410,409", + "combat_audio": "407,405,406", "strength_level": "1", "id": "6903", "range_level": "1", @@ -61549,7 +61632,7 @@ "defence_level": "1", "safespot": null, "lifepoints": "10", - "combat_audio": "408,410,409", + "combat_audio": "407,405,406", "strength_level": "1", "id": "6905", "range_level": "1", @@ -61571,7 +61654,7 @@ "defence_level": "1", "safespot": null, "lifepoints": "10", - "combat_audio": "408,410,409", + "combat_audio": "407,405,406", "strength_level": "1", "id": "6907", "range_level": "1", @@ -62130,7 +62213,7 @@ "slayer_task": "33", "melee_animation": "4666", "range_animation": "4666", - "combat_audio": "449,451,450", + "combat_audio": "447,451,450", "attack_speed": "5", "magic_level": "1", "respawn_delay": "20", @@ -62154,7 +62237,7 @@ "slayer_task": "33", "melee_animation": "4666", "range_animation": "4666", - "combat_audio": "449,451,450", + "combat_audio": "447,451,450", "attack_speed": "5", "magic_level": "1", "respawn_delay": "20", @@ -62395,7 +62478,7 @@ "attack_level": "48" }, { - "examine": "Irascible", + "examine": "Irascible, belligerent and stupefyingly impolite.", "slayer_task": "64", "melee_animation": "8636", "range_animation": "0", @@ -62415,7 +62498,7 @@ "attack_level": "45" }, { - "examine": "Irascible", + "examine": "Irascible, beliggerent and stupefyingly impolite.", "slayer_task": "64", "melee_animation": "8637", "range_animation": "0", @@ -62854,22 +62937,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "The head farmer", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Farmer Blinkin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7131", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Owner of this homestead.", "melee_animation": "0", @@ -62937,94 +63004,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2359", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2360", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2361", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2362", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, { "examine": "A Mourner showing his true identity.", "melee_animation": "0", @@ -63171,26 +63150,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs... especially really big ones!", - "melee_animation": "2368", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "68", - "safespot": null, - "lifepoints": "97", - "strength_level": "68", - "id": "2452", - "aggressive": "true", - "range_level": "1", - "attack_level": "68" - }, { "examine": "Heavy rock!", "melee_animation": "0", @@ -63270,167 +63229,6 @@ "projectile": "294", "attack_level": "90" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "5", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "20", - "safespot": null, - "lifepoints": "19", - "strength_level": "5", - "id": "2463", - "aggressive": "true", - "bonuses": "25,85,105,75,103,85,65,0,0,0,0,0,0,0,0", - "range_level": "5", - "projectile": "337", - "attack_level": "5" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "10", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "40", - "safespot": null, - "lifepoints": "40", - "strength_level": "10", - "id": "2464", - "aggressive": "true", - "bonuses": "35,105,125,95,128,105,85,0,0,0,0,0,0,0,0", - "range_level": "10", - "projectile": "337", - "attack_level": "10" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "15", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "50", - "safespot": null, - "lifepoints": "60", - "strength_level": "15", - "id": "2465", - "aggressive": "true", - "bonuses": "35,185,185,155,188,125,165,0,0,0,0,0,0,0,0", - "range_level": "15", - "projectile": "337", - "attack_level": "15" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "25", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "60", - "safespot": null, - "lifepoints": "80", - "strength_level": "45", - "id": "2466", - "aggressive": "true", - "bonuses": "45,235,235,205,238,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "35", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "70", - "safespot": null, - "lifepoints": "105", - "strength_level": "45", - "id": "2467", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "45", - "respawn_delay": "25", - "defence_animation": "2300", - "weakness": "9", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "90", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "2468", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, { "examine": "A Retired Highwayman", "combat_style": "1", @@ -64264,132 +64062,6 @@ "projectile": "442", "attack_level": "70" }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2610", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2611", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2612", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2613", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2614", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2615", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2616", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, { "name": "Tz-Kih", "defence_level": "1", @@ -64755,22 +64427,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A strange man with a strange name. Probably a strange past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Longbow Ben", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2691", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She quackers.", "slayer_task": "7", @@ -65155,22 +64811,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A wise barbarian", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Otto Godblessed", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2725", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Holy looking.", "melee_animation": "0", @@ -65547,29 +65187,6 @@ "range_level": "1", "attack_level": "68" }, - { - "examine": "From a darker dimension.", - "slayer_task": "25", - "melee_animation": "2731", - "range_animation": "2731", - "attack_speed": "4", - "magic_level": "160", - "defence_animation": "2732", - "weakness": "4", - "slayer_exp": "225", - "magic_animation": "2731", - "death_animation": "2733", - "name": "Dark beast", - "defence_level": "120", - "safespot": null, - "lifepoints": "220", - "strength_level": "160", - "id": "2783", - "aggressive": "true", - "bonuses": "0,0,0,0,0,30,40,100,90,100,0,0,0,0,0", - "range_level": "1", - "attack_level": "140" - }, { "examine": "Digging.", "melee_animation": "0", @@ -66922,44 +66539,6 @@ "range_level": "255", "attack_level": "255" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "1312", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "1313", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "240", - "strength_level": "1", - "id": "2885", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "name": "Boulder", "defence_level": "1", @@ -67008,25 +66587,6 @@ "projectile": "288", "attack_level": "1" }, - { - "examine": "It wasn't a rock... It was a rock lobster!", - "melee_animation": "2860", - "range_animation": "2860", - "attack_speed": "2", - "defence_animation": "2861", - "weakness": "7", - "magic_animation": "2860", - "death_animation": "2862", - "name": "Rock lobster", - "defence_level": "100", - "safespot": null, - "lifepoints": "150", - "strength_level": "100", - "id": "2889", - "bonuses": "0,0,0,0,0,100,100,50,50,150,0,0,0,0,0", - "range_level": "1", - "attack_level": "100" - }, { "agg_radius": "12", "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", @@ -67135,22 +66695,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Lovely", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Bones", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2945", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Obviously punches above his weight.", "melee_animation": "0", @@ -67412,68 +66956,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "King rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "2982", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not a soft touch.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pusskins", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2984", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A not-so friendly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Captain Tom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2986", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fully grown feline.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mittens", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2988", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Cute and fluffy.", "melee_animation": "0", @@ -69669,6 +69151,7 @@ "defence_level": "1", "safespot": null, "lifepoints": "10", + "combat_audio": "425,427,426", "strength_level": "1", "id": "7438", "clue_level": "2", @@ -69680,6 +69163,7 @@ "defence_level": "1", "safespot": null, "lifepoints": "10", + "combat_audio": "425,427,426", "strength_level": "1", "id": "7439", "clue_level": "2", @@ -69691,6 +69175,7 @@ "defence_level": "1", "safespot": null, "lifepoints": "10", + "combat_audio": "425,427,426", "strength_level": "1", "id": "7440", "clue_level": "2", @@ -69702,6 +69187,7 @@ "defence_level": "1", "safespot": null, "lifepoints": "10", + "combat_audio": "425,427,426", "strength_level": "1", "id": "7441", "clue_level": "2", @@ -70567,6 +70053,7 @@ "examine": "Looks after your Farming tools.", "melee_animation": "0", "range_animation": "0", + "combat_audio": "323,326,325", "defence_animation": "0", "magic_animation": "0", "death_animation": "0", @@ -70818,6 +70305,7 @@ "examine": "A penguin pushing paper", "melee_animation": "0", "range_animation": "0", + "combat_audio": "845,848,846", "defence_animation": "0", "magic_animation": "0", "death_animation": "0", @@ -70834,6 +70322,7 @@ "examine": "A penguin pushing paper", "melee_animation": "0", "range_animation": "0", + "combat_audio": "845,848,846", "defence_animation": "0", "magic_animation": "0", "death_animation": "0", @@ -70850,6 +70339,7 @@ "examine": "He's a little rough around the edges.", "melee_animation": "0", "range_animation": "0", + "combat_audio": "766,768,767", "defence_animation": "0", "magic_animation": "0", "death_animation": "0", @@ -72991,24 +72481,6 @@ "name": "Yeti", "id": "130" }, - { - "examine": "Servant of the Duke of Lumbridge.", - "melee_animation": "422", - "range_animation": "422", - "attack_speed": "4", - "magic_level": "22", - "defence_animation": "404", - "magic_animation": "422", - "death_animation": "9055", - "name": "Hans", - "defence_level": "14", - "safespot": "0", - "lifepoints": "12", - "strength_level": "17", - "id": "0", - "range_level": "1", - "attack_level": "17" - }, { "examine": "He grows the crops in this area.", "melee_animation": "422", @@ -73067,38 +72539,6 @@ "range_level": "1", "attack_level": "13" }, - { - "examine": "She looks happy.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Schoolgirl", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "10", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A man down on his luck.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Tramp", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "11", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Not very civilised looking.", "name": "Barbarian", @@ -73424,26 +72864,6 @@ "range_level": "1", "attack_level": "31" }, - { - "examine": "A soldier of the town of Yanille.", - "melee_animation": "390", - "range_animation": "0", - "combat_audio": "511,513,512", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Soldier", - "defence_level": "26", - "safespot": null, - "lifepoints": "22", - "strength_level": "25", - "id": "35", - "range_level": "1", - "attack_level": "26" - }, { "examine": "The head gardener.", "melee_animation": "0", @@ -73528,27 +72948,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "slayer_task": "7", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "weakness": "9", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "41", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Freshly sheared.", "melee_animation": "0", @@ -73673,23 +73072,6 @@ "range_level": "1", "attack_level": "40" }, - { - "examine": "A dragon covered in frost and ice.", - "combat_audio": "408,410,409", - "magic_level": "116", - "respawn_delay": "25", - "weakness": "0", - "name": "Baby dragon", - "defence_level": "112", - "safespot": null, - "lifepoints": "160", - "strength_level": "103", - "id": "51", - "aggressive": "true", - "bonuses": "124,130,137,184,176,128,168,145,104,54,0,0,0,0,0", - "range_level": "80", - "attack_level": "102" - }, { "examine": "A wood nymph.", "melee_animation": "0", @@ -73767,27 +73149,6 @@ "range_level": "1", "attack_level": "20" }, - { - "examine": "Incey wincey.", - "slayer_task": "76", - "melee_animation": "6249", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "2", - "magic_animation": "0", - "death_animation": "6251", - "name": "Spider", - "defence_level": "1", - "safespot": null, - "lifepoints": "1", - "strength_level": "1", - "id": "61", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A barely visible deadly jungle spider.", "slayer_task": "76", @@ -74104,32 +73465,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "4", - "magic_level": "1", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "81", - "safespot": null, - "lifepoints": "89", - "strength_level": "78", - "id": "83", - "aggressive": "true", - "bonuses": "0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "76" - }, { "examine": "A creature made from clay.", "melee_animation": "422", @@ -74332,262 +73667,6 @@ "range_level": "1", "attack_level": "35" }, - { - "examine": "An ugly green creature.", - "melee_animation": "6185", - "range_animation": "6185", - "combat_audio": "469,472,471", - "attack_speed": "4", - "defence_animation": "6183", - "slayer_exp": "5", - "magic_animation": "6185", - "death_animation": "6182", - "name": "Goblin", - "defence_level": "1", - "safespot": null, - "lifepoints": "5", - "strength_level": "1", - "id": "100", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "An ugly green creature.", - "melee_animation": "6185", - "range_animation": "6185", - "combat_audio": "469,472,471", - "attack_speed": "5", - "defence_animation": "6183", - "slayer_exp": "5", - "magic_animation": "6185", - "death_animation": "6182", - "name": "Goblin", - "defence_level": "3", - "safespot": null, - "lifepoints": "10", - "strength_level": "2", - "id": "101", - "clue_level": "0", - "range_level": "1", - "attack_level": "3" - }, - { - "examine": "An ugly green creature.", - "melee_animation": "6185", - "range_animation": "6185", - "combat_audio": "469,472,471", - "attack_speed": "5", - "defence_animation": "6183", - "slayer_exp": "16", - "magic_animation": "6185", - "death_animation": "6182", - "name": "Goblin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "2", - "id": "102", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Eek! A bear!", - "slayer_task": "6", - "melee_animation": "4925", - "range_animation": "0", - "combat_audio": "498,500,499", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "27", - "magic_animation": "0", - "death_animation": "4929", - "name": "Grizzly bear", - "defence_level": "23", - "safespot": null, - "lifepoints": "32", - "strength_level": "23", - "id": "105", - "aggressive": "true", - "range_level": "1", - "attack_level": "23" - }, - { - "examine": "Eek! A bear!", - "slayer_task": "6", - "melee_animation": "4925", - "range_animation": "0", - "combat_audio": "498,500,499", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "25", - "magic_animation": "0", - "death_animation": "4929", - "name": "Black bear", - "defence_level": "17", - "safespot": null, - "lifepoints": "24", - "strength_level": "17", - "id": "106", - "range_level": "1", - "attack_level": "17" - }, - { - "melee_animation": "6254", - "combat_audio": "3611,3612,3610", - "respawn_delay": "60", - "defence_animation": "6255", - "slayer_exp": "17", - "death_animation": "6256", - "name": "Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "17", - "strength_level": "1", - "id": "107", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Tiny", - "slayer_task": "71", - "melee_animation": "6254", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "respawn_delay": "60", - "defence_animation": "6255", - "weakness": "0", - "magic_animation": "0", - "death_animation": "6256", - "name": "Pit Scorpion", - "defence_level": "40", - "safespot": null, - "lifepoints": "57", - "strength_level": "1", - "id": "109", - "aggressive": "true", - "range_level": "40", - "attack_level": "1" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "110", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "He's got icicles in his beard.", - "slayer_task": "47", - "melee_animation": "4672", - "range_animation": "0", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "70", - "magic_animation": "0", - "death_animation": "4673", - "name": "Ice giant", - "defence_level": "40", - "safespot": null, - "lifepoints": "70", - "strength_level": "40", - "id": "111", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "40" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "112", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "An aggressive humanoid.", - "melee_animation": "128", - "range_animation": "128", - "attack_speed": "5", - "defence_animation": "129", - "magic_animation": "128", - "death_animation": "131", - "name": "Jogre", - "defence_level": "41", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "113", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "41" - }, - { - "examine": "Big, ugly, and smelly.", - "melee_animation": "359", - "range_animation": "359", - "attack_speed": "6", - "magic_level": "27", - "respawn_delay": "25", - "defence_animation": "360", - "magic_animation": "359", - "death_animation": "361", - "name": "Mogre", - "defence_level": "27", - "safespot": null, - "lifepoints": "60", - "strength_level": "27", - "id": "114", - "aggressive": "true", - "bonuses": "15,15,10,20,40,15,50,50,50,20,50,58,0,0,0", - "range_level": "27", - "attack_level": "27" - }, { "examine": "A large dim looking humanoid.", "melee_animation": "359", @@ -74927,29 +74006,6 @@ "range_level": "1", "attack_level": "63" }, - { - "examine": "Wow! Scorpions shouldn't grow that big.", - "slayer_task": "71", - "melee_animation": "6254", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "17", - "magic_animation": "0", - "death_animation": "6256", - "name": "King Scorpion", - "defence_level": "28", - "safespot": null, - "lifepoints": "40", - "strength_level": "21", - "id": "144", - "aggressive": "true", - "range_level": "28", - "attack_level": "21" - }, { "examine": "A cold-hearted elemental warrior.", "slayer_task": "48", @@ -75377,24 +74433,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Rogueish.", - "melee_animation": "386", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Rogue", - "defence_level": "7", - "safespot": null, - "lifepoints": "10", - "strength_level": "7", - "id": "187", - "range_level": "1", - "attack_level": "7" - }, { "examine": "An evil human cleric.", "start_gfx": "99", @@ -75560,48 +74598,6 @@ "range_level": "1", "attack_level": "28" }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "1595", - "range_animation": "1595", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "1596", - "weakness": "7", - "magic_animation": "1595", - "death_animation": "1597", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1631", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "1595", - "range_animation": "1595", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "1596", - "weakness": "7", - "magic_animation": "1595", - "death_animation": "1597", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1632", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, { "examine": "Has a fearsome posture.", "melee_animation": "390", @@ -75675,7 +74671,7 @@ "lifepoints": "17", "strength_level": "12", "id": "206", - "aggressive": "true", + "aggressive": "false", "clue_level": "1", "range_level": "1", "attack_level": "12" @@ -76089,25 +75085,6 @@ "range_level": "1", "attack_level": "46" }, - { - "examine": "A large", - "melee_animation": "6254", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "6256", - "name": "Khazard Scorpion", - "defence_level": "36", - "safespot": null, - "lifepoints": "51", - "strength_level": "27", - "id": "271", - "aggressive": "true", - "range_level": "36", - "attack_level": "27" - }, { "examine": "A guard who has devoted their life to Armadyl.", "range_animation": "0", @@ -76291,25 +75268,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "288", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An official of Ardougne.", "melee_animation": "0", @@ -76604,40 +75562,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A mourner", - "melee_animation": "414", - "range_animation": "0", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Mourner", - "defence_level": "24", - "safespot": null, - "lifepoints": "34", - "strength_level": "24", - "id": "347", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A mourner", - "melee_animation": "422", - "range_animation": "0", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Mourner", - "defence_level": "24", - "safespot": null, - "lifepoints": "34", - "strength_level": "24", - "id": "348", - "range_level": "1", - "attack_level": "24" - }, { "examine": "A child of West Ardougne.", "melee_animation": "0", @@ -76686,17 +75610,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Paladin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "365", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Smells very chemically...", "melee_animation": "0", @@ -76787,23 +75700,6 @@ "range_level": "27", "attack_level": "27" }, - { - "examine": "A pirate.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "498,500,499", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Redbeard Frank", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "375", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Inspects people's packages.", "melee_animation": "0", @@ -76853,47 +75749,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Looks vicious!", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Kharid Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "385", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Looks vicious!", - "name": "Kharid Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "3611,3612,3610", - "strength_level": "1", - "id": "386", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Looks vicious!", - "name": "Kharid Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "3611,3612,3610", - "strength_level": "1", - "id": "387", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Could do with a shave...", "melee_animation": "0", @@ -76927,22 +75782,6 @@ "range_level": "1", "attack_level": "3" }, - { - "examine": "A brightly coloured game bird.", - "melee_animation": "2371", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "2373", - "name": "River troll", - "defence_level": "3", - "safespot": null, - "lifepoints": "50", - "strength_level": "3", - "id": "392", - "range_level": "1", - "attack_level": "3" - }, { "examine": "Beefy.", "slayer_task": "20", @@ -78025,22 +76864,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Likes you more", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shop assistant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "525", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A product of a consumerist society.", "melee_animation": "0", @@ -78057,22 +76880,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Likes you more", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shop assistant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "527", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Has an interesting assortment of items for sale.", "melee_animation": "0", @@ -78186,22 +76993,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Ironically", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shopkeeper", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "551", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Helps the shopkeeper sell swords.", "melee_animation": "0", @@ -79322,18 +78113,6 @@ "range_level": "1", "attack_level": "1" }, - { - "slayer_exp": "0", - "examine": "It's an NPC.", - "name": "Edmond", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "714", - "range_level": "1", - "attack_level": "1" - }, { "examine": "In charge of people with silly outfits.", "melee_animation": "0", @@ -80164,24 +78943,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Tough-looking.", - "slayer_task": "64", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Ogre chieftain", - "defence_level": "58", - "safespot": null, - "lifepoints": "331", - "strength_level": "58", - "id": "852", - "range_level": "1", - "attack_level": "58" - }, { "name": "Gorad", "defence_level": "1", @@ -80751,25 +79512,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "951", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A holy man.", "melee_animation": "0", @@ -81129,1608 +79871,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "One of the guardians of Iban.", - "melee_animation": "64", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "65", - "death_animation": "67", - "name": "Holthion", - "defence_level": "1", - "safespot": null, - "lifepoints": "90", - "strength_level": "1", - "id": "1000", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A user of dark magic.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "0", - "name": "Dark mage", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1001", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A dark magic user.", - "melee_animation": "422", - "range_animation": "0", - "magic_level": "32", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "836", - "name": "Disciple of Iban", - "defence_level": "32", - "safespot": null, - "lifepoints": "45", - "strength_level": "24", - "id": "1002", - "range_level": "1", - "attack_level": "24" - }, - { - "melee_animation": "6249", - "respawn_delay": "60", - "defence_animation": "6250", - "death_animation": "6251", - "name": "Spider", - "defence_level": "1", - "safespot": null, - "lifepoints": "2", - "strength_level": "1", - "id": "1004", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A servant of Zamorak.", - "combat_style": "2", - "melee_animation": "811", - "range_animation": "0", - "attack_speed": "5", - "magic_level": "60", - "spell_id": "43", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "811", - "death_animation": "836", - "name": "Zamorak wizard", - "defence_level": "50", - "safespot": null, - "lifepoints": "73", - "strength_level": "50", - "id": "1007", - "aggressive": "true", - "range_level": "50", - "attack_level": "50" - }, - { - "examine": "A green skinned croaker", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Swamp toad", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1013", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Useful for hitting rocks.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "death_animation": "0", - "name": "Iron pickaxe", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1015", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "slayer_task": "7", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "weakness": "9", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "1017", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He rules the", - "slayer_task": "7", - "melee_animation": "5387", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "5389", - "name": "Rooster", - "defence_level": "2", - "safespot": null, - "lifepoints": "2", - "strength_level": "2", - "id": "1018", - "range_level": "1", - "attack_level": "2" - }, - { - "examine": "A fire elemental.", - "melee_animation": "1029", - "range_animation": "0", - "magic_level": "32", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "1031", - "name": "Fire elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "24", - "id": "1019", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "An earth elemental.", - "melee_animation": "4868", - "range_animation": "0", - "attack_speed": "7", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "death_animation": "4870", - "name": "Earth elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "32", - "id": "1020", - "aggressive": "true", - "range_level": "1", - "attack_level": "32" - }, - { - "examine": "An air elemental.", - "melee_animation": "1040", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "1", - "magic_animation": "0", - "death_animation": "1041", - "name": "Air elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "24", - "id": "1021", - "range_level": "32", - "attack_level": "24" - }, - { - "examine": "A water elemental.", - "melee_animation": "1044", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "1", - "magic_animation": "0", - "death_animation": "1048", - "name": "Water elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "24", - "id": "1022", - "range_level": "32", - "attack_level": "24" - }, - { - "examine": "Could his name be 'Lurch'?", - "melee_animation": "7183", - "slayer_exp": "50", - "death_animation": "7185", - "name": "Vampire", - "defence_level": "52", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "1023", - "clue_level": "1", - "range_level": "1", - "attack_level": "52" - }, - { - "examine": "An evil human cleric.", - "start_gfx": "99", - "combat_style": "2", - "combat_audio": "511,513,512", - "melee_animation": "422", - "range_animation": "0", - "attack_speed": "4", - "magic_level": "25", - "end_gfx": "101", - "respawn_delay": "60", - "defence_animation": "404", - "weakness": "3", - "magic_animation": "711", - "death_animation": "836", - "name": "Monk of Zamorak", - "defence_level": "22", - "safespot": null, - "lifepoints": "20", - "strength_level": "18", - "id": "1044", - "aggressive": "true", - "range_level": "1", - "projectile": "100", - "attack_level": "18" - }, - { - "examine": "An evil human cleric.", - "start_gfx": "99", - "combat_style": "2", - "combat_audio": "511,513,512", - "melee_animation": "422", - "range_animation": "0", - "attack_speed": "4", - "magic_level": "25", - "end_gfx": "101", - "respawn_delay": "60", - "defence_animation": "404", - "weakness": "3", - "magic_animation": "711", - "death_animation": "836", - "name": "Monk of Zamorak", - "defence_level": "17", - "safespot": null, - "lifepoints": "10", - "strength_level": "8", - "id": "1045", - "aggressive": "true", - "range_level": "1", - "projectile": "100", - "attack_level": "8" - }, - { - "examine": "An evil human cleric.", - "start_gfx": "99", - "combat_style": "2", - "combat_audio": "511,513,512", - "melee_animation": "422", - "range_animation": "0", - "attack_speed": "4", - "magic_level": "40", - "end_gfx": "101", - "respawn_delay": "60", - "defence_animation": "404", - "weakness": "3", - "magic_animation": "711", - "death_animation": "836", - "name": "Monk of Zamorak", - "defence_level": "25", - "safespot": null, - "lifepoints": "25", - "strength_level": "25", - "id": "1046", - "aggressive": "true", - "range_level": "1", - "projectile": "100", - "attack_level": "25" - }, - { - "examine": "Ticket trader for the Brimhaven Agility Arena.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "703,705,704", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pirate Jackie the Fruit", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1055", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A member of the audience.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Strange watcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1057", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A member of the audience.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Strange watcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1058", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A member of the audience.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Strange watcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1059", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Commander of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Denulth", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1060", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A sergeant of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Sergeant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1061", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1063", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "1064", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "name": "Soldier", - "defence_level": "44", - "safespot": null, - "lifepoints": "55", - "combat_audio": "511,513,512", - "strength_level": "44", - "id": "1065", - "magic_level": "1", - "range_level": "1", - "attack_level": "44" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1066", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1067", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1068", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1069", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A Burthorpe Castle Archer.", - "start_gfx": "19", - "combat_style": "1", - "melee_animation": "426", - "range_animation": "426", - "magic_level": "1", - "respawn_delay": "12", - "defence_animation": "404", - "magic_animation": "426", - "death_animation": "9055", - "name": "Archer", - "defence_level": "44", - "safespot": null, - "lifepoints": "55", - "strength_level": "1", - "id": "1073", - "bonuses": "54,68,75,72,67,81,54,35,35,0,0,0,0,0,0", - "range_level": "44", - "projectile": "10", - "attack_level": "1" - }, - { - "examine": "A Burthorpe Castle Archer.", - "start_gfx": "19", - "combat_style": "1", - "melee_animation": "426", - "range_animation": "426", - "magic_level": "1", - "respawn_delay": "12", - "defence_animation": "404", - "magic_animation": "426", - "death_animation": "9055", - "name": "Archer", - "defence_level": "44", - "safespot": null, - "lifepoints": "55", - "strength_level": "1", - "id": "1074", - "bonuses": "54,68,75,72,67,81,54,35,35,0,0,0,0,0,0", - "range_level": "44", - "projectile": "10", - "attack_level": "1" - }, - { - "examine": "A Burthorpe Castle guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "magic_level": "1", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "33", - "safespot": null, - "lifepoints": "44", - "strength_level": "33", - "id": "1076", - "clue_level": "1", - "range_level": "1", - "attack_level": "33" - }, - { - "examine": "A Burthorpe Castle guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "magic_level": "1", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "33", - "safespot": null, - "lifepoints": "44", - "strength_level": "33", - "id": "1077", - "clue_level": "1", - "range_level": "1", - "attack_level": "33" - }, - { - "examine": "A servant for Prince Anlaf.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Servant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1081", - "range_level": "1", - "attack_level": "1" - }, - { - "death_animation": "836", - "name": "Ocga", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1085", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "death_animation": "836", - "name": "Penda", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1087", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "death_animation": "836", - "name": "Hygd", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1088", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "death_animation": "836", - "name": "Ceolburg", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1089", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "examine": "The knight seems to be watching something.", - "melee_animation": "7042", - "range_animation": "0", - "combat_audio": "511,513,512", - "attack_speed": "8", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "White Knight", - "defence_level": "27", - "safespot": null, - "lifepoints": "38", - "strength_level": "27", - "id": "1092", - "range_level": "1", - "attack_level": "27" - }, - { - "examine": "The biggest and baddest troll.", - "slayer_task": "83", - "melee_animation": "6523", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Rock", - "defence_level": "63", - "safespot": null, - "lifepoints": "90", - "strength_level": "63", - "id": "1095", - "aggressive": "true", - "range_level": "1", - "attack_level": "63" - }, - { - "examine": "A big", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "7", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Stick", - "defence_level": "61", - "safespot": null, - "lifepoints": "87", - "strength_level": "61", - "id": "1096", - "aggressive": "true", - "range_level": "1", - "attack_level": "61" - }, - { - "name": "Pee Hat", - "defence_level": "1", - "safespot": null, - "lifepoints": "126", - "strength_level": "1", - "id": "1097", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Kraka", - "defence_level": "1", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "attack_speed": "6", - "id": "1098", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Dung", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1099", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Ash", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1100", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1101", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1102", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1103", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1104", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1105", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1106", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1107", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1108", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1109", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1110", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1111", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1112", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "One of the troll generals.", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll general", - "defence_level": "65", - "safespot": null, - "lifepoints": "92", - "strength_level": "65", - "id": "1115", - "aggressive": "true", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "One of the troll generals.", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll general", - "defence_level": "65", - "safespot": null, - "lifepoints": "92", - "strength_level": "65", - "id": "1116", - "aggressive": "true", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "One of the troll generals.", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll general", - "defence_level": "65", - "safespot": null, - "lifepoints": "92", - "strength_level": "65", - "id": "1117", - "aggressive": "true", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1118", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1119", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1120", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1121", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1122", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1123", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1124", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "An unusually large troll.", - "slayer_task": "83", - "melee_animation": "1158", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Dad", - "defence_level": "55", - "safespot": null, - "lifepoints": "157", - "strength_level": "55", - "id": "1125", - "range_level": "1", - "attack_level": "55" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Twig", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1126", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Berry", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1127", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "melee_animation": "5821", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Twig", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1128", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Berry", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1129", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1130", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1131", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1132", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1133", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1134", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1135", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1136", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1137", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1138", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "He's fast asleep.", - "slayer_task": "83", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "death_animation": "0", - "name": "Mushroom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1139", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "This beast doesn't need climbing boots.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mountain goat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1140", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "This beast doesn't need climbing boots.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mountain goat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1141", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He's guarding the storeroom.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1142", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He's guarding the storeroom.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1143", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "name": "Guard", "defence_level": "1", @@ -82857,50 +79997,6 @@ "range_level": "1", "attack_level": "50" }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "1183", - "clue_level": "2", - "range_level": "72", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "68", - "safespot": null, - "lifepoints": "85", - "strength_level": "68", - "id": "1184", - "clue_level": "2", - "range_level": "1", - "attack_level": "68" - }, { "examine": "An elven city guard.", "melee_animation": "0", @@ -83064,25 +80160,6 @@ "range_level": "1", "attack_level": "42" }, - { - "examine": "I don't want to get on the wrong side of him.", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "426", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "105", - "strength_level": "1", - "id": "1201", - "clue_level": "2", - "range_level": "1", - "projectile": "249", - "attack_level": "1" - }, { "examine": "One of King Tyras's men.", "melee_animation": "395", @@ -83323,17 +80400,6 @@ "range_level": "1", "attack_level": "46" }, - { - "name": "Wizard", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "1263", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A follower of Saradomin.", "melee_animation": "376", @@ -83356,27 +80422,6 @@ "range_level": "70", "attack_level": "90" }, - { - "examine": "No one likes crabs...", - "melee_animation": "1312", - "range_animation": "1312", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "1313", - "weakness": "7", - "magic_animation": "1312", - "death_animation": "1314", - "name": "Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "51", - "strength_level": "1", - "id": "1265", - "bonuses": "-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A rocky outcrop.", "melee_animation": "1312", @@ -83396,26 +80441,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs...", - "melee_animation": "1312", - "range_animation": "1312", - "attack_speed": "5", - "defence_animation": "1313", - "magic_animation": "1312", - "death_animation": "1314", - "name": "Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "1267", - "aggressive": "true", - "bonuses": "-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A rocky outcrop.", "melee_animation": "1312", @@ -84799,44 +81824,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "1401", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "1402", - "range_level": "1", - "attack_level": "1" - }, { "death_animation": "5389", "name": "Rooster", @@ -85076,18 +82063,6 @@ "range_level": "1", "attack_level": "5" }, - { - "slayer_exp": "17", - "name": "Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "3611,3612,3610", - "strength_level": "1", - "id": "1477", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A very dangerous looking spider", "slayer_task": "76", @@ -85615,205 +82590,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1582", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1583", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1584", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1585", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1586", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "1587", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "1588", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Young but still dangerous.", - "slayer_task": "68", - "melee_animation": "25", - "range_animation": "25", - "combat_audio": "408,410,409", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "32", - "defence_animation": "26", - "weakness": "3", - "magic_animation": "25", - "death_animation": "28", - "name": "Baby red dragon", - "defence_level": "42", - "safespot": null, - "lifepoints": "50", - "strength_level": "40", - "id": "1589", - "aggressive": "true", - "bonuses": "50,40,64,60,30,45,40,40,20,40,40,20,0,0,0", - "range_level": "1", - "attack_level": "40" - }, { "examine": "Its scales seem to be made of bronze.", "slayer_task": "13", @@ -85934,92 +82710,6 @@ "range_level": "1", "attack_level": "25" }, - { - "examine": "A spiky crawling critter. ", - "slayer_task": "16", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "weakness": "1", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1600", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "38", - "attack_level": "28" - }, - { - "examine": "A spiky crawling critter. ", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1601", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "A spiky crawling critter. ", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1602", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "A spiky crawling critter. ", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1603", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, { "examine": "A very smelly ghost.", "slayer_task": "0", @@ -86128,28 +82818,6 @@ "projectile": "335", "attack_level": "1" }, - { - "examine": "Flies like a rock.", - "melee_animation": "9454", - "range_animation": "1516", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9455", - "slayer_exp": "105", - "magic_animation": "1516", - "death_animation": "1518", - "name": "Gargoyle", - "defence_level": "107", - "safespot": null, - "lifepoints": "105", - "strength_level": "95", - "id": "1610", - "aggressive": "true", - "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, { "examine": "Flies like a rock.", "slayer_task": "84", @@ -86191,26 +82859,6 @@ "range_level": "1", "attack_level": "9" }, - { - "examine": "An evil death demon.", - "melee_animation": "9487", - "range_animation": "1528", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9489", - "magic_animation": "1528", - "death_animation": "9488", - "name": "Nechryael", - "defence_level": "105", - "safespot": null, - "lifepoints": "105", - "strength_level": "97", - "id": "1613", - "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "97" - }, { "examine": "An evil death spawn.", "melee_animation": "1540", @@ -86233,29 +82881,6 @@ "range_level": "1", "attack_level": "67" }, - { - "examine": "A denizen of the Abyss!", - "slayer_task": "1", - "melee_animation": "1537", - "range_animation": "1537", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "0", - "weakness": "1", - "slayer_exp": "150", - "magic_animation": "1537", - "death_animation": "1538", - "name": "Abyssal demon", - "defence_level": "135", - "safespot": null, - "lifepoints": "150", - "strength_level": "67", - "id": "1615", - "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "97" - }, { "examine": "The eyes of evil.", "melee_animation": "260", @@ -86294,110 +82919,6 @@ "range_level": "75", "attack_level": "80" }, - { - "examine": "The tongue of evil.", - "melee_animation": "9130", - "range_animation": "1552", - "attack_speed": "4", - "respawn_delay": "60", - "defence_animation": "9132", - "slayer_exp": "120", - "magic_animation": "1552", - "death_animation": "9131", - "name": "Bloodveld", - "defence_level": "30", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "1618", - "aggressive": "true", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { - "examine": "The tongue of evil.", - "melee_animation": "9130", - "range_animation": "1552", - "attack_speed": "4", - "respawn_delay": "60", - "defence_animation": "9132", - "slayer_exp": "120", - "magic_animation": "1552", - "death_animation": "9131", - "name": "Bloodveld", - "defence_level": "30", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "1619", - "aggressive": "true", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { - "examine": "The winged reptile.", - "slayer_task": "19", - "melee_animation": "7762", - "range_animation": "7762", - "attack_speed": "5", - "defence_animation": "7761", - "weakness": "2", - "slayer_exp": "37", - "magic_animation": "7762", - "death_animation": "7763", - "name": "Cockatrice", - "defence_level": "35", - "safespot": null, - "lifepoints": "37", - "strength_level": "32", - "id": "1620", - "bonuses": "30,30,30,30,30,35,0,0,0,0,0,0,0,0,0", - "clue_level": "1", - "range_level": "32", - "attack_level": "32" - }, - { - "examine": "The winged reptile.", - "melee_animation": "7762", - "range_animation": "7762", - "attack_speed": "5", - "defence_animation": "7761", - "slayer_exp": "37", - "magic_animation": "7762", - "death_animation": "7763", - "name": "Cockatrice", - "defence_level": "35", - "safespot": null, - "lifepoints": "37", - "strength_level": "32", - "id": "1621", - "bonuses": "30,30,30,30,30,35,0,0,0,0,0,0,0,0,0", - "clue_level": "1", - "range_level": "1", - "attack_level": "32" - }, - { - "examine": "The vacuumed face of evil.", - "slayer_task": "28", - "melee_animation": "1557", - "range_animation": "1557", - "attack_speed": "4", - "defence_animation": "1555", - "weakness": "2", - "slayer_exp": "105", - "magic_animation": "1557", - "death_animation": "1558", - "name": "Dust devil", - "defence_level": "40", - "safespot": null, - "lifepoints": "105", - "strength_level": "70", - "id": "1624", - "range_level": "1", - "attack_level": "105" - }, { "examine": "The cave-dwelling cousin of the dust devils.", "slayer_task": "28", @@ -86416,469 +82937,6 @@ "range_level": "61", "attack_level": "105" }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "9506", - "range_animation": "9506", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "9508", - "weakness": "7", - "magic_animation": "9506", - "death_animation": "9507", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1631", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "9506", - "range_animation": "9506", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "9508", - "weakness": "7", - "magic_animation": "9506", - "death_animation": "9507", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1632", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1633", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1634", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1635", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1636", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "examine": "It's a Jelly.", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "8569", - "attack_speed": "5", - "magic_level": "40", - "defence_animation": "8571", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "8569", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "40", - "safespot": null, - "lifepoints": "75", - "strength_level": "45", - "id": "1637", - "clue_level": "2", - "range_level": "40", - "attack_level": "40" - }, - { - "examine": "Doesn't look so tough...", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "0", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "49", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "1638", - "clue_level": "2", - "range_level": "49", - "attack_level": "1" - }, - { - "examine": "Wibbly.", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "0", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "49", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "1639", - "clue_level": "2", - "range_level": "49", - "attack_level": "1" - }, - { - "examine": "There's always room for jelly.", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "0", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "49", - "safespot": null, - "lifepoints": "140", - "strength_level": "1", - "id": "1640", - "clue_level": "2", - "range_level": "49", - "attack_level": "1" - }, - { - "melee_animation": "8569", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "8571", - "slayer_exp": "75", - "name": "Jelly", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "1641", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "8569", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "8571", - "slayer_exp": "75", - "name": "Jelly", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "1642", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Now THAT'S handy.", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "9125", - "attack_speed": "5", - "respawn_delay": "20", - "defence_animation": "9127", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "9125", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "5", - "safespot": null, - "lifepoints": "16", - "strength_level": "5", - "id": "1648", - "bonuses": "5,0,0,0,0,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "5" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1649", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1650", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1651", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1652", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Now THAT's handy.", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1653", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "I'm glad it's just the hand I can see...", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1654", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "A big severed hand.", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1655", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "Give the guy a big hand.....", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1656", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "A big severed hand.", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1657", - "range_level": "1", - "attack_level": "13" - }, { "examine": "He's in charge of the Skullball Course.", "melee_animation": "0", @@ -86960,27 +83018,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "His beard seems to have a life of its own.", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "magic_level": "1", - "defence_animation": "4665", - "weakness": "3", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "60", - "safespot": null, - "lifepoints": "120", - "strength_level": "60", - "id": "1681", - "aggressive": "true", - "bonuses": "66,62,0,0,0,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, { "examine": "A trader from across the eastern sea.", "start_gfx": "0", @@ -87058,22 +83095,22 @@ "melee_animation": "422", "range_animation": "0", "attack_speed": "5", - "magic_level": "38", + "magic_level": "1", "respawn_delay": "60", "defence_animation": "0", "weakness": "3", - "slayer_exp": "25", + "slayer_exp": "51", "magic_animation": "0", "death_animation": "836", "name": "Tortured soul", "defence_level": "38", "safespot": null, - "lifepoints": "85", - "strength_level": "28", + "lifepoints": "51", + "strength_level": "62", "id": "1698", "aggressive": "true", "range_level": "1", - "attack_level": "28" + "attack_level": "52" }, { "examine": "A guard for the humans against monster group.", @@ -88160,28 +84197,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Flies like a rock.", - "melee_animation": "9454", - "range_animation": "1516", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9455", - "slayer_exp": "105", - "magic_animation": "1516", - "death_animation": "1518", - "name": "Gargoyle", - "defence_level": "107", - "safespot": null, - "lifepoints": "105", - "strength_level": "95", - "id": "1827", - "aggressive": "true", - "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, { "examine": "It didn't get that big eating flies!", "melee_animation": "1793", @@ -89394,23 +85409,6 @@ "range_level": "40", "attack_level": "30" }, - { - "melee_animation": "7588", - "attack_speed": "6", - "respawn_delay": "60", - "defence_animation": "7590", - "slayer_exp": "62", - "death_animation": "7591", - "name": "Crocodile", - "defence_level": "1", - "safespot": null, - "lifepoints": "63", - "strength_level": "1", - "id": "1993", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He has had his day.", "slayer_task": "27", @@ -89762,78 +85760,6 @@ "range_level": "1", "attack_level": "65" }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2044", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2045", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2046", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2047", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2048", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2049", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "name": "Skogre", "defence_level": "1", @@ -89846,66 +85772,6 @@ "respawn_delay": "60", "attack_level": "1" }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2051", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2052", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2053", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2054", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2055", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "name": "Skogre", "defence_level": "1", @@ -90950,22 +86816,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A rich landlord", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Inn Keeper", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2177", - "range_level": "1", - "attack_level": "1" - }, { "examine": "These Dwarf ladies are so attractive!", "melee_animation": "0", @@ -91223,21 +87073,6 @@ "range_level": "1", "attack_level": "1" }, - { - "melee_animation": "401", - "attack_speed": "6", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Khazard trooper", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "2245", - "range_level": "1", - "attack_level": "1" - }, { "examine": "It's one of General Khazard's warriors.", "melee_animation": "429", @@ -91257,51 +87092,6 @@ "range_level": "1", "attack_level": "32" }, - { - "combat_style": "1", - "melee_animation": "190", - "respawn_delay": "60", - "defence_animation": "193", - "death_animation": "196", - "name": "Gnome troop", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2247", - "range_level": "1", - "attack_level": "1" - }, - { - "combat_style": "1", - "melee_animation": "190", - "respawn_delay": "60", - "defence_animation": "193", - "death_animation": "196", - "name": "Gnome troop", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2248", - "range_level": "1", - "attack_level": "1" - }, - { - "combat_audio": "511,513,512", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Paladin", - "defence_level": "1", - "safespot": null, - "lifepoints": "66", - "strength_level": "1", - "id": "2256", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An initiate of Zamorak.", "melee_animation": "0", @@ -91318,27 +87108,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A blood-drinking denizen of the abyss.", - "melee_animation": "2181", - "range_animation": "0", - "attack_speed": "3", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "0", - "magic_animation": "0", - "death_animation": "2183", - "name": "Abyssal leech", - "defence_level": "52", - "safespot": null, - "lifepoints": "74", - "strength_level": "1", - "id": "2263", - "aggressive": "true", - "range_level": "52", - "attack_level": "1" - }, { "examine": "It seems to have eyes in the back of its head...", "melee_animation": "2186", @@ -91360,26 +87129,6 @@ "range_level": "135", "attack_level": "65" }, - { - "examine": "Apparently walks the abyss.", - "melee_animation": "2192", - "range_animation": "2192", - "attack_speed": "5", - "defence_animation": "2193", - "weakness": "8", - "slayer_exp": "0", - "magic_animation": "2192", - "death_animation": "2194", - "name": "Abyssal walker", - "defence_level": "55", - "safespot": null, - "lifepoints": "95", - "strength_level": "116", - "id": "2265", - "aggressive": "true", - "range_level": "1", - "attack_level": "60" - }, { "examine": "A snowman armed with a holly bow.", "melee_animation": "0", @@ -91588,21 +87337,6 @@ "range_level": "1", "attack_level": "1" }, - { - "melee_animation": "400", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Sir Leye", - "defence_level": "1", - "safespot": null, - "lifepoints": "21", - "strength_level": "1", - "id": "2285", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An observer for the Temple Knights.", "melee_animation": "0", @@ -91699,17 +87433,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "2309", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Young, but still beefy.", "slayer_task": "20", @@ -91747,63 +87470,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2313", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2314", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2315", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Swine.", "melee_animation": "0", @@ -91966,94 +87632,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2359", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2360", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2361", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2362", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, { "examine": "A Mourner showing his true identity.", "melee_animation": "0", @@ -92200,26 +87778,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs... especially really big ones!", - "melee_animation": "2368", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "68", - "safespot": null, - "lifepoints": "97", - "strength_level": "68", - "id": "2452", - "aggressive": "true", - "range_level": "1", - "attack_level": "68" - }, { "examine": "Heavy rock!", "melee_animation": "0", @@ -92300,167 +87858,6 @@ "projectile": "294", "attack_level": "68" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "5", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "20", - "safespot": null, - "lifepoints": "19", - "strength_level": "5", - "id": "2463", - "aggressive": "true", - "bonuses": "25,85,105,75,103,85,65,0,0,0,0,0,0,0,0", - "range_level": "5", - "projectile": "337", - "attack_level": "5" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "10", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "40", - "safespot": null, - "lifepoints": "40", - "strength_level": "10", - "id": "2464", - "aggressive": "true", - "bonuses": "35,105,125,95,128,105,85,0,0,0,0,0,0,0,0", - "range_level": "10", - "projectile": "337", - "attack_level": "10" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "15", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "50", - "safespot": null, - "lifepoints": "60", - "strength_level": "15", - "id": "2465", - "aggressive": "true", - "bonuses": "35,185,185,155,188,125,165,0,0,0,0,0,0,0,0", - "range_level": "15", - "projectile": "337", - "attack_level": "15" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "25", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "60", - "safespot": null, - "lifepoints": "80", - "strength_level": "45", - "id": "2466", - "aggressive": "true", - "bonuses": "45,235,235,205,238,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "35", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "70", - "safespot": null, - "lifepoints": "105", - "strength_level": "45", - "id": "2467", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "45", - "respawn_delay": "25", - "defence_animation": "2300", - "weakness": "9", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "90", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "2468", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, { "examine": "A Retired Highwayman", "combat_style": "1", @@ -93164,132 +88561,6 @@ "projectile": "442", "attack_level": "70" }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2610", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2611", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2612", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2613", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2614", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2615", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2616", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, { "name": "Tz-Kih", "defence_level": "1", @@ -93661,22 +88932,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A strange man with a strange name. Probably a strange past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Longbow Ben", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2691", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She quackers.", "slayer_task": "7", @@ -94063,22 +89318,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A wise barbarian", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Otto Godblessed", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2725", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Holy looking.", "melee_animation": "0", @@ -94391,29 +89630,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "From a darker dimension.", - "slayer_task": "25", - "melee_animation": "2731", - "range_animation": "2731", - "attack_speed": "4", - "magic_level": "160", - "defence_animation": "2732", - "weakness": "4", - "slayer_exp": "225", - "magic_animation": "2731", - "death_animation": "2733", - "name": "Dark beast", - "defence_level": "120", - "safespot": null, - "lifepoints": "220", - "strength_level": "160", - "id": "2783", - "aggressive": "true", - "bonuses": "0,0,0,0,0,30,40,100,90,100,0,0,0,0,0", - "range_level": "1", - "attack_level": "140" - }, { "examine": "Digging.", "melee_animation": "0", @@ -95354,44 +90570,6 @@ "range_level": "255", "attack_level": "255" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "1312", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "1313", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "240", - "strength_level": "1", - "id": "2885", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "name": "Boulder", "defence_level": "1", @@ -95440,25 +90618,6 @@ "projectile": "288", "attack_level": "1" }, - { - "examine": "It wasn't a rock... It was a rock lobster!", - "melee_animation": "2860", - "range_animation": "2860", - "attack_speed": "2", - "defence_animation": "2861", - "weakness": "7", - "magic_animation": "2860", - "death_animation": "2862", - "name": "Rock lobster", - "defence_level": "100", - "safespot": null, - "lifepoints": "150", - "strength_level": "100", - "id": "2889", - "bonuses": "0,0,0,0,0,100,100,50,50,150,0,0,0,0,0", - "range_level": "1", - "attack_level": "100" - }, { "agg_radius": "12", "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", @@ -95567,22 +90726,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Lovely", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Bones", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2945", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Obviously punches above his weight.", "melee_animation": "0", @@ -95844,68 +90987,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "King rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "2982", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not a soft touch.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pusskins", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2984", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A not-so friendly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Captain Tom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2986", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fully grown feline.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mittens", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2988", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Cute and fluffy.", "melee_animation": "0", @@ -97631,24 +92712,6 @@ "range_level": "1", "attack_level": "28" }, - { - "examine": "One of RuneScape's many citizens", - "melee_animation": "422", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Drunken man", - "defence_level": "4", - "safespot": null, - "lifepoints": "5", - "strength_level": "4", - "id": "3222", - "range_level": "1", - "attack_level": "4" - }, { "examine": "He tries to keep order around here.", "melee_animation": "386", @@ -97972,314 +93035,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Alberich", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3246", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Fafner", - "melee_animation": "7048", - "range_animation": "7048", - "attack_speed": "6", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "7048", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "18", - "strength_level": "22", - "id": "3247", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Fasolt", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3248", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Siegmund", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3249", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Siegfried", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3250", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Lydspor", - "melee_animation": "7048", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3251", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Hagen", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3252", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Minarch", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3253", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Wotan", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3255", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Acelin", - "melee_animation": "390", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3256", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Adelino", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3257", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Adolpho", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3258", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Aitan", - "melee_animation": "426", - "range_animation": "426", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3259", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Brunnhilde", - "melee_animation": "428", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "20", - "safespot": null, - "lifepoints": "28", - "strength_level": "20", - "id": "3260", - "clue_level": "0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Gutrune", - "melee_animation": "428", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "20", - "safespot": null, - "lifepoints": "28", - "strength_level": "20", - "id": "3261", - "clue_level": "0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Edelschwarz", - "melee_animation": "428", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "20", - "safespot": null, - "lifepoints": "28", - "strength_level": "20", - "id": "3262", - "clue_level": "0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Sieglinde", - "melee_animation": "428", - "range_animation": "428", - "attack_speed": "6", - "defence_animation": "404", - "weakness": "8", - "magic_animation": "428", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "20", - "strength_level": "20", - "id": "3263", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, { "examine": "An ugly green creature.", "melee_animation": "6185", @@ -98838,22 +93593,6 @@ "range_level": "41", "attack_level": "1" }, - { - "examine": "Likes to cook with mushrooms.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Fairy chef", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3322", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Rather more tired than most.", "melee_animation": "0", @@ -98902,112 +93641,6 @@ "range_level": "300", "attack_level": "200" }, - { - "examine": "Holy Mole-y!", - "melee_animation": "3312", - "range_animation": "3312", - "attack_speed": "4", - "magic_level": "200", - "respawn_delay": "56", - "defence_animation": "3311", - "weakness": "7", - "magic_animation": "3312", - "death_animation": "3310", - "name": "Giant Mole", - "defence_level": "200", - "safespot": null, - "lifepoints": "200", - "strength_level": "200", - "id": "3340", - "bonuses": "0,0,0,0,0,60,80,100,80,60,0,0,0,0,0", - "range_level": "1", - "attack_level": "200" - }, - { - "examine": "I will call him", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Baby Mole", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3341", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fun guy. No wait", - "melee_animation": "0", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Fungi", - "defence_level": "1", - "safespot": null, - "lifepoints": "65", - "strength_level": "1", - "id": "3344", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "2776", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "2775", - "death_animation": "2777", - "name": "Fungi", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "3345", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A bouncy fungus.", - "slayer_task": "94", - "melee_animation": "2776", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "1", - "magic_animation": "0", - "death_animation": "2777", - "name": "Zygomite", - "defence_level": "42", - "safespot": null, - "lifepoints": "60", - "strength_level": "1", - "id": "3346", - "range_level": "42", - "attack_level": "1" - }, - { - "melee_animation": "2776", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "2775", - "death_animation": "2777", - "name": "Zygomite", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "3347", - "range_level": "1", - "attack_level": "1" - }, { "melee_animation": "7049", "combat_audio": "511,513,512", @@ -99056,119 +93689,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3366", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3367", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3368", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3369", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3370", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3371", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "slayer_task": "7", - "melee_animation": "2299", - "range_animation": "0", - "combat_audio": "355,357,356", - "magic_level": "55", - "respawn_delay": "0", - "defence_animation": "0", - "weakness": "10", - "magic_animation": "0", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "55", - "safespot": null, - "lifepoints": "117", - "strength_level": "55", - "id": "3375", - "aggressive": "true", - "range_level": "55", - "attack_level": "55" - }, - { - "examine": "Young but still dangerous.", - "slayer_task": "68", - "melee_animation": "25", - "range_animation": "25", - "combat_audio": "408,410,409", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "32", - "defence_animation": "26", - "weakness": "3", - "slayer_exp": "0", - "magic_animation": "25", - "death_animation": "28", - "name": "Baby black dragon", - "defence_level": "42", - "safespot": null, - "lifepoints": "50", - "strength_level": "80", - "id": "3376", - "aggressive": "true", - "bonuses": "50,40,64,60,30,45,40,40,20,40,40,20,0,0,0", - "range_level": "1", - "attack_level": "80" - }, { "examine": "He seems to like wearing black.", "melee_animation": "0", @@ -99463,23 +93983,6 @@ "range_level": "65", "attack_level": "65" }, - { - "examine": "He may be a funky cook", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "469,472,471", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Goblin Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3413", - "range_level": "1", - "attack_level": "1" - }, { "examine": "More like a goblin cooked.", "melee_animation": "0", @@ -99497,17 +94000,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Goblin Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "469,472,471", - "strength_level": "1", - "id": "3415", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He'll store my items for me.", "melee_animation": "0", @@ -100440,29 +94932,6 @@ "range_level": "27", "attack_level": "27" }, - { - "examine": "Young but still dangerous.", - "melee_animation": "25", - "range_animation": "25", - "combat_audio": "408,410,409", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "32", - "defence_animation": "26", - "weakness": "8", - "magic_animation": "25", - "death_animation": "28", - "name": "Baby red dragon", - "defence_level": "42", - "safespot": null, - "lifepoints": "50", - "strength_level": "40", - "id": "3588", - "aggressive": "true", - "bonuses": "20,10,10,20,40,40,20,40,40,20,0,0,0,0,0", - "range_level": "1", - "attack_level": "40" - }, { "examine": "Its scales seem to be made of steel.", "combat_audio": "408,410,409", @@ -100482,17 +94951,6 @@ "range_level": "185", "attack_level": "234" }, - { - "name": "Dagannoth", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3591", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Arrgh! Look at its pointy teeth!", "range_animation": "0", @@ -100828,58 +95286,6 @@ "range_level": "1", "attack_level": "25" }, - { - "name": "Angry unicorn", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "496,498,497", - "strength_level": "1", - "id": "3661", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Angry giant rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "3662", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He looks a little on the cross side!", - "slayer_task": "38", - "melee_animation": "6185", - "range_animation": "0", - "combat_audio": "469,472,471", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "6182", - "name": "Angry goblin", - "defence_level": "25", - "safespot": null, - "lifepoints": "35", - "strength_level": "25", - "id": "3663", - "range_level": "1", - "attack_level": "25" - }, - { - "name": "Angry bear", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "498,500,499", - "strength_level": "1", - "id": "3664", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Freshly sheared.", "melee_animation": "5341", @@ -100918,38 +95324,6 @@ "range_level": "1", "attack_level": "2" }, - { - "examine": "If you see them circling", - "melee_animation": "2019", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "2021", - "name": "Vulture", - "defence_level": "38", - "safespot": null, - "lifepoints": "54", - "strength_level": "38", - "id": "3675", - "range_level": "1", - "attack_level": "38" - }, - { - "death_animation": "2026", - "name": "Vulture", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "2025", - "strength_level": "1", - "id": "3676", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "2024" - }, { "examine": "A young boy handing out flyers.", "melee_animation": "0", @@ -101053,1078 +95427,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "5", - "respawn_delay": "120", - "defence_animation": "3890", - "weakness": "8", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "20", - "safespot": null, - "lifepoints": "13", - "strength_level": "20", - "id": "3727", - "bonuses": "5,10,10,10,10,2,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "10", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "25", - "safespot": null, - "lifepoints": "23", - "strength_level": "25", - "id": "3728", - "bonuses": "10,15,15,15,15,5,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "25" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "10", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "3729", - "bonuses": "15,20,20,20,20,8,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "15", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "35", - "safespot": null, - "lifepoints": "23", - "strength_level": "35", - "id": "3730", - "bonuses": "20,25,25,25,25,10,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "35" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "20", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "40", - "safespot": null, - "lifepoints": "23", - "strength_level": "40", - "id": "3731", - "bonuses": "25,30,30,30,30,15,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "40" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "14", - "respawn_delay": "127", - "defence_animation": "3902", - "weakness": "9", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "28", - "poison_immune": "true", - "safespot": null, - "lifepoints": "23", - "strength_level": "28", - "id": "3732", - "aggressive": "true", - "bonuses": "20,25,20,40,40,40,40,5,18,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "14", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "28", - "poison_immune": "true", - "safespot": null, - "lifepoints": "23", - "strength_level": "28", - "id": "3733", - "aggressive": "true", - "bonuses": "20,25,20,40,40,40,40,5,18,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "20", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "42", - "poison_immune": "true", - "safespot": null, - "lifepoints": "38", - "strength_level": "42", - "id": "3734", - "aggressive": "true", - "bonuses": "30,35,30,50,50,50,50,10,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "42" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "20", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "42", - "poison_immune": "true", - "safespot": null, - "lifepoints": "38", - "strength_level": "42", - "id": "3735", - "aggressive": "true", - "bonuses": "30,35,30,50,50,50,50,10,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "42" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "25", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "54", - "poison_immune": "true", - "safespot": null, - "lifepoints": "53", - "strength_level": "54", - "id": "3736", - "aggressive": "true", - "bonuses": "35,40,35,60,60,60,60,20,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "54" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "25", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "54", - "poison_immune": "true", - "safespot": null, - "lifepoints": "53", - "strength_level": "54", - "id": "3737", - "aggressive": "true", - "bonuses": "35,40,35,60,60,60,60,20,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "54" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "30", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "60", - "poison_immune": "true", - "safespot": null, - "lifepoints": "68", - "strength_level": "60", - "id": "3738", - "aggressive": "true", - "bonuses": "40,50,40,70,70,70,70,30,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "30", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "60", - "poison_immune": "true", - "safespot": null, - "lifepoints": "68", - "strength_level": "60", - "id": "3739", - "aggressive": "true", - "bonuses": "40,50,40,70,70,70,70,30,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "35", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "70", - "poison_immune": "true", - "safespot": null, - "lifepoints": "83", - "strength_level": "70", - "id": "3740", - "aggressive": "true", - "bonuses": "50,60,50,80,70,90,80,35,14,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "70" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "35", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "70", - "poison_immune": "true", - "safespot": null, - "lifepoints": "83", - "strength_level": "70", - "id": "3741", - "aggressive": "true", - "bonuses": "50,60,50,80,70,90,80,35,14,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "70" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "120", - "defence_animation": "3916", - "weakness": "7", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "15", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "3742", - "bonuses": "45,45,45,45,50,5,45,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "15" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "15", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "20", - "safespot": null, - "lifepoints": "38", - "strength_level": "40", - "id": "3743", - "bonuses": "45,45,45,45,50,5,55,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "20", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "30", - "safespot": null, - "lifepoints": "53", - "strength_level": "60", - "id": "3744", - "bonuses": "45,55,55,55,50,10,45,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "45", - "safespot": null, - "lifepoints": "53", - "strength_level": "75", - "id": "3745", - "bonuses": "60,60,60,60,80,10,45,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "45" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "60", - "safespot": null, - "lifepoints": "53", - "strength_level": "80", - "id": "3746", - "bonuses": "65,70,70,70,90,20,56,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "10", - "respawn_delay": "125", - "defence_animation": "3909", - "weakness": "6", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "20", - "safespot": null, - "lifepoints": "33", - "strength_level": "20", - "id": "3747", - "bonuses": "20,40,40,40,40,10,38,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "15", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "30", - "safespot": null, - "lifepoints": "50", - "strength_level": "30", - "id": "3748", - "bonuses": "30,60,60,60,60,15,38,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "20", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "40", - "safespot": null, - "lifepoints": "67", - "strength_level": "40", - "id": "3749", - "bonuses": "50,70,70,70,70,20,38,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "40" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "30", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "60", - "safespot": null, - "lifepoints": "101", - "strength_level": "60", - "id": "3750", - "bonuses": "60,100,100,100,100,30,25,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "25", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "50", - "safespot": null, - "lifepoints": "84", - "strength_level": "50", - "id": "3751", - "bonuses": "55,80,80,80,85,25,30,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "25", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "weakness": "5", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "25", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "3752", - "aggressive": "true", - "bonuses": "30,30,30,30,15,30,40,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "25", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "25", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "3753", - "aggressive": "true", - "bonuses": "30,30,30,30,15,30,40,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "40", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "40", - "safespot": null, - "lifepoints": "30", - "strength_level": "1", - "id": "3754", - "aggressive": "true", - "bonuses": "45,40,40,40,25,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "40", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "40", - "safespot": null, - "lifepoints": "30", - "strength_level": "1", - "id": "3755", - "aggressive": "true", - "bonuses": "45,40,40,40,25,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "50", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "50", - "safespot": null, - "lifepoints": "42", - "strength_level": "1", - "id": "3756", - "aggressive": "true", - "bonuses": "35,40,40,40,30,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "50", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "50", - "safespot": null, - "lifepoints": "42", - "strength_level": "1", - "id": "3757", - "aggressive": "true", - "bonuses": "35,40,40,40,30,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "60", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "60", - "safespot": null, - "lifepoints": "51", - "strength_level": "1", - "id": "3758", - "aggressive": "true", - "bonuses": "60,80,80,80,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "60", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "60", - "safespot": null, - "lifepoints": "51", - "strength_level": "1", - "id": "3759", - "aggressive": "true", - "bonuses": "60,80,80,80,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "70", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "70", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3760", - "aggressive": "true", - "bonuses": "40,100,100,100,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "70", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "70", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3761", - "aggressive": "true", - "bonuses": "40,100,100,100,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "30", - "respawn_delay": "120", - "defence_animation": "3921", - "weakness": "0", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "25", - "safespot": null, - "lifepoints": "27", - "strength_level": "1", - "id": "3762", - "aggressive": "true", - "bonuses": "20,40,40,40,40,40,40,40,0,0,0,0,0,0,0", - "range_level": "25", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "30", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "25", - "safespot": null, - "lifepoints": "27", - "strength_level": "1", - "id": "3763", - "aggressive": "true", - "bonuses": "20,40,40,40,40,40,40,40,0,0,0,0,0,0,0", - "range_level": "25", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "40", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "40", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "3764", - "aggressive": "true", - "bonuses": "30,50,60,60,60,60,40,40,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "40", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "40", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "3765", - "aggressive": "true", - "bonuses": "30,40,60,60,60,60,40,40,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "50", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "50", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3766", - "aggressive": "true", - "bonuses": "35,65,70,70,70,70,40,40,0,0,0,0,0,0,0", - "range_level": "50", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "50", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "50", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3767", - "aggressive": "true", - "bonuses": "35,65,70,70,70,70,40,40,0,0,0,0,0,0,0", - "range_level": "50", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "60", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "60", - "safespot": null, - "lifepoints": "78", - "strength_level": "1", - "id": "3768", - "aggressive": "true", - "bonuses": "40,90,80,80,80,80,40,40,0,0,0,0,0,0,0", - "range_level": "60", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "60", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "60", - "safespot": null, - "lifepoints": "78", - "strength_level": "1", - "id": "3769", - "aggressive": "true", - "bonuses": "40,90,80,80,80,80,40,40,0,0,0,0,0,0,0", - "range_level": "60", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "70", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "70", - "safespot": null, - "lifepoints": "97", - "strength_level": "1", - "id": "3770", - "aggressive": "true", - "bonuses": "50,100,100,100,120,100,40,40,80,0,0,0,0,0,0", - "range_level": "70", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "70", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "70", - "safespot": null, - "lifepoints": "97", - "strength_level": "1", - "id": "3771", - "aggressive": "true", - "bonuses": "50,100,100,100,120,100,40,40,80,0,0,0,0,0,0", - "range_level": "70", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "14", - "respawn_delay": "120", - "defence_animation": "3895", - "weakness": "9", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "28", - "safespot": null, - "lifepoints": "53", - "strength_level": "28", - "id": "3772", - "aggressive": "true", - "bonuses": "45,45,50,50,50,50,50,15,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "21", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "42", - "safespot": null, - "lifepoints": "83", - "strength_level": "42", - "id": "3773", - "aggressive": "true", - "bonuses": "45,45,60,50,50,50,50,15,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "42" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "32", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "56", - "safespot": null, - "lifepoints": "113", - "strength_level": "56", - "id": "3774", - "aggressive": "true", - "bonuses": "45,45,60,80,80,80,80,25,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "56" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "38", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "74", - "safespot": null, - "lifepoints": "143", - "strength_level": "74", - "id": "3775", - "aggressive": "true", - "bonuses": "45,45,60,60,60,60,60,20,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "74" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "45", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "88", - "safespot": null, - "lifepoints": "173", - "strength_level": "88", - "id": "3776", - "aggressive": "true", - "bonuses": "45,45,80,100,100,100,100,30,46,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "88" - }, { "examine": "Cheerful, helpful and optimistic, I'll bet.", "melee_animation": "0", @@ -102731,18 +96033,6 @@ "range_level": "1", "attack_level": "1" }, - { - "slayer_exp": "37", - "name": "Cockatrice", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4227", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "slayer_exp": "75", "name": "Basilisk", @@ -102754,29 +96044,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A denizen of the Abyss!", - "slayer_task": "1", - "melee_animation": "1537", - "range_animation": "1537", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "0", - "weakness": "1", - "slayer_exp": "150", - "magic_animation": "1537", - "death_animation": "1538", - "name": "Abyssal demon", - "defence_level": "135", - "safespot": null, - "lifepoints": "150", - "strength_level": "67", - "id": "4230", - "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "97" - }, { "name": "Demon butler", "defence_level": "1", @@ -103729,101 +96996,6 @@ "range_level": "1", "attack_level": "63" }, - { - "examine": "A horrible", - "slayer_task": "52", - "melee_animation": "4235", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "45", - "magic_animation": "0", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "48", - "safespot": null, - "lifepoints": "68", - "strength_level": "48", - "id": "4348", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "48" - }, - { - "melee_animation": "4234", - "respawn_delay": "60", - "defence_animation": "4232", - "slayer_exp": "45", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "1", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "4349", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A horrible", - "slayer_task": "52", - "melee_animation": "4235", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "45", - "magic_animation": "0", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "48", - "safespot": null, - "lifepoints": "68", - "strength_level": "48", - "id": "4350", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "48" - }, - { - "melee_animation": "4234", - "respawn_delay": "60", - "defence_animation": "4232", - "slayer_exp": "45", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "1", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "4351", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "4234", - "respawn_delay": "60", - "defence_animation": "4232", - "slayer_exp": "45", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "1", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "4352", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A horrible, emaciated ape like creature with beady red eyes.", "slayer_task": "17", @@ -104089,135 +97261,6 @@ "range_level": "1", "attack_level": "60" }, - { - "examine": "I don't think insect repellent will work…", - "slayer_task": "34", - "melee_animation": "1184", - "range_animation": "1184", - "attack_speed": "3", - "respawn_delay": "30", - "defence_animation": "1186", - "weakness": "0", - "slayer_exp": "25", - "magic_animation": "1184", - "death_animation": "1190", - "name": "Flesh Crawler", - "defence_level": "10", - "safespot": null, - "lifepoints": "25", - "strength_level": "2", - "id": "4389", - "aggressive": "true", - "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't think insect repellent will work…", - "melee_animation": "1184", - "range_animation": "1184", - "attack_speed": "3", - "respawn_delay": "30", - "defence_animation": "1186", - "slayer_exp": "25", - "magic_animation": "1184", - "death_animation": "1190", - "name": "Flesh Crawler", - "defence_level": "10", - "safespot": null, - "lifepoints": "25", - "strength_level": "2", - "id": "4390", - "aggressive": "true", - "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "80" - }, - { - "examine": "I don't think insect repellent will work…", - "melee_animation": "1184", - "range_animation": "1184", - "attack_speed": "3", - "respawn_delay": "30", - "defence_animation": "1186", - "slayer_exp": "25", - "magic_animation": "1184", - "death_animation": "1190", - "name": "Flesh Crawler", - "defence_level": "10", - "safespot": null, - "lifepoints": "25", - "strength_level": "2", - "id": "4391", - "aggressive": "true", - "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "100" - }, - { - "examine": "Examine not added", - "melee_animation": "5568", - "range_animation": "5568", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5567", - "slayer_exp": "30", - "magic_animation": "5568", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "25", - "safespot": null, - "lifepoints": "23", - "strength_level": "1", - "id": "4392", - "bonuses": "15,25,25,25,25,25,25,15,15,25,25,25,25,25,25", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "Examine not added", - "melee_animation": "5578", - "range_animation": "5578", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5579", - "slayer_exp": "30", - "magic_animation": "5578", - "death_animation": "5580", - "name": "Zombie", - "defence_level": "28", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "4393", - "aggressive": "true", - "bonuses": "15,25,28,28,25,28,28,15,15,28,25,25,25,25,25", - "range_level": "1", - "attack_level": "35" - }, - { - "examine": "Examine not added", - "melee_animation": "5578", - "range_animation": "5578", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5579", - "slayer_exp": "30", - "magic_animation": "5578", - "death_animation": "5580", - "name": "Zombie", - "defence_level": "48", - "safespot": null, - "lifepoints": "40", - "strength_level": "1", - "id": "4394", - "bonuses": "35,45,45,45,45,45,45,35,35,45,45,45,45,45,45", - "range_level": "1", - "attack_level": "47" - }, { "examine": "Overgrown vermin.", "slayer_task": "67", @@ -104356,48 +97399,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "An extremely vicious scorpion.", - "melee_animation": "6254", - "range_animation": "6254", - "combat_audio": "3611,3612,3610", - "attack_speed": "5", - "defence_animation": "6255", - "slayer_exp": "17", - "magic_animation": "6254", - "death_animation": "6256", - "name": "Scorpion", - "defence_level": "49", - "safespot": null, - "lifepoints": "55", - "strength_level": "51", - "id": "4402", - "aggressive": "true", - "bonuses": "12,23,10,51,32,62,29,54,48,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "An extremely vicious scorpion.", - "melee_animation": "6254", - "range_animation": "6254", - "combat_audio": "3611,3612,3610", - "attack_speed": "5", - "defence_animation": "6255", - "slayer_exp": "17", - "magic_animation": "6254", - "death_animation": "6256", - "name": "Scorpion", - "defence_level": "35", - "safespot": null, - "lifepoints": "37", - "strength_level": "31", - "id": "4403", - "aggressive": "true", - "bonuses": "15,16,12,32,19,38,18,34,32,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, { "examine": "Examine not added", "slayer_task": "58", @@ -104585,66 +97586,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Not man's best friend.", - "melee_animation": "6559", - "range_animation": "6559", - "combat_audio": "481,491,490", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "6557", - "slayer_exp": "15", - "magic_animation": "6559", - "death_animation": "6558", - "name": "Wolf", - "defence_level": "9", - "safespot": null, - "lifepoints": "15", - "strength_level": "1", - "id": "4413", - "bonuses": "7,7,7,7,7,7,7,7,7,7,7,7,7,7,7", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not man's best friend.", - "melee_animation": "6559", - "range_animation": "6559", - "combat_audio": "481,491,490", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "6557", - "slayer_exp": "10", - "magic_animation": "6559", - "death_animation": "6558", - "name": "Wolf", - "defence_level": "7", - "safespot": null, - "lifepoints": "69", - "strength_level": "1", - "id": "4414", - "bonuses": "5,5,5,5,5,5,5,5,5,5,5,5,5,5,5", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A popular dwarven delicacy.", - "melee_animation": "2705", - "range_animation": "2705", - "combat_audio": "3102,3104,3103", - "attack_speed": "5", - "defence_animation": "2706", - "magic_animation": "2705", - "death_animation": "2707", - "name": "Rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "2", - "strength_level": "1", - "id": "4415", - "range_level": "1", - "attack_level": "1" - }, { "melee_animation": "4300", "attack_speed": "5", @@ -104693,22 +97634,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Half horse", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Centaur", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4439", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A noble creature!", "melee_animation": "6376", @@ -105211,22 +98136,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "He knows the past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Ethereal Guide", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4506", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Luck is probably on his side.", "melee_animation": "0", @@ -105462,47 +98371,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "85", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "85", - "strength_level": "30", - "id": "4534", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Either a very fremennikey pirate", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Lokar Searunner", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4537", - "range_level": "1", - "attack_level": "1" - }, { "examine": "I always wondered what that job description actually meant...", "melee_animation": "0", @@ -106114,23 +98982,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "What is that thing!", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "6", - "magic_animation": "0", - "death_animation": "0", - "name": "Evil creature", - "defence_level": "1", - "safespot": null, - "lifepoints": "0", - "strength_level": "1", - "id": "4615", - "range_level": "1", - "attack_level": "1" - }, { "name": "Goblin", "defence_level": "1", @@ -106271,151 +99122,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "King Healthorg riding his War Tortoise.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Healthorg and tortoise", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4643", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A weasly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Glouphrie the Untrusted", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4645", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "With the prices he charges", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Stan", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4650", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Looks very stylish", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4651", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "That suit looks a little briny around the edges.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4652", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "First storm he is in that hat will blow away.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4653", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "She'll never be able to climb rigging in that.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4654", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "High heels on a ship? What is she thinking?", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4655", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The effect is sort of spoiled by all those tattoos.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "movement_radius": "710", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4656", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He works evil magic.", "start_gfx": "93", @@ -106485,32 +99191,6 @@ "projectile": "98", "attack_level": "1" }, - { - "name": "Baby red dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "4667", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Baby red dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "4668", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "examine": "He's got icicles in his beard.", "slayer_task": "47", @@ -106586,160 +99266,6 @@ "range_level": "1", "attack_level": "40" }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "4688", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4698", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4699", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4700", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4701", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "85", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "85", - "strength_level": "30", - "id": "4706", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, { "examine": "A flea-infested black market trader.", "melee_animation": "0", @@ -108469,22 +100995,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yauchomi, follower of Saradomin.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Prayer Tutor", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4903", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Feoras looks a bit fiery.", "melee_animation": "0", @@ -108549,22 +101059,6 @@ "range_level": "1", "attack_level": "1" }, - { - "melee_animation": "4868", - "attack_speed": "7", - "respawn_delay": "60", - "defence_animation": "4869", - "death_animation": "4870", - "name": "Earth elemental", - "defence_level": "1", - "safespot": null, - "lifepoints": "35", - "strength_level": "1", - "id": "4910", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An elemental rock.", "melee_animation": "0", @@ -110586,32 +103080,6 @@ "range_level": "58", "attack_level": "58" }, - { - "combat_style": "2", - "name": "Ogre shaman", - "defence_level": "1", - "safespot": null, - "lifepoints": "1", - "strength_level": "1", - "id": "5190", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "combat_style": "2", - "name": "Ogre shaman", - "defence_level": "1", - "safespot": null, - "lifepoints": "1", - "strength_level": "1", - "id": "5193", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "examine": "A wizard.", "melee_animation": "0", @@ -110682,38 +103150,6 @@ "range_level": "80", "attack_level": "80" }, - { - "combat_style": "1", - "melee_animation": "5395", - "respawn_delay": "60", - "defence_animation": "5396", - "death_animation": "5937", - "name": "Penance Ranger", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "5229", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "combat_style": "1", - "melee_animation": "5395", - "respawn_delay": "60", - "defence_animation": "5396", - "death_animation": "5937", - "name": "Penance Ranger", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "5237", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Run away! Run away!", "melee_animation": "5411", @@ -110766,28 +103202,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Part scarab", - "slayer_task": "70", - "combat_style": "2", - "melee_animation": "7615", - "range_animation": "0", - "magic_level": "54", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "7616", - "name": "Scarab mage", - "defence_level": "54", - "safespot": null, - "lifepoints": "77", - "strength_level": "40", - "id": "5250", - "aggressive": "true", - "range_level": "1", - "attack_level": "40" - }, { "examine": "A mounted lancer.", "slayer_task": "70", @@ -110846,22 +103260,6 @@ "range_level": "62", "attack_level": "62" }, - { - "combat_style": "2", - "melee_animation": "7615", - "respawn_delay": "60", - "defence_animation": "7617", - "death_animation": "7616", - "name": "Scarab mage", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "5254", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He can look after my money.", "melee_animation": "0", @@ -110961,307 +103359,6 @@ "range_level": "80", "attack_level": "80" }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5293", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5294", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5295", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5296", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5297", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5298", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5299", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5300", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5301", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5302", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5303", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5304", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Examine not added", - "melee_animation": "5568", - "range_animation": "5568", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5567", - "slayer_exp": "30", - "magic_animation": "5568", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "10", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "5305", - "bonuses": "6,15,15,15,15,15,15,6,6,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "11" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5306", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Examine not added", - "melee_animation": "5568", - "range_animation": "5568", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5567", - "slayer_exp": "30", - "magic_animation": "5568", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "10", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "5307", - "bonuses": "6,15,15,15,15,15,15,6,6,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "11" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "24", - "strength_level": "1", - "id": "5308", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Examine not added", - "melee_animation": "5571", - "range_animation": "5571", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5574", - "slayer_exp": "30", - "magic_animation": "5571", - "death_animation": "5575", - "name": "Zombie", - "defence_level": "16", - "safespot": null, - "lifepoints": "40", - "strength_level": "1", - "id": "5309", - "bonuses": "10,15,16,16,15,16,16,10,10,16,15,15,15,15,15", - "range_level": "1", - "attack_level": "15" - }, { "melee_animation": "5568", "combat_audio": "931,923,922", @@ -111793,30 +103890,6 @@ "range_level": "1", "attack_level": "60" }, - { - "examine": "A fiendish embodiment of water.", - "slayer_task": "90", - "combat_style": "1", - "melee_animation": "1582", - "range_animation": "1582", - "attack_speed": "6", - "magic_level": "77", - "defence_animation": "1581", - "weakness": "4", - "magic_animation": "1582", - "death_animation": "1580", - "name": "Waterfiend", - "defence_level": "50", - "poison_immune": "true", - "safespot": null, - "lifepoints": "128", - "strength_level": "167", - "id": "5361", - "aggressive": "true", - "range_level": "167", - "projectile": "16", - "attack_level": "70" - }, { "examine": "It appears to be intelligent and savage.", "slayer_task": "41", @@ -113135,24 +105208,6 @@ "projectile": "276", "attack_level": "80" }, - { - "examine": "A hairy, smelly, grazing animal.", - "melee_animation": "5782", - "range_animation": "5782", - "attack_speed": "5", - "defence_animation": "5783", - "weakness": "7", - "magic_animation": "5782", - "death_animation": "5784", - "name": "Yak", - "defence_level": "30", - "safespot": null, - "lifepoints": "50", - "strength_level": "7", - "id": "5529", - "range_level": "1", - "attack_level": "3" - }, { "examine": "Antisocial.", "melee_animation": "0", @@ -115799,23 +107854,6 @@ "range_level": "1", "attack_level": "20" }, - { - "examine": "A greasy", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "5910", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He's suspiciously talented with a meat-cleaver.", "melee_animation": "0", @@ -117209,20 +109247,6 @@ "attack_level": "1", "defence_animation": "425" }, - { - "death_animation": "836", - "name": "Yadviga", - "defence_level": "1", - "safespot": null, - "lifepoints": "60", - "melee_animation": "422", - "strength_level": "1", - "id": "6041", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, { "death_animation": "836", "name": "Nikita", @@ -117374,43 +109398,6 @@ "range_level": "1", "attack_level": "20" }, - { - "melee_animation": "6559", - "respawn_delay": "60", - "defence_animation": "6557", - "death_animation": "6558", - "name": "Ice wolf", - "defence_level": "1", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "6052", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Dragon impling", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6054", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Dragon impling", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6064", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She tends the wheat.", "melee_animation": "0", @@ -117710,67 +109697,6 @@ "range_level": "1", "attack_level": "38" }, - { - "death_animation": "6791", - "name": "Mounted terrorbird gnome", - "defence_level": "1", - "safespot": null, - "lifepoints": "55", - "melee_animation": "6790", - "strength_level": "1", - "id": "6110", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "6792" - }, - { - "death_animation": "6791", - "name": "Mounted terrorbird gnome", - "defence_level": "1", - "safespot": null, - "lifepoints": "55", - "melee_animation": "6790", - "strength_level": "1", - "id": "6111", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "6792" - }, - { - "examine": "Aww", - "slayer_task": "7", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Ducklings", - "defence_level": "1", - "water_npc": "true", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "6112", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "death_animation": "750", - "name": "Duck", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "melee_animation": "747", - "strength_level": "1", - "id": "6113", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "3268" - }, { "examine": "A messy bird.", "slayer_task": "7", @@ -118059,186 +109985,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "50", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6142", - "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "25", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6143", - "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "50", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6144", - "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "50", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6145", - "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6146", - "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "15", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6147", - "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6148", - "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6149", - "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "70", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6150", - "bonuses": "150,150,150,75,75,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6151", - "bonuses": "150,150,150,150,37,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "70", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6152", - "bonuses": "150,150,75,150,75,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "70", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6153", - "bonuses": "75,75,150,150,75,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, { "examine": "The Void Knight will soon weaken the shield.", "attack_speed": "5", @@ -118632,49 +110378,6 @@ "range_level": "1", "attack_level": "44" }, - { - "examine": "The tongue of evil.", - "melee_animation": "9130", - "range_animation": "1552", - "attack_speed": "4", - "respawn_delay": "60", - "defence_animation": "9132", - "slayer_exp": "120", - "magic_animation": "1552", - "death_animation": "9131", - "name": "Bloodveld", - "defence_level": "30", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "6215", - "aggressive": "true", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "1582", - "range_animation": "1582", - "respawn_delay": "25", - "defence_animation": "1581", - "weakness": "7", - "magic_animation": "1582", - "death_animation": "1580", - "name": "Pyrefiend", - "defence_level": "25", - "safespot": null, - "lifepoints": "48", - "strength_level": "25", - "id": "6216", - "aggressive": "true", - "bonuses": "25,25,20,40,40,40,15,30,20,60,20,0,0,0,0", - "clue_level": "1", - "range_level": "1", - "attack_level": "25" - }, { "examine": "A small ice demon.", "melee_animation": "8080", @@ -119326,30 +111029,6 @@ "attack_level": "1", "prj_height": "92" }, - { - "agg_radius": "64", - "examine": "The bane of darkness.", - "melee_animation": "6376", - "range_animation": "6376", - "magic_level": "125", - "respawn_delay": "50", - "defence_animation": "6375", - "weakness": "7", - "slayer_exp": "0", - "magic_animation": "6376", - "death_animation": "6377", - "name": "Starlight", - "defence_level": "120", - "poison_immune": "true", - "safespot": null, - "lifepoints": "160", - "strength_level": "125", - "id": "6248", - "aggressive": "true", - "bonuses": "60,60,60,0,0,12,14,13,5,13,0,10,0,0,0", - "range_level": "1", - "attack_level": "120" - }, { "name": "", "defence_level": "1", @@ -119361,34 +111040,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Defender of the faithful.", - "start_gfx": "1184", - "combat_style": "2", - "melee_animation": "7019", - "attack_speed": "5", - "respawn_delay": "50", - "slayer_exp": "0", - "magic_animation": "7019", - "death_animation": "7016", - "lifepoints": "146", - "id": "6250", - "aggressive": "true", - "bonuses": "10,10,10,0,0,12,14,14,18,5,0,7,0,0,0", - "prj_height": "0", - "agg_radius": "64", - "range_animation": "7019", - "magic_level": "150", - "end_gfx": "1186", - "defence_animation": "7017", - "name": "Growler", - "defence_level": "120", - "safespot": null, - "strength_level": "101", - "range_level": "1", - "projectile": "1185", - "attack_level": "100" - }, { "name": "", "defence_level": "1", @@ -121177,28 +112828,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Flies like a rock.", - "melee_animation": "9454", - "range_animation": "1516", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9455", - "slayer_exp": "105", - "magic_animation": "1516", - "death_animation": "1518", - "name": "Gargoyle", - "defence_level": "107", - "safespot": null, - "lifepoints": "105", - "strength_level": "95", - "id": "6389", - "aggressive": "true", - "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, { "name": "Goblin", "defence_level": "1", @@ -122879,25 +114508,6 @@ "range_level": "1", "attack_level": "55" }, - { - "examine": "A giant", - "melee_animation": "7586", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "7581", - "name": "Scabaras locust", - "defence_level": "55", - "safespot": null, - "lifepoints": "78", - "strength_level": "41", - "id": "6776", - "aggressive": "true", - "range_level": "55", - "attack_level": "41" - }, { "examine": "Bouncy", "slayer_task": "70", @@ -122941,61 +114551,6 @@ "projectile": "11", "attack_level": "41" }, - { - "melee_animation": "7588", - "attack_speed": "6", - "respawn_delay": "60", - "defence_animation": "7590", - "slayer_exp": "62", - "death_animation": "7591", - "name": "Crocodile", - "defence_level": "1", - "safespot": null, - "lifepoints": "72", - "strength_level": "1", - "id": "6779", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Part scarab", - "slayer_task": "70", - "combat_style": "2", - "melee_animation": "7615", - "range_animation": "0", - "magic_level": "55", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "4", - "magic_animation": "0", - "death_animation": "7616", - "name": "Scabaras mage", - "defence_level": "55", - "safespot": null, - "lifepoints": "78", - "strength_level": "41", - "id": "6780", - "aggressive": "true", - "range_level": "1", - "attack_level": "41" - }, - { - "combat_style": "2", - "melee_animation": "7620", - "respawn_delay": "60", - "defence_animation": "7617", - "death_animation": "7616", - "name": "Scabaras mage", - "defence_level": "1", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "6781", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An animated clay statue.", "melee_animation": "0", @@ -124708,17 +116263,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6901", - "range_level": "1", - "attack_level": "1" - }, { "name": "Hatchling dragon", "defence_level": "1", @@ -124730,17 +116274,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6903", - "range_level": "1", - "attack_level": "1" - }, { "name": "Hatchling dragon", "defence_level": "1", @@ -124752,17 +116285,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6905", - "range_level": "1", - "attack_level": "1" - }, { "name": "Hatchling dragon", "defence_level": "1", @@ -124774,17 +116296,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6907", - "range_level": "1", - "attack_level": "1" - }, { "examine": "It's so adorably tiny!", "melee_animation": "0", @@ -124945,54 +116456,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "7003", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "7004", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, { "examine": "Must be the pack leader.", "slayer_task": "92", @@ -125214,46 +116677,6 @@ "range_level": "1", "attack_level": "48" }, - { - "examine": "Irascible", - "slayer_task": "64", - "melee_animation": "8636", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "6", - "magic_animation": "0", - "death_animation": "8640", - "name": "Ogress warrior", - "defence_level": "45", - "safespot": null, - "lifepoints": "64", - "strength_level": "45", - "id": "7079", - "aggressive": "true", - "range_level": "1", - "attack_level": "45" - }, - { - "examine": "Irascible", - "slayer_task": "64", - "melee_animation": "8637", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "6", - "magic_animation": "0", - "death_animation": "8641", - "name": "Ogress warrior", - "defence_level": "45", - "safespot": null, - "lifepoints": "64", - "strength_level": "45", - "id": "7080", - "aggressive": "true", - "range_level": "1", - "attack_level": "45" - }, { "examine": "A large and contentious lady ogre.", "slayer_task": "64", @@ -125451,38 +116874,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "The head farmer", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Farmer Blinkin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7131", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Owner of this homestead.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mrs. Winkin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7132", - "range_level": "1", - "attack_level": "1" - }, { "agg_radius": "64", "examine": "That's one big Ork... ", @@ -125534,94 +116925,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2359", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2360", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2361", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2362", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, { "examine": "A Mourner showing his true identity.", "melee_animation": "0", @@ -125768,26 +117071,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs... especially really big ones!", - "melee_animation": "2368", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "68", - "safespot": null, - "lifepoints": "97", - "strength_level": "68", - "id": "2452", - "aggressive": "true", - "range_level": "1", - "attack_level": "68" - }, { "examine": "Heavy rock!", "melee_animation": "0", @@ -125867,167 +117150,6 @@ "projectile": "294", "attack_level": "90" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "5", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "20", - "safespot": null, - "lifepoints": "19", - "strength_level": "5", - "id": "2463", - "aggressive": "true", - "bonuses": "25,85,105,75,103,85,65,0,0,0,0,0,0,0,0", - "range_level": "5", - "projectile": "337", - "attack_level": "5" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "10", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "40", - "safespot": null, - "lifepoints": "40", - "strength_level": "10", - "id": "2464", - "aggressive": "true", - "bonuses": "35,105,125,95,128,105,85,0,0,0,0,0,0,0,0", - "range_level": "10", - "projectile": "337", - "attack_level": "10" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "15", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "50", - "safespot": null, - "lifepoints": "60", - "strength_level": "15", - "id": "2465", - "aggressive": "true", - "bonuses": "35,185,185,155,188,125,165,0,0,0,0,0,0,0,0", - "range_level": "15", - "projectile": "337", - "attack_level": "15" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "25", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "60", - "safespot": null, - "lifepoints": "80", - "strength_level": "45", - "id": "2466", - "aggressive": "true", - "bonuses": "45,235,235,205,238,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "35", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "70", - "safespot": null, - "lifepoints": "105", - "strength_level": "45", - "id": "2467", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "45", - "respawn_delay": "25", - "defence_animation": "2300", - "weakness": "9", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "90", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "2468", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, { "examine": "A Retired Highwayman", "combat_style": "1", @@ -126821,132 +117943,6 @@ "projectile": "442", "attack_level": "70" }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2610", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2611", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2612", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2613", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2614", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2615", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2616", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, { "name": "Tz-Kih", "defence_level": "1", @@ -127300,22 +118296,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A strange man with a strange name. Probably a strange past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Longbow Ben", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2691", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She quackers.", "slayer_task": "7", @@ -127700,22 +118680,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A wise barbarian", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Otto Godblessed", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2725", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Holy looking.", "melee_animation": "0", @@ -128028,29 +118992,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "From a darker dimension.", - "slayer_task": "25", - "melee_animation": "2731", - "range_animation": "2731", - "attack_speed": "4", - "magic_level": "160", - "defence_animation": "2732", - "weakness": "4", - "slayer_exp": "225", - "magic_animation": "2731", - "death_animation": "2733", - "name": "Dark beast", - "defence_level": "120", - "safespot": null, - "lifepoints": "220", - "strength_level": "160", - "id": "2783", - "aggressive": "true", - "bonuses": "0,0,0,0,0,30,40,100,90,100,0,0,0,0,0", - "range_level": "1", - "attack_level": "140" - }, { "examine": "Digging.", "melee_animation": "0", @@ -129301,44 +120242,6 @@ "range_level": "255", "attack_level": "255" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "1312", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "1313", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "240", - "strength_level": "1", - "id": "2885", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "name": "Boulder", "defence_level": "1", @@ -129387,25 +120290,6 @@ "projectile": "288", "attack_level": "1" }, - { - "examine": "It wasn't a rock... It was a rock lobster!", - "melee_animation": "2860", - "range_animation": "2860", - "attack_speed": "2", - "defence_animation": "2861", - "weakness": "7", - "magic_animation": "2860", - "death_animation": "2862", - "name": "Rock lobster", - "defence_level": "100", - "safespot": null, - "lifepoints": "150", - "strength_level": "100", - "id": "2889", - "bonuses": "0,0,0,0,0,100,100,50,50,150,0,0,0,0,0", - "range_level": "1", - "attack_level": "100" - }, { "agg_radius": "12", "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", @@ -129514,22 +120398,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Lovely", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Bones", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2945", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Obviously punches above his weight.", "melee_animation": "0", @@ -129791,68 +120659,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "King rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "2982", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not a soft touch.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pusskins", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2984", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A not-so friendly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Captain Tom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2986", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fully grown feline.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mittens", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2988", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Cute and fluffy.", "melee_animation": "0", @@ -131907,50 +122713,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7438", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7439", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7440", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7441", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He holds up passers by.", "melee_animation": "386", @@ -132739,22 +123501,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Looks after your Farming tools.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Brawler", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7559", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Looks after your Farming tools.", "melee_animation": "0", @@ -132990,54 +123736,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A penguin pushing paper", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Torcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7585", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A penguin pushing paper", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Torcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7586", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He's a little rough around the edges.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shifter", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7593", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He has unbelievable strength!", "melee_animation": "0", @@ -134622,24 +125320,6 @@ "id": "5515", "defence_animation": "404" }, - { - "examine": "Servant of the Duke of Lumbridge.", - "melee_animation": "422", - "range_animation": "422", - "attack_speed": "4", - "magic_level": "22", - "defence_animation": "404", - "magic_animation": "422", - "death_animation": "9055", - "name": "Hans", - "defence_level": "14", - "safespot": "0", - "lifepoints": "12", - "strength_level": "17", - "id": "0", - "range_level": "1", - "attack_level": "17" - }, { "examine": "He grows the crops in this area.", "melee_animation": "422", @@ -134698,38 +125378,6 @@ "range_level": "1", "attack_level": "13" }, - { - "examine": "She looks happy.", - "melee_animation": "0", - "range_animation": "1142", - "defence_animation": "285", - "magic_animation": "0", - "death_animation": "287", - "name": "Schoolgirl", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "10", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A man down on his luck.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Tramp", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "11", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Not very civilised looking.", "name": "Barbarian", @@ -135055,26 +125703,6 @@ "range_level": "1", "attack_level": "31" }, - { - "examine": "A soldier of the town of Yanille.", - "melee_animation": "390", - "range_animation": "0", - "combat_audio": "511,513,512", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Soldier", - "defence_level": "26", - "safespot": null, - "lifepoints": "22", - "strength_level": "25", - "id": "35", - "range_level": "1", - "attack_level": "26" - }, { "examine": "The head gardener.", "melee_animation": "0", @@ -135159,27 +125787,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "slayer_task": "7", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "weakness": "9", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "41", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Freshly sheared.", "melee_animation": "0", @@ -135304,23 +125911,6 @@ "range_level": "1", "attack_level": "40" }, - { - "examine": "A dragon covered in frost and ice.", - "combat_audio": "408,410,409", - "magic_level": "116", - "respawn_delay": "25", - "weakness": "0", - "name": "Baby dragon", - "defence_level": "112", - "safespot": null, - "lifepoints": "160", - "strength_level": "103", - "id": "51", - "aggressive": "true", - "bonuses": "124,130,137,184,176,128,168,145,104,54,0,0,0,0,0", - "range_level": "80", - "attack_level": "102" - }, { "examine": "A wood nymph.", "melee_animation": "0", @@ -135398,27 +125988,6 @@ "range_level": "1", "attack_level": "20" }, - { - "examine": "Incey wincey.", - "slayer_task": "76", - "melee_animation": "6249", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "2", - "magic_animation": "0", - "death_animation": "6251", - "name": "Spider", - "defence_level": "1", - "safespot": null, - "lifepoints": "1", - "strength_level": "1", - "id": "61", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A barely visible deadly jungle spider.", "slayer_task": "76", @@ -135735,32 +126304,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "4", - "magic_level": "1", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "81", - "safespot": null, - "lifepoints": "89", - "strength_level": "78", - "id": "83", - "aggressive": "true", - "bonuses": "0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "76" - }, { "examine": "A creature made from clay.", "melee_animation": "422", @@ -136048,262 +126591,6 @@ "range_level": "1", "attack_level": "35" }, - { - "examine": "An ugly green creature.", - "melee_animation": "6185", - "range_animation": "6185", - "combat_audio": "469,472,471", - "attack_speed": "4", - "defence_animation": "6183", - "slayer_exp": "5", - "magic_animation": "6185", - "death_animation": "6182", - "name": "Goblin", - "defence_level": "1", - "safespot": null, - "lifepoints": "5", - "strength_level": "1", - "id": "100", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "An ugly green creature.", - "melee_animation": "6185", - "range_animation": "6185", - "combat_audio": "469,472,471", - "attack_speed": "5", - "defence_animation": "6183", - "slayer_exp": "5", - "magic_animation": "6185", - "death_animation": "6182", - "name": "Goblin", - "defence_level": "3", - "safespot": null, - "lifepoints": "10", - "strength_level": "2", - "id": "101", - "clue_level": "0", - "range_level": "1", - "attack_level": "3" - }, - { - "examine": "An ugly green creature.", - "melee_animation": "6185", - "range_animation": "6185", - "combat_audio": "469,472,471", - "attack_speed": "5", - "defence_animation": "6183", - "slayer_exp": "16", - "magic_animation": "6185", - "death_animation": "6182", - "name": "Goblin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "2", - "id": "102", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Eek! A bear!", - "slayer_task": "6", - "melee_animation": "4925", - "range_animation": "0", - "combat_audio": "498,500,499", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "27", - "magic_animation": "0", - "death_animation": "4929", - "name": "Grizzly bear", - "defence_level": "23", - "safespot": null, - "lifepoints": "32", - "strength_level": "23", - "id": "105", - "aggressive": "true", - "range_level": "1", - "attack_level": "23" - }, - { - "examine": "Eek! A bear!", - "slayer_task": "6", - "melee_animation": "4925", - "range_animation": "0", - "combat_audio": "498,500,499", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "25", - "magic_animation": "0", - "death_animation": "4929", - "name": "Black bear", - "defence_level": "17", - "safespot": null, - "lifepoints": "24", - "strength_level": "17", - "id": "106", - "range_level": "1", - "attack_level": "17" - }, - { - "melee_animation": "6254", - "combat_audio": "3611,3612,3610", - "respawn_delay": "60", - "defence_animation": "6255", - "slayer_exp": "17", - "death_animation": "6256", - "name": "Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "17", - "strength_level": "1", - "id": "107", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Tiny", - "slayer_task": "71", - "melee_animation": "6254", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "respawn_delay": "60", - "defence_animation": "6255", - "weakness": "0", - "magic_animation": "0", - "death_animation": "6256", - "name": "Pit Scorpion", - "defence_level": "40", - "safespot": null, - "lifepoints": "57", - "strength_level": "1", - "id": "109", - "aggressive": "true", - "range_level": "40", - "attack_level": "1" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "110", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "He's got icicles in his beard.", - "slayer_task": "47", - "melee_animation": "4672", - "range_animation": "0", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "70", - "magic_animation": "0", - "death_animation": "4673", - "name": "Ice giant", - "defence_level": "40", - "safespot": null, - "lifepoints": "70", - "strength_level": "40", - "id": "111", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "40" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "112", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "An aggressive humanoid.", - "melee_animation": "128", - "range_animation": "128", - "attack_speed": "5", - "defence_animation": "129", - "magic_animation": "128", - "death_animation": "131", - "name": "Jogre", - "defence_level": "41", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "113", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "41" - }, - { - "examine": "Big, ugly, and smelly.", - "melee_animation": "359", - "range_animation": "359", - "attack_speed": "6", - "magic_level": "27", - "respawn_delay": "25", - "defence_animation": "360", - "magic_animation": "359", - "death_animation": "361", - "name": "Mogre", - "defence_level": "27", - "safespot": null, - "lifepoints": "60", - "strength_level": "27", - "id": "114", - "aggressive": "true", - "bonuses": "15,15,10,20,40,15,50,50,50,20,50,58,0,0,0", - "range_level": "27", - "attack_level": "27" - }, { "examine": "A large dim looking humanoid.", "melee_animation": "359", @@ -136643,29 +126930,6 @@ "range_level": "1", "attack_level": "63" }, - { - "examine": "Wow! Scorpions shouldn't grow that big.", - "slayer_task": "71", - "melee_animation": "6254", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "17", - "magic_animation": "0", - "death_animation": "6256", - "name": "King Scorpion", - "defence_level": "28", - "safespot": null, - "lifepoints": "40", - "strength_level": "21", - "id": "144", - "aggressive": "true", - "range_level": "28", - "attack_level": "21" - }, { "examine": "A cold-hearted elemental warrior.", "slayer_task": "48", @@ -137107,6 +127371,7 @@ "safespot": null, "lifepoints": "10", "strength_level": "7", + "aggressive": "false", "id": "187", "range_level": "1", "attack_level": "7" @@ -137276,48 +127541,6 @@ "range_level": "1", "attack_level": "28" }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "1595", - "range_animation": "1595", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "1596", - "weakness": "7", - "magic_animation": "1595", - "death_animation": "1597", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1631", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "1595", - "range_animation": "1595", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "1596", - "weakness": "7", - "magic_animation": "1595", - "death_animation": "1597", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1632", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, { "examine": "Has a fearsome posture.", "melee_animation": "390", @@ -137391,7 +127614,7 @@ "lifepoints": "17", "strength_level": "12", "id": "206", - "aggressive": "true", + "aggressive": "false", "clue_level": "1", "range_level": "1", "attack_level": "12" @@ -137805,25 +128028,6 @@ "range_level": "1", "attack_level": "46" }, - { - "examine": "A large", - "melee_animation": "6254", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "6256", - "name": "Khazard Scorpion", - "defence_level": "36", - "safespot": null, - "lifepoints": "51", - "strength_level": "27", - "id": "271", - "aggressive": "true", - "range_level": "36", - "attack_level": "27" - }, { "examine": "A guard who has devoted their life to Armadyl.", "range_animation": "0", @@ -138007,25 +128211,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "288", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An official of Ardougne.", "melee_animation": "0", @@ -138320,40 +128505,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A mourner", - "melee_animation": "414", - "range_animation": "0", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Mourner", - "defence_level": "24", - "safespot": null, - "lifepoints": "34", - "strength_level": "24", - "id": "347", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A mourner", - "melee_animation": "422", - "range_animation": "0", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Mourner", - "defence_level": "24", - "safespot": null, - "lifepoints": "34", - "strength_level": "24", - "id": "348", - "range_level": "1", - "attack_level": "24" - }, { "examine": "A child of West Ardougne.", "melee_animation": "0", @@ -138402,17 +128553,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Paladin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "365", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Smells very chemically...", "melee_animation": "0", @@ -138503,23 +128643,6 @@ "range_level": "27", "attack_level": "27" }, - { - "examine": "A pirate.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "498,500,499", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Redbeard Frank", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "375", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Inspects people's packages.", "melee_animation": "0", @@ -138569,47 +128692,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Looks vicious!", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Kharid Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "385", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Looks vicious!", - "name": "Kharid Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "3611,3612,3610", - "strength_level": "1", - "id": "386", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Looks vicious!", - "name": "Kharid Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "3611,3612,3610", - "strength_level": "1", - "id": "387", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Could do with a shave...", "melee_animation": "0", @@ -138643,22 +128725,6 @@ "range_level": "1", "attack_level": "3" }, - { - "examine": "A brightly coloured game bird.", - "melee_animation": "2371", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "2373", - "name": "River troll", - "defence_level": "3", - "safespot": null, - "lifepoints": "50", - "strength_level": "3", - "id": "392", - "range_level": "1", - "attack_level": "3" - }, { "examine": "Beefy.", "slayer_task": "20", @@ -139764,22 +129830,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Likes you more", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shop assistant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "525", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A product of a consumerist society.", "melee_animation": "0", @@ -139796,22 +129846,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Likes you more", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shop assistant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "527", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Has an interesting assortment of items for sale.", "melee_animation": "0", @@ -139925,22 +129959,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Ironically", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shopkeeper", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "551", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Helps the shopkeeper sell swords.", "melee_animation": "0", @@ -141061,18 +131079,6 @@ "range_level": "1", "attack_level": "1" }, - { - "slayer_exp": "0", - "examine": "It's an NPC.", - "name": "Edmond", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "714", - "range_level": "1", - "attack_level": "1" - }, { "examine": "In charge of people with silly outfits.", "melee_animation": "0", @@ -141903,24 +131909,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Tough-looking.", - "slayer_task": "64", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Ogre chieftain", - "defence_level": "58", - "safespot": null, - "lifepoints": "331", - "strength_level": "58", - "id": "852", - "range_level": "1", - "attack_level": "58" - }, { "name": "Gorad", "defence_level": "1", @@ -142490,25 +132478,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "951", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A holy man.", "melee_animation": "0", @@ -142868,1156 +132837,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "One of the guardians of Iban.", - "melee_animation": "64", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "65", - "death_animation": "67", - "name": "Holthion", - "defence_level": "1", - "safespot": null, - "lifepoints": "90", - "strength_level": "1", - "id": "1000", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A user of dark magic.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "0", - "name": "Dark mage", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1001", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A dark magic user.", - "melee_animation": "422", - "range_animation": "0", - "magic_level": "32", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "836", - "name": "Disciple of Iban", - "defence_level": "32", - "safespot": null, - "lifepoints": "45", - "strength_level": "24", - "id": "1002", - "range_level": "1", - "attack_level": "24" - }, - { - "melee_animation": "6249", - "respawn_delay": "60", - "defence_animation": "6250", - "death_animation": "6251", - "name": "Spider", - "defence_level": "1", - "safespot": null, - "lifepoints": "2", - "strength_level": "1", - "id": "1004", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A servant of Zamorak.", - "combat_style": "2", - "melee_animation": "811", - "range_animation": "0", - "attack_speed": "5", - "magic_level": "60", - "spell_id": "43", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "811", - "death_animation": "836", - "name": "Zamorak wizard", - "defence_level": "50", - "safespot": null, - "lifepoints": "73", - "strength_level": "50", - "id": "1007", - "aggressive": "true", - "range_level": "50", - "attack_level": "50" - }, - { - "examine": "A green skinned croaker", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Swamp toad", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1013", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Useful for hitting rocks.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "death_animation": "0", - "name": "Iron pickaxe", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1015", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "slayer_task": "7", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "weakness": "9", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "1017", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He rules the", - "slayer_task": "7", - "melee_animation": "5387", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "5389", - "name": "Rooster", - "defence_level": "2", - "safespot": null, - "lifepoints": "2", - "strength_level": "2", - "id": "1018", - "range_level": "1", - "attack_level": "2" - }, - { - "examine": "A fire elemental.", - "melee_animation": "1029", - "range_animation": "0", - "magic_level": "32", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "1031", - "name": "Fire elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "24", - "id": "1019", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "An earth elemental.", - "melee_animation": "4868", - "range_animation": "0", - "attack_speed": "7", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "death_animation": "4870", - "name": "Earth elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "32", - "id": "1020", - "aggressive": "true", - "range_level": "1", - "attack_level": "32" - }, - { - "examine": "An air elemental.", - "melee_animation": "1040", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "1", - "magic_animation": "0", - "death_animation": "1041", - "name": "Air elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "24", - "id": "1021", - "range_level": "32", - "attack_level": "24" - }, - { - "examine": "A water elemental.", - "melee_animation": "1044", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "1", - "magic_animation": "0", - "death_animation": "1048", - "name": "Water elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "24", - "id": "1022", - "range_level": "32", - "attack_level": "24" - }, - { - "examine": "Could his name be 'Lurch'?", - "melee_animation": "7183", - "slayer_exp": "50", - "death_animation": "7185", - "name": "Vampire", - "defence_level": "52", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "1023", - "clue_level": "1", - "range_level": "1", - "attack_level": "52" - }, - { - "examine": "An evil human cleric.", - "start_gfx": "99", - "combat_style": "2", - "combat_audio": "511,513,512", - "melee_animation": "422", - "range_animation": "0", - "attack_speed": "4", - "magic_level": "25", - "end_gfx": "101", - "respawn_delay": "60", - "defence_animation": "404", - "weakness": "3", - "magic_animation": "711", - "death_animation": "836", - "name": "Monk of Zamorak", - "defence_level": "22", - "safespot": null, - "lifepoints": "20", - "strength_level": "18", - "id": "1044", - "aggressive": "true", - "range_level": "1", - "projectile": "100", - "attack_level": "18" - }, - { - "examine": "An evil human cleric.", - "start_gfx": "99", - "combat_style": "2", - "combat_audio": "511,513,512", - "melee_animation": "422", - "range_animation": "0", - "attack_speed": "4", - "magic_level": "25", - "end_gfx": "101", - "respawn_delay": "60", - "defence_animation": "404", - "weakness": "3", - "magic_animation": "711", - "death_animation": "836", - "name": "Monk of Zamorak", - "defence_level": "17", - "safespot": null, - "lifepoints": "10", - "strength_level": "8", - "id": "1045", - "aggressive": "true", - "range_level": "1", - "projectile": "100", - "attack_level": "8" - }, - { - "examine": "An evil human cleric.", - "start_gfx": "99", - "combat_style": "2", - "combat_audio": "511,513,512", - "melee_animation": "422", - "range_animation": "0", - "attack_speed": "4", - "magic_level": "40", - "end_gfx": "101", - "respawn_delay": "60", - "defence_animation": "404", - "weakness": "3", - "magic_animation": "711", - "death_animation": "836", - "name": "Monk of Zamorak", - "defence_level": "25", - "safespot": null, - "lifepoints": "25", - "strength_level": "25", - "id": "1046", - "aggressive": "true", - "range_level": "1", - "projectile": "100", - "attack_level": "25" - }, - { - "examine": "Ticket trader for the Brimhaven Agility Arena.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "703,705,704", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pirate Jackie the Fruit", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1055", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A member of the audience.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Strange watcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1057", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A member of the audience.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Strange watcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1058", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A member of the audience.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Strange watcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1059", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Commander of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Denulth", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1060", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A sergeant of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Sergeant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1061", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1063", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "1064", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "name": "Soldier", - "defence_level": "44", - "safespot": null, - "lifepoints": "55", - "combat_audio": "511,513,512", - "strength_level": "44", - "id": "1065", - "magic_level": "1", - "range_level": "1", - "attack_level": "44" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1066", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1067", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1068", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1069", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A Burthorpe Castle Archer.", - "start_gfx": "19", - "combat_style": "1", - "melee_animation": "426", - "range_animation": "426", - "magic_level": "1", - "respawn_delay": "12", - "defence_animation": "404", - "magic_animation": "426", - "death_animation": "9055", - "name": "Archer", - "defence_level": "44", - "safespot": null, - "lifepoints": "55", - "strength_level": "1", - "id": "1073", - "bonuses": "54,68,75,72,67,81,54,35,35,0,0,0,0,0,0", - "range_level": "44", - "projectile": "10", - "attack_level": "1" - }, - { - "examine": "A Burthorpe Castle Archer.", - "start_gfx": "19", - "combat_style": "1", - "melee_animation": "426", - "range_animation": "426", - "magic_level": "1", - "respawn_delay": "12", - "defence_animation": "404", - "magic_animation": "426", - "death_animation": "9055", - "name": "Archer", - "defence_level": "44", - "safespot": null, - "lifepoints": "55", - "strength_level": "1", - "id": "1074", - "bonuses": "54,68,75,72,67,81,54,35,35,0,0,0,0,0,0", - "range_level": "44", - "projectile": "10", - "attack_level": "1" - }, - { - "examine": "A Burthorpe Castle guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "magic_level": "1", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "33", - "safespot": null, - "lifepoints": "44", - "strength_level": "33", - "id": "1076", - "clue_level": "1", - "range_level": "1", - "attack_level": "33" - }, - { - "examine": "A Burthorpe Castle guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "magic_level": "1", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "33", - "safespot": null, - "lifepoints": "44", - "strength_level": "33", - "id": "1077", - "clue_level": "1", - "range_level": "1", - "attack_level": "33" - }, - { - "examine": "A servant for Prince Anlaf.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Servant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1081", - "range_level": "1", - "attack_level": "1" - }, - { - "death_animation": "836", - "name": "Ocga", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1085", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "death_animation": "836", - "name": "Penda", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1087", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "death_animation": "836", - "name": "Hygd", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1088", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "death_animation": "836", - "name": "Ceolburg", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1089", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "examine": "The knight seems to be watching something.", - "melee_animation": "7042", - "range_animation": "0", - "combat_audio": "511,513,512", - "attack_speed": "8", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "White Knight", - "defence_level": "27", - "safespot": null, - "lifepoints": "38", - "strength_level": "27", - "id": "1092", - "range_level": "1", - "attack_level": "27" - }, - { - "examine": "The biggest and baddest troll.", - "slayer_task": "83", - "melee_animation": "6523", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Rock", - "defence_level": "63", - "safespot": null, - "lifepoints": "90", - "strength_level": "63", - "id": "1095", - "aggressive": "true", - "range_level": "1", - "attack_level": "63" - }, - { - "examine": "A big", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "7", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Stick", - "defence_level": "61", - "safespot": null, - "lifepoints": "87", - "strength_level": "61", - "id": "1096", - "aggressive": "true", - "range_level": "1", - "attack_level": "61" - }, - { - "name": "Pee Hat", - "defence_level": "1", - "safespot": null, - "lifepoints": "126", - "strength_level": "1", - "id": "1097", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Kraka", - "defence_level": "1", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "attack_speed": "6", - "id": "1098", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Dung", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1099", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Ash", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1100", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1101", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1102", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1103", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1104", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1105", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1106", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1107", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1108", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1109", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1110", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1111", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1112", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "One of the troll generals.", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll general", - "defence_level": "65", - "safespot": null, - "lifepoints": "92", - "strength_level": "65", - "id": "1115", - "aggressive": "true", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "One of the troll generals.", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll general", - "defence_level": "65", - "safespot": null, - "lifepoints": "92", - "strength_level": "65", - "id": "1116", - "aggressive": "true", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "One of the troll generals.", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll general", - "defence_level": "65", - "safespot": null, - "lifepoints": "92", - "strength_level": "65", - "id": "1117", - "aggressive": "true", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1118", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1119", - "range_level": "1", - "attack_level": "47" - }, { "examine": "He's watching the arena.", "slayer_task": "83", @@ -144035,441 +132854,6 @@ "range_level": "1", "attack_level": "47" }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1121", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1122", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1123", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1124", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "An unusually large troll.", - "slayer_task": "83", - "melee_animation": "1158", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Dad", - "defence_level": "55", - "safespot": null, - "lifepoints": "157", - "strength_level": "55", - "id": "1125", - "range_level": "1", - "attack_level": "55" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Twig", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1126", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Berry", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1127", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "melee_animation": "5821", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Twig", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1128", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Berry", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1129", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1130", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1131", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1132", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1133", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1134", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1135", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1136", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1137", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1138", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "He's fast asleep.", - "slayer_task": "83", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "death_animation": "0", - "name": "Mushroom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1139", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "This beast doesn't need climbing boots.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mountain goat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1140", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "This beast doesn't need climbing boots.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mountain goat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1141", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He's guarding the storeroom.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1142", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He's guarding the storeroom.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1143", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "name": "Guard", "defence_level": "1", @@ -144596,50 +132980,6 @@ "range_level": "1", "attack_level": "50" }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "1183", - "clue_level": "2", - "range_level": "72", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "68", - "safespot": null, - "lifepoints": "85", - "strength_level": "68", - "id": "1184", - "clue_level": "2", - "range_level": "1", - "attack_level": "68" - }, { "examine": "An elven city guard.", "melee_animation": "0", @@ -144803,25 +133143,6 @@ "range_level": "1", "attack_level": "42" }, - { - "examine": "I don't want to get on the wrong side of him.", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "426", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "105", - "strength_level": "1", - "id": "1201", - "clue_level": "2", - "range_level": "1", - "projectile": "249", - "attack_level": "1" - }, { "examine": "One of King Tyras's men.", "melee_animation": "395", @@ -145062,17 +133383,6 @@ "range_level": "1", "attack_level": "46" }, - { - "name": "Wizard", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "1263", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A follower of Saradomin.", "melee_animation": "376", @@ -145095,27 +133405,6 @@ "range_level": "70", "attack_level": "90" }, - { - "examine": "No one likes crabs...", - "melee_animation": "1312", - "range_animation": "1312", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "1313", - "weakness": "7", - "magic_animation": "1312", - "death_animation": "1314", - "name": "Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "51", - "strength_level": "1", - "id": "1265", - "bonuses": "-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A rocky outcrop.", "melee_animation": "1312", @@ -145135,26 +133424,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs...", - "melee_animation": "1312", - "range_animation": "1312", - "attack_speed": "5", - "defence_animation": "1313", - "magic_animation": "1312", - "death_animation": "1314", - "name": "Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "1267", - "aggressive": "true", - "bonuses": "-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A rocky outcrop.", "melee_animation": "1312", @@ -146538,44 +134807,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "1401", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "1402", - "range_level": "1", - "attack_level": "1" - }, { "death_animation": "5389", "name": "Rooster", @@ -146750,19 +134981,24 @@ "melee_animation": "5519", "range_animation": "5519", "combat_audio": "774,775,777", - "attack_speed": "6", + "attack_speed": "4", + "magic_level": "110", + "respawn_delay": "100", "defence_animation": "5520", "weakness": "8", + "slayer_exp": "110", "magic_animation": "5519", "death_animation": "5521", "name": "Skeleton", - "defence_level": "75", + "defence_level": "110", "safespot": null, - "lifepoints": "112", - "strength_level": "109", + "lifepoints": "77", + "strength_level": "90", "id": "1471", + "aggressive": "true", + "bonuses": "50,50,50,0,0,0,0,0,0,0,0,0,0,0,0", "range_level": "1", - "attack_level": "80" + "attack_level": "180" }, { "examine": "A Greater Jungle demon. A magical aura emanates from its hide.", @@ -146835,18 +135071,6 @@ "range_level": "1", "attack_level": "5" }, - { - "slayer_exp": "17", - "name": "Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "3611,3612,3610", - "strength_level": "1", - "id": "1477", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A very dangerous looking spider", "slayer_task": "76", @@ -147374,205 +135598,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1582", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1583", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1584", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1585", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1586", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "1587", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "1588", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Young but still dangerous.", - "slayer_task": "68", - "melee_animation": "25", - "range_animation": "25", - "combat_audio": "408,410,409", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "32", - "defence_animation": "26", - "weakness": "3", - "magic_animation": "25", - "death_animation": "28", - "name": "Baby red dragon", - "defence_level": "42", - "safespot": null, - "lifepoints": "50", - "strength_level": "40", - "id": "1589", - "aggressive": "true", - "bonuses": "50,40,64,60,30,45,40,40,20,40,40,20,0,0,0", - "range_level": "1", - "attack_level": "40" - }, { "examine": "Its scales seem to be made of bronze.", "slayer_task": "13", @@ -147693,92 +135718,6 @@ "range_level": "1", "attack_level": "25" }, - { - "examine": "A spiky crawling critter. ", - "slayer_task": "16", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "weakness": "1", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1600", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "38", - "attack_level": "28" - }, - { - "examine": "A spiky crawling critter. ", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1601", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "A spiky crawling critter. ", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1602", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "A spiky crawling critter. ", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1603", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, { "examine": "A very smelly ghost.", "slayer_task": "0", @@ -147887,28 +135826,6 @@ "projectile": "335", "attack_level": "1" }, - { - "examine": "Flies like a rock.", - "melee_animation": "9454", - "range_animation": "1516", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9455", - "slayer_exp": "105", - "magic_animation": "1516", - "death_animation": "1518", - "name": "Gargoyle", - "defence_level": "107", - "safespot": null, - "lifepoints": "105", - "strength_level": "95", - "id": "1610", - "aggressive": "true", - "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, { "examine": "Flies like a rock.", "slayer_task": "84", @@ -147950,26 +135867,6 @@ "range_level": "1", "attack_level": "9" }, - { - "examine": "An evil death demon.", - "melee_animation": "9487", - "range_animation": "1528", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9489", - "magic_animation": "1528", - "death_animation": "9488", - "name": "Nechryael", - "defence_level": "105", - "safespot": null, - "lifepoints": "105", - "strength_level": "97", - "id": "1613", - "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "97" - }, { "examine": "An evil death spawn.", "melee_animation": "1540", @@ -147992,29 +135889,6 @@ "range_level": "1", "attack_level": "67" }, - { - "examine": "A denizen of the Abyss!", - "slayer_task": "1", - "melee_animation": "1537", - "range_animation": "1537", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "0", - "weakness": "1", - "slayer_exp": "150", - "magic_animation": "1537", - "death_animation": "1538", - "name": "Abyssal demon", - "defence_level": "135", - "safespot": null, - "lifepoints": "150", - "strength_level": "67", - "id": "1615", - "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "97" - }, { "examine": "The eyes of evil.", "melee_animation": "260", @@ -148053,110 +135927,6 @@ "range_level": "75", "attack_level": "80" }, - { - "examine": "The tongue of evil.", - "melee_animation": "9130", - "range_animation": "1552", - "attack_speed": "4", - "respawn_delay": "60", - "defence_animation": "9132", - "slayer_exp": "120", - "magic_animation": "1552", - "death_animation": "9131", - "name": "Bloodveld", - "defence_level": "30", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "1618", - "aggressive": "true", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { - "examine": "The tongue of evil.", - "melee_animation": "9130", - "range_animation": "1552", - "attack_speed": "4", - "respawn_delay": "60", - "defence_animation": "9132", - "slayer_exp": "120", - "magic_animation": "1552", - "death_animation": "9131", - "name": "Bloodveld", - "defence_level": "30", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "1619", - "aggressive": "true", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { - "examine": "The winged reptile.", - "slayer_task": "19", - "melee_animation": "7762", - "range_animation": "7762", - "attack_speed": "5", - "defence_animation": "7761", - "weakness": "2", - "slayer_exp": "37", - "magic_animation": "7762", - "death_animation": "7763", - "name": "Cockatrice", - "defence_level": "35", - "safespot": null, - "lifepoints": "37", - "strength_level": "32", - "id": "1620", - "bonuses": "30,30,30,30,30,35,0,0,0,0,0,0,0,0,0", - "clue_level": "1", - "range_level": "32", - "attack_level": "32" - }, - { - "examine": "The winged reptile.", - "melee_animation": "7762", - "range_animation": "7762", - "attack_speed": "5", - "defence_animation": "7761", - "slayer_exp": "37", - "magic_animation": "7762", - "death_animation": "7763", - "name": "Cockatrice", - "defence_level": "35", - "safespot": null, - "lifepoints": "37", - "strength_level": "32", - "id": "1621", - "bonuses": "30,30,30,30,30,35,0,0,0,0,0,0,0,0,0", - "clue_level": "1", - "range_level": "1", - "attack_level": "32" - }, - { - "examine": "The vacuumed face of evil.", - "slayer_task": "28", - "melee_animation": "1557", - "range_animation": "1557", - "attack_speed": "4", - "defence_animation": "1555", - "weakness": "2", - "slayer_exp": "105", - "magic_animation": "1557", - "death_animation": "1558", - "name": "Dust devil", - "defence_level": "40", - "safespot": null, - "lifepoints": "105", - "strength_level": "70", - "id": "1624", - "range_level": "1", - "attack_level": "105" - }, { "examine": "The cave-dwelling cousin of the dust devils.", "slayer_task": "28", @@ -148175,469 +135945,6 @@ "range_level": "61", "attack_level": "105" }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "9506", - "range_animation": "9506", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "9508", - "weakness": "7", - "magic_animation": "9506", - "death_animation": "9507", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1631", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "9506", - "range_animation": "9506", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "9508", - "weakness": "7", - "magic_animation": "9506", - "death_animation": "9507", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1632", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1633", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1634", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1635", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1636", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "examine": "It's a Jelly.", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "8569", - "attack_speed": "5", - "magic_level": "40", - "defence_animation": "8571", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "8569", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "40", - "safespot": null, - "lifepoints": "75", - "strength_level": "45", - "id": "1637", - "clue_level": "2", - "range_level": "40", - "attack_level": "40" - }, - { - "examine": "Doesn't look so tough...", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "0", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "49", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "1638", - "clue_level": "2", - "range_level": "49", - "attack_level": "1" - }, - { - "examine": "Wibbly.", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "0", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "49", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "1639", - "clue_level": "2", - "range_level": "49", - "attack_level": "1" - }, - { - "examine": "There's always room for jelly.", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "0", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "49", - "safespot": null, - "lifepoints": "140", - "strength_level": "1", - "id": "1640", - "clue_level": "2", - "range_level": "49", - "attack_level": "1" - }, - { - "melee_animation": "8569", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "8571", - "slayer_exp": "75", - "name": "Jelly", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "1641", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "8569", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "8571", - "slayer_exp": "75", - "name": "Jelly", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "1642", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Now THAT'S handy.", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "9125", - "attack_speed": "5", - "respawn_delay": "20", - "defence_animation": "9127", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "9125", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "5", - "safespot": null, - "lifepoints": "16", - "strength_level": "5", - "id": "1648", - "bonuses": "5,0,0,0,0,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "5" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1649", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1650", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1651", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1652", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Now THAT's handy.", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1653", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "I'm glad it's just the hand I can see...", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1654", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "A big severed hand.", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1655", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "Give the guy a big hand.....", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1656", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "A big severed hand.", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1657", - "range_level": "1", - "attack_level": "13" - }, { "examine": "He's in charge of the Skullball Course.", "melee_animation": "0", @@ -148719,27 +136026,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "His beard seems to have a life of its own.", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "magic_level": "1", - "defence_animation": "4665", - "weakness": "3", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "60", - "safespot": null, - "lifepoints": "120", - "strength_level": "60", - "id": "1681", - "aggressive": "true", - "bonuses": "66,62,0,0,0,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, { "examine": "A trader from across the eastern sea.", "start_gfx": "0", @@ -148817,22 +136103,22 @@ "melee_animation": "422", "range_animation": "0", "attack_speed": "5", - "magic_level": "38", + "magic_level": "1", "respawn_delay": "60", "defence_animation": "0", "weakness": "3", - "slayer_exp": "25", + "slayer_exp": "51", "magic_animation": "0", "death_animation": "836", "name": "Tortured soul", "defence_level": "38", "safespot": null, - "lifepoints": "85", - "strength_level": "28", + "lifepoints": "51", + "strength_level": "62", "id": "1698", "aggressive": "true", "range_level": "1", - "attack_level": "28" + "attack_level": "52" }, { "examine": "A guard for the humans against monster group.", @@ -149919,28 +137205,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Flies like a rock.", - "melee_animation": "9454", - "range_animation": "1516", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9455", - "slayer_exp": "105", - "magic_animation": "1516", - "death_animation": "1518", - "name": "Gargoyle", - "defence_level": "107", - "safespot": null, - "lifepoints": "105", - "strength_level": "95", - "id": "1827", - "aggressive": "true", - "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, { "examine": "It didn't get that big eating flies!", "melee_animation": "1793", @@ -151153,23 +138417,6 @@ "range_level": "40", "attack_level": "30" }, - { - "melee_animation": "7588", - "attack_speed": "6", - "respawn_delay": "60", - "defence_animation": "7590", - "slayer_exp": "62", - "death_animation": "7591", - "name": "Crocodile", - "defence_level": "1", - "safespot": null, - "lifepoints": "63", - "strength_level": "1", - "id": "1993", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He has had his day.", "slayer_task": "27", @@ -151569,78 +138816,6 @@ "range_level": "1", "attack_level": "72" }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2044", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2045", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2046", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2047", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2048", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2049", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "name": "Skogre", "defence_level": "1", @@ -151653,66 +138828,6 @@ "respawn_delay": "60", "attack_level": "1" }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2051", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2052", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2053", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2054", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2055", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "name": "Skogre", "defence_level": "1", @@ -152757,22 +139872,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A rich landlord", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Inn Keeper", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2177", - "range_level": "1", - "attack_level": "1" - }, { "examine": "These Dwarf ladies are so attractive!", "melee_animation": "0", @@ -153030,21 +140129,6 @@ "range_level": "1", "attack_level": "1" }, - { - "melee_animation": "401", - "attack_speed": "6", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Khazard trooper", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "2245", - "range_level": "1", - "attack_level": "1" - }, { "examine": "It's one of General Khazard's warriors.", "melee_animation": "429", @@ -153064,51 +140148,6 @@ "range_level": "1", "attack_level": "32" }, - { - "combat_style": "1", - "melee_animation": "190", - "respawn_delay": "60", - "defence_animation": "193", - "death_animation": "196", - "name": "Gnome troop", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2247", - "range_level": "1", - "attack_level": "1" - }, - { - "combat_style": "1", - "melee_animation": "190", - "respawn_delay": "60", - "defence_animation": "193", - "death_animation": "196", - "name": "Gnome troop", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2248", - "range_level": "1", - "attack_level": "1" - }, - { - "combat_audio": "511,513,512", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Paladin", - "defence_level": "1", - "safespot": null, - "lifepoints": "66", - "strength_level": "1", - "id": "2256", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An initiate of Zamorak.", "melee_animation": "0", @@ -153125,27 +140164,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A blood-drinking denizen of the abyss.", - "melee_animation": "2181", - "range_animation": "0", - "attack_speed": "3", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "0", - "magic_animation": "0", - "death_animation": "2183", - "name": "Abyssal leech", - "defence_level": "52", - "safespot": null, - "lifepoints": "74", - "strength_level": "1", - "id": "2263", - "aggressive": "true", - "range_level": "52", - "attack_level": "1" - }, { "examine": "It seems to have eyes in the back of its head...", "melee_animation": "2186", @@ -153167,26 +140185,6 @@ "range_level": "135", "attack_level": "65" }, - { - "examine": "Apparently walks the abyss.", - "melee_animation": "2192", - "range_animation": "2192", - "attack_speed": "5", - "defence_animation": "2193", - "weakness": "8", - "slayer_exp": "0", - "magic_animation": "2192", - "death_animation": "2194", - "name": "Abyssal walker", - "defence_level": "55", - "safespot": null, - "lifepoints": "95", - "strength_level": "116", - "id": "2265", - "aggressive": "true", - "range_level": "1", - "attack_level": "60" - }, { "examine": "A snowman armed with a holly bow.", "melee_animation": "0", @@ -153395,21 +140393,6 @@ "range_level": "1", "attack_level": "1" }, - { - "melee_animation": "400", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Sir Leye", - "defence_level": "1", - "safespot": null, - "lifepoints": "21", - "strength_level": "1", - "id": "2285", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An observer for the Temple Knights.", "melee_animation": "0", @@ -153506,17 +140489,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "2309", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Young, but still beefy.", "slayer_task": "20", @@ -153554,63 +140526,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2313", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2314", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2315", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Swine.", "melee_animation": "0", @@ -153773,94 +140688,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2359", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2360", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2361", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2362", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, { "examine": "A Mourner showing his true identity.", "melee_animation": "0", @@ -154007,26 +140834,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs... especially really big ones!", - "melee_animation": "2368", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "68", - "safespot": null, - "lifepoints": "97", - "strength_level": "68", - "id": "2452", - "aggressive": "true", - "range_level": "1", - "attack_level": "68" - }, { "examine": "Heavy rock!", "melee_animation": "0", @@ -154107,167 +140914,6 @@ "projectile": "294", "attack_level": "68" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "5", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "20", - "safespot": null, - "lifepoints": "19", - "strength_level": "5", - "id": "2463", - "aggressive": "true", - "bonuses": "25,85,105,75,103,85,65,0,0,0,0,0,0,0,0", - "range_level": "5", - "projectile": "337", - "attack_level": "5" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "10", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "40", - "safespot": null, - "lifepoints": "40", - "strength_level": "10", - "id": "2464", - "aggressive": "true", - "bonuses": "35,105,125,95,128,105,85,0,0,0,0,0,0,0,0", - "range_level": "10", - "projectile": "337", - "attack_level": "10" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "15", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "50", - "safespot": null, - "lifepoints": "60", - "strength_level": "15", - "id": "2465", - "aggressive": "true", - "bonuses": "35,185,185,155,188,125,165,0,0,0,0,0,0,0,0", - "range_level": "15", - "projectile": "337", - "attack_level": "15" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "25", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "60", - "safespot": null, - "lifepoints": "80", - "strength_level": "45", - "id": "2466", - "aggressive": "true", - "bonuses": "45,235,235,205,238,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "35", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "70", - "safespot": null, - "lifepoints": "105", - "strength_level": "45", - "id": "2467", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "45", - "respawn_delay": "25", - "defence_animation": "2300", - "weakness": "9", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "90", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "2468", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, { "examine": "A Retired Highwayman", "combat_style": "1", @@ -154971,132 +141617,6 @@ "projectile": "442", "attack_level": "70" }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2610", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2611", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2612", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2613", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2614", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2615", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2616", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, { "name": "Tz-Kih", "defence_level": "1", @@ -155468,22 +141988,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A strange man with a strange name. Probably a strange past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Longbow Ben", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2691", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She quackers.", "slayer_task": "7", @@ -155892,22 +142396,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A wise barbarian", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Otto Godblessed", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2725", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Holy looking.", "melee_animation": "0", @@ -156220,29 +142708,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "From a darker dimension.", - "slayer_task": "25", - "melee_animation": "2731", - "range_animation": "2731", - "attack_speed": "4", - "magic_level": "160", - "defence_animation": "2732", - "weakness": "4", - "slayer_exp": "225", - "magic_animation": "2731", - "death_animation": "2733", - "name": "Dark beast", - "defence_level": "120", - "safespot": null, - "lifepoints": "220", - "strength_level": "160", - "id": "2783", - "aggressive": "true", - "bonuses": "0,0,0,0,0,30,40,100,90,100,0,0,0,0,0", - "range_level": "1", - "attack_level": "140" - }, { "examine": "Digging.", "melee_animation": "0", @@ -157183,44 +143648,6 @@ "range_level": "255", "attack_level": "255" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "1312", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "1313", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "240", - "strength_level": "1", - "id": "2885", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "name": "Boulder", "defence_level": "1", @@ -157269,25 +143696,6 @@ "projectile": "288", "attack_level": "1" }, - { - "examine": "It wasn't a rock... It was a rock lobster!", - "melee_animation": "2860", - "range_animation": "2860", - "attack_speed": "2", - "defence_animation": "2861", - "weakness": "7", - "magic_animation": "2860", - "death_animation": "2862", - "name": "Rock lobster", - "defence_level": "100", - "safespot": null, - "lifepoints": "150", - "strength_level": "100", - "id": "2889", - "bonuses": "0,0,0,0,0,100,100,50,50,150,0,0,0,0,0", - "range_level": "1", - "attack_level": "100" - }, { "agg_radius": "12", "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", @@ -157396,22 +143804,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Lovely", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Bones", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2945", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Obviously punches above his weight.", "melee_animation": "0", @@ -157673,68 +144065,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "King rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "2982", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not a soft touch.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pusskins", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2984", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A not-so friendly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Captain Tom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2986", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fully grown feline.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mittens", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2988", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Cute and fluffy.", "melee_animation": "0", @@ -159472,7 +145802,7 @@ "attack_level": "28" }, { - "examine": "One of RuneScape's many citizens", + "examine": "One of Gielinor's many citizens, currently incapacitated by alcohol.", "melee_animation": "422", "range_animation": "0", "respawn_delay": "60", @@ -159812,314 +146142,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Alberich", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3246", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Fafner", - "melee_animation": "7048", - "range_animation": "7048", - "attack_speed": "6", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "7048", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "18", - "strength_level": "22", - "id": "3247", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Fasolt", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3248", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Siegmund", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3249", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Siegfried", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3250", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Lydspor", - "melee_animation": "7048", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3251", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Hagen", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3252", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Minarch", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3253", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Wotan", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3255", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Acelin", - "melee_animation": "390", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3256", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Adelino", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3257", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Adolpho", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3258", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Aitan", - "melee_animation": "426", - "range_animation": "426", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3259", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Brunnhilde", - "melee_animation": "428", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "20", - "safespot": null, - "lifepoints": "28", - "strength_level": "20", - "id": "3260", - "clue_level": "0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Gutrune", - "melee_animation": "428", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "20", - "safespot": null, - "lifepoints": "28", - "strength_level": "20", - "id": "3261", - "clue_level": "0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Edelschwarz", - "melee_animation": "428", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "20", - "safespot": null, - "lifepoints": "28", - "strength_level": "20", - "id": "3262", - "clue_level": "0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Sieglinde", - "melee_animation": "428", - "range_animation": "428", - "attack_speed": "6", - "defence_animation": "404", - "weakness": "8", - "magic_animation": "428", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "20", - "strength_level": "20", - "id": "3263", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, { "examine": "An ugly green creature.", "melee_animation": "6185", @@ -160700,22 +146722,6 @@ "range_level": "41", "attack_level": "1" }, - { - "examine": "Likes to cook with mushrooms.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Fairy chef", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3322", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Rather more tired than most.", "melee_animation": "0", @@ -160764,112 +146770,6 @@ "range_level": "300", "attack_level": "200" }, - { - "examine": "Holy Mole-y!", - "melee_animation": "3312", - "range_animation": "3312", - "attack_speed": "4", - "magic_level": "200", - "respawn_delay": "56", - "defence_animation": "3311", - "weakness": "7", - "magic_animation": "3312", - "death_animation": "3310", - "name": "Giant Mole", - "defence_level": "200", - "safespot": null, - "lifepoints": "200", - "strength_level": "200", - "id": "3340", - "bonuses": "0,0,0,0,0,60,80,100,80,60,0,0,0,0,0", - "range_level": "1", - "attack_level": "200" - }, - { - "examine": "I will call him", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Baby Mole", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3341", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fun guy. No wait", - "melee_animation": "0", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Fungi", - "defence_level": "1", - "safespot": null, - "lifepoints": "65", - "strength_level": "1", - "id": "3344", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "2776", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "2775", - "death_animation": "2777", - "name": "Fungi", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "3345", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A bouncy fungus.", - "slayer_task": "94", - "melee_animation": "2776", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "1", - "magic_animation": "0", - "death_animation": "2777", - "name": "Zygomite", - "defence_level": "42", - "safespot": null, - "lifepoints": "60", - "strength_level": "1", - "id": "3346", - "range_level": "42", - "attack_level": "1" - }, - { - "melee_animation": "2776", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "2775", - "death_animation": "2777", - "name": "Zygomite", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "3347", - "range_level": "1", - "attack_level": "1" - }, { "melee_animation": "7049", "combat_audio": "511,513,512", @@ -160918,119 +146818,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3366", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3367", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3368", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3369", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3370", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3371", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "slayer_task": "7", - "melee_animation": "2299", - "range_animation": "0", - "combat_audio": "355,357,356", - "magic_level": "55", - "respawn_delay": "0", - "defence_animation": "0", - "weakness": "10", - "magic_animation": "0", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "55", - "safespot": null, - "lifepoints": "117", - "strength_level": "55", - "id": "3375", - "aggressive": "true", - "range_level": "55", - "attack_level": "55" - }, - { - "examine": "Young but still dangerous.", - "slayer_task": "68", - "melee_animation": "25", - "range_animation": "25", - "combat_audio": "408,410,409", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "32", - "defence_animation": "26", - "weakness": "3", - "slayer_exp": "0", - "magic_animation": "25", - "death_animation": "28", - "name": "Baby black dragon", - "defence_level": "42", - "safespot": null, - "lifepoints": "50", - "strength_level": "80", - "id": "3376", - "aggressive": "true", - "bonuses": "50,40,64,60,30,45,40,40,20,40,40,20,0,0,0", - "range_level": "1", - "attack_level": "80" - }, { "examine": "He seems to like wearing black.", "melee_animation": "0", @@ -161325,23 +147112,6 @@ "range_level": "65", "attack_level": "65" }, - { - "examine": "He may be a funky cook", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "469,472,471", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Goblin Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3413", - "range_level": "1", - "attack_level": "1" - }, { "examine": "More like a goblin cooked.", "melee_animation": "0", @@ -161359,17 +147129,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Goblin Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "469,472,471", - "strength_level": "1", - "id": "3415", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He'll store my items for me.", "melee_animation": "0", @@ -162325,29 +148084,6 @@ "range_level": "27", "attack_level": "27" }, - { - "examine": "Young but still dangerous.", - "melee_animation": "25", - "range_animation": "25", - "combat_audio": "408,410,409", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "32", - "defence_animation": "26", - "weakness": "8", - "magic_animation": "25", - "death_animation": "28", - "name": "Baby red dragon", - "defence_level": "42", - "safespot": null, - "lifepoints": "50", - "strength_level": "40", - "id": "3588", - "aggressive": "true", - "bonuses": "20,10,10,20,40,40,20,40,40,20,0,0,0,0,0", - "range_level": "1", - "attack_level": "40" - }, { "examine": "Its scales seem to be made of steel.", "combat_audio": "408,410,409", @@ -162367,17 +148103,6 @@ "range_level": "185", "attack_level": "234" }, - { - "name": "Dagannoth", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3591", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Arrgh! Look at its pointy teeth!", "range_animation": "0", @@ -162713,58 +148438,6 @@ "range_level": "1", "attack_level": "25" }, - { - "name": "Angry unicorn", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "496,498,497", - "strength_level": "1", - "id": "3661", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Angry giant rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "3662", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He looks a little on the cross side!", - "slayer_task": "38", - "melee_animation": "6185", - "range_animation": "0", - "combat_audio": "469,472,471", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "6182", - "name": "Angry goblin", - "defence_level": "25", - "safespot": null, - "lifepoints": "35", - "strength_level": "25", - "id": "3663", - "range_level": "1", - "attack_level": "25" - }, - { - "name": "Angry bear", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "498,500,499", - "strength_level": "1", - "id": "3664", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Freshly sheared.", "melee_animation": "5341", @@ -162803,38 +148476,6 @@ "range_level": "1", "attack_level": "2" }, - { - "examine": "If you see them circling", - "melee_animation": "2019", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "2021", - "name": "Vulture", - "defence_level": "38", - "safespot": null, - "lifepoints": "54", - "strength_level": "38", - "id": "3675", - "range_level": "1", - "attack_level": "38" - }, - { - "death_animation": "2026", - "name": "Vulture", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "2025", - "strength_level": "1", - "id": "3676", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "2024" - }, { "examine": "A young boy handing out flyers.", "melee_animation": "0", @@ -163094,1078 +148735,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "5", - "respawn_delay": "120", - "defence_animation": "3890", - "weakness": "8", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "20", - "safespot": null, - "lifepoints": "13", - "strength_level": "20", - "id": "3727", - "bonuses": "5,10,10,10,10,2,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "10", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "25", - "safespot": null, - "lifepoints": "23", - "strength_level": "25", - "id": "3728", - "bonuses": "10,15,15,15,15,5,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "25" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "10", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "3729", - "bonuses": "15,20,20,20,20,8,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "15", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "35", - "safespot": null, - "lifepoints": "23", - "strength_level": "35", - "id": "3730", - "bonuses": "20,25,25,25,25,10,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "35" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "20", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "40", - "safespot": null, - "lifepoints": "23", - "strength_level": "40", - "id": "3731", - "bonuses": "25,30,30,30,30,15,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "40" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "14", - "respawn_delay": "127", - "defence_animation": "3902", - "weakness": "9", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "28", - "poison_immune": "true", - "safespot": null, - "lifepoints": "23", - "strength_level": "28", - "id": "3732", - "aggressive": "true", - "bonuses": "20,25,20,40,40,40,40,5,18,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "14", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "28", - "poison_immune": "true", - "safespot": null, - "lifepoints": "23", - "strength_level": "28", - "id": "3733", - "aggressive": "true", - "bonuses": "20,25,20,40,40,40,40,5,18,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "20", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "42", - "poison_immune": "true", - "safespot": null, - "lifepoints": "38", - "strength_level": "42", - "id": "3734", - "aggressive": "true", - "bonuses": "30,35,30,50,50,50,50,10,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "42" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "20", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "42", - "poison_immune": "true", - "safespot": null, - "lifepoints": "38", - "strength_level": "42", - "id": "3735", - "aggressive": "true", - "bonuses": "30,35,30,50,50,50,50,10,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "42" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "25", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "54", - "poison_immune": "true", - "safespot": null, - "lifepoints": "53", - "strength_level": "54", - "id": "3736", - "aggressive": "true", - "bonuses": "35,40,35,60,60,60,60,20,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "54" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "25", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "54", - "poison_immune": "true", - "safespot": null, - "lifepoints": "53", - "strength_level": "54", - "id": "3737", - "aggressive": "true", - "bonuses": "35,40,35,60,60,60,60,20,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "54" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "30", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "60", - "poison_immune": "true", - "safespot": null, - "lifepoints": "68", - "strength_level": "60", - "id": "3738", - "aggressive": "true", - "bonuses": "40,50,40,70,70,70,70,30,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "30", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "60", - "poison_immune": "true", - "safespot": null, - "lifepoints": "68", - "strength_level": "60", - "id": "3739", - "aggressive": "true", - "bonuses": "40,50,40,70,70,70,70,30,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "35", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "70", - "poison_immune": "true", - "safespot": null, - "lifepoints": "83", - "strength_level": "70", - "id": "3740", - "aggressive": "true", - "bonuses": "50,60,50,80,70,90,80,35,14,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "70" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "35", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "70", - "poison_immune": "true", - "safespot": null, - "lifepoints": "83", - "strength_level": "70", - "id": "3741", - "aggressive": "true", - "bonuses": "50,60,50,80,70,90,80,35,14,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "70" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "120", - "defence_animation": "3916", - "weakness": "7", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "15", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "3742", - "bonuses": "45,45,45,45,50,5,45,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "15" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "15", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "20", - "safespot": null, - "lifepoints": "38", - "strength_level": "40", - "id": "3743", - "bonuses": "45,45,45,45,50,5,55,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "20", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "30", - "safespot": null, - "lifepoints": "53", - "strength_level": "60", - "id": "3744", - "bonuses": "45,55,55,55,50,10,45,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "45", - "safespot": null, - "lifepoints": "53", - "strength_level": "75", - "id": "3745", - "bonuses": "60,60,60,60,80,10,45,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "45" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "60", - "safespot": null, - "lifepoints": "53", - "strength_level": "80", - "id": "3746", - "bonuses": "65,70,70,70,90,20,56,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "10", - "respawn_delay": "125", - "defence_animation": "3909", - "weakness": "6", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "20", - "safespot": null, - "lifepoints": "33", - "strength_level": "20", - "id": "3747", - "bonuses": "20,40,40,40,40,10,38,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "15", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "30", - "safespot": null, - "lifepoints": "50", - "strength_level": "30", - "id": "3748", - "bonuses": "30,60,60,60,60,15,38,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "20", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "40", - "safespot": null, - "lifepoints": "67", - "strength_level": "40", - "id": "3749", - "bonuses": "50,70,70,70,70,20,38,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "40" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "30", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "60", - "safespot": null, - "lifepoints": "101", - "strength_level": "60", - "id": "3750", - "bonuses": "60,100,100,100,100,30,25,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "25", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "50", - "safespot": null, - "lifepoints": "84", - "strength_level": "50", - "id": "3751", - "bonuses": "55,80,80,80,85,25,30,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "25", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "weakness": "5", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "25", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "3752", - "aggressive": "true", - "bonuses": "30,30,30,30,15,30,40,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "25", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "25", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "3753", - "aggressive": "true", - "bonuses": "30,30,30,30,15,30,40,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "40", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "40", - "safespot": null, - "lifepoints": "30", - "strength_level": "1", - "id": "3754", - "aggressive": "true", - "bonuses": "45,40,40,40,25,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "40", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "40", - "safespot": null, - "lifepoints": "30", - "strength_level": "1", - "id": "3755", - "aggressive": "true", - "bonuses": "45,40,40,40,25,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "50", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "50", - "safespot": null, - "lifepoints": "42", - "strength_level": "1", - "id": "3756", - "aggressive": "true", - "bonuses": "35,40,40,40,30,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "50", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "50", - "safespot": null, - "lifepoints": "42", - "strength_level": "1", - "id": "3757", - "aggressive": "true", - "bonuses": "35,40,40,40,30,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "60", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "60", - "safespot": null, - "lifepoints": "51", - "strength_level": "1", - "id": "3758", - "aggressive": "true", - "bonuses": "60,80,80,80,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "60", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "60", - "safespot": null, - "lifepoints": "51", - "strength_level": "1", - "id": "3759", - "aggressive": "true", - "bonuses": "60,80,80,80,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "70", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "70", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3760", - "aggressive": "true", - "bonuses": "40,100,100,100,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "70", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "70", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3761", - "aggressive": "true", - "bonuses": "40,100,100,100,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "30", - "respawn_delay": "120", - "defence_animation": "3921", - "weakness": "0", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "25", - "safespot": null, - "lifepoints": "27", - "strength_level": "1", - "id": "3762", - "aggressive": "true", - "bonuses": "20,40,40,40,40,40,40,40,0,0,0,0,0,0,0", - "range_level": "25", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "30", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "25", - "safespot": null, - "lifepoints": "27", - "strength_level": "1", - "id": "3763", - "aggressive": "true", - "bonuses": "20,40,40,40,40,40,40,40,0,0,0,0,0,0,0", - "range_level": "25", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "40", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "40", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "3764", - "aggressive": "true", - "bonuses": "30,50,60,60,60,60,40,40,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "40", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "40", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "3765", - "aggressive": "true", - "bonuses": "30,40,60,60,60,60,40,40,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "50", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "50", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3766", - "aggressive": "true", - "bonuses": "35,65,70,70,70,70,40,40,0,0,0,0,0,0,0", - "range_level": "50", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "50", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "50", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3767", - "aggressive": "true", - "bonuses": "35,65,70,70,70,70,40,40,0,0,0,0,0,0,0", - "range_level": "50", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "60", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "60", - "safespot": null, - "lifepoints": "78", - "strength_level": "1", - "id": "3768", - "aggressive": "true", - "bonuses": "40,90,80,80,80,80,40,40,0,0,0,0,0,0,0", - "range_level": "60", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "60", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "60", - "safespot": null, - "lifepoints": "78", - "strength_level": "1", - "id": "3769", - "aggressive": "true", - "bonuses": "40,90,80,80,80,80,40,40,0,0,0,0,0,0,0", - "range_level": "60", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "70", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "70", - "safespot": null, - "lifepoints": "97", - "strength_level": "1", - "id": "3770", - "aggressive": "true", - "bonuses": "50,100,100,100,120,100,40,40,80,0,0,0,0,0,0", - "range_level": "70", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "70", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "70", - "safespot": null, - "lifepoints": "97", - "strength_level": "1", - "id": "3771", - "aggressive": "true", - "bonuses": "50,100,100,100,120,100,40,40,80,0,0,0,0,0,0", - "range_level": "70", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "14", - "respawn_delay": "120", - "defence_animation": "3895", - "weakness": "9", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "28", - "safespot": null, - "lifepoints": "53", - "strength_level": "28", - "id": "3772", - "aggressive": "true", - "bonuses": "45,45,50,50,50,50,50,15,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "21", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "42", - "safespot": null, - "lifepoints": "83", - "strength_level": "42", - "id": "3773", - "aggressive": "true", - "bonuses": "45,45,60,50,50,50,50,15,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "42" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "32", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "56", - "safespot": null, - "lifepoints": "113", - "strength_level": "56", - "id": "3774", - "aggressive": "true", - "bonuses": "45,45,60,80,80,80,80,25,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "56" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "38", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "74", - "safespot": null, - "lifepoints": "143", - "strength_level": "74", - "id": "3775", - "aggressive": "true", - "bonuses": "45,45,60,60,60,60,60,20,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "74" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "45", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "88", - "safespot": null, - "lifepoints": "173", - "strength_level": "88", - "id": "3776", - "aggressive": "true", - "bonuses": "45,45,80,100,100,100,100,30,46,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "88" - }, { "examine": "Cheerful, helpful and optimistic, I'll bet.", "melee_animation": "0", @@ -164772,18 +149341,6 @@ "range_level": "1", "attack_level": "1" }, - { - "slayer_exp": "37", - "name": "Cockatrice", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4227", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "slayer_exp": "75", "name": "Basilisk", @@ -164795,29 +149352,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A denizen of the Abyss!", - "slayer_task": "1", - "melee_animation": "1537", - "range_animation": "1537", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "0", - "weakness": "1", - "slayer_exp": "150", - "magic_animation": "1537", - "death_animation": "1538", - "name": "Abyssal demon", - "defence_level": "135", - "safespot": null, - "lifepoints": "150", - "strength_level": "67", - "id": "4230", - "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "97" - }, { "name": "Demon butler", "defence_level": "1", @@ -165770,101 +150304,6 @@ "range_level": "1", "attack_level": "63" }, - { - "examine": "A horrible", - "slayer_task": "52", - "melee_animation": "4235", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "45", - "magic_animation": "0", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "48", - "safespot": null, - "lifepoints": "68", - "strength_level": "48", - "id": "4348", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "48" - }, - { - "melee_animation": "4234", - "respawn_delay": "60", - "defence_animation": "4232", - "slayer_exp": "45", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "1", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "4349", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A horrible", - "slayer_task": "52", - "melee_animation": "4235", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "45", - "magic_animation": "0", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "48", - "safespot": null, - "lifepoints": "68", - "strength_level": "48", - "id": "4350", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "48" - }, - { - "melee_animation": "4234", - "respawn_delay": "60", - "defence_animation": "4232", - "slayer_exp": "45", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "1", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "4351", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "4234", - "respawn_delay": "60", - "defence_animation": "4232", - "slayer_exp": "45", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "1", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "4352", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A horrible, emaciated ape like creature with beady red eyes.", "slayer_task": "17", @@ -166184,135 +150623,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "I don't think insect repellent will work…", - "slayer_task": "34", - "melee_animation": "1184", - "range_animation": "1184", - "attack_speed": "3", - "respawn_delay": "30", - "defence_animation": "1186", - "weakness": "0", - "slayer_exp": "25", - "magic_animation": "1184", - "death_animation": "1190", - "name": "Flesh Crawler", - "defence_level": "10", - "safespot": null, - "lifepoints": "25", - "strength_level": "2", - "id": "4389", - "aggressive": "true", - "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't think insect repellent will work…", - "melee_animation": "1184", - "range_animation": "1184", - "attack_speed": "3", - "respawn_delay": "30", - "defence_animation": "1186", - "slayer_exp": "25", - "magic_animation": "1184", - "death_animation": "1190", - "name": "Flesh Crawler", - "defence_level": "10", - "safespot": null, - "lifepoints": "25", - "strength_level": "2", - "id": "4390", - "aggressive": "true", - "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "80" - }, - { - "examine": "I don't think insect repellent will work…", - "melee_animation": "1184", - "range_animation": "1184", - "attack_speed": "3", - "respawn_delay": "30", - "defence_animation": "1186", - "slayer_exp": "25", - "magic_animation": "1184", - "death_animation": "1190", - "name": "Flesh Crawler", - "defence_level": "10", - "safespot": null, - "lifepoints": "25", - "strength_level": "2", - "id": "4391", - "aggressive": "true", - "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "100" - }, - { - "examine": "Examine not added", - "melee_animation": "5568", - "range_animation": "5568", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5567", - "slayer_exp": "30", - "magic_animation": "5568", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "25", - "safespot": null, - "lifepoints": "23", - "strength_level": "1", - "id": "4392", - "bonuses": "15,25,25,25,25,25,25,15,15,25,25,25,25,25,25", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "Examine not added", - "melee_animation": "5578", - "range_animation": "5578", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5579", - "slayer_exp": "30", - "magic_animation": "5578", - "death_animation": "5580", - "name": "Zombie", - "defence_level": "28", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "4393", - "aggressive": "true", - "bonuses": "15,25,28,28,25,28,28,15,15,28,25,25,25,25,25", - "range_level": "1", - "attack_level": "35" - }, - { - "examine": "Examine not added", - "melee_animation": "5578", - "range_animation": "5578", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5579", - "slayer_exp": "30", - "magic_animation": "5578", - "death_animation": "5580", - "name": "Zombie", - "defence_level": "48", - "safespot": null, - "lifepoints": "40", - "strength_level": "1", - "id": "4394", - "bonuses": "35,45,45,45,45,45,45,35,35,45,45,45,45,45,45", - "range_level": "1", - "attack_level": "47" - }, { "examine": "Overgrown vermin.", "slayer_task": "67", @@ -166451,48 +150761,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "An extremely vicious scorpion.", - "melee_animation": "6254", - "range_animation": "6254", - "combat_audio": "3611,3612,3610", - "attack_speed": "5", - "defence_animation": "6255", - "slayer_exp": "17", - "magic_animation": "6254", - "death_animation": "6256", - "name": "Scorpion", - "defence_level": "49", - "safespot": null, - "lifepoints": "55", - "strength_level": "51", - "id": "4402", - "aggressive": "true", - "bonuses": "12,23,10,51,32,62,29,54,48,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "An extremely vicious scorpion.", - "melee_animation": "6254", - "range_animation": "6254", - "combat_audio": "3611,3612,3610", - "attack_speed": "5", - "defence_animation": "6255", - "slayer_exp": "17", - "magic_animation": "6254", - "death_animation": "6256", - "name": "Scorpion", - "defence_level": "35", - "safespot": null, - "lifepoints": "37", - "strength_level": "31", - "id": "4403", - "aggressive": "true", - "bonuses": "15,16,12,32,19,38,18,34,32,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, { "examine": "Examine not added", "slayer_task": "58", @@ -166680,66 +150948,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Not man's best friend.", - "melee_animation": "6559", - "range_animation": "6559", - "combat_audio": "481,491,490", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "6557", - "slayer_exp": "15", - "magic_animation": "6559", - "death_animation": "6558", - "name": "Wolf", - "defence_level": "9", - "safespot": null, - "lifepoints": "15", - "strength_level": "1", - "id": "4413", - "bonuses": "7,7,7,7,7,7,7,7,7,7,7,7,7,7,7", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not man's best friend.", - "melee_animation": "6559", - "range_animation": "6559", - "combat_audio": "481,491,490", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "6557", - "slayer_exp": "10", - "magic_animation": "6559", - "death_animation": "6558", - "name": "Wolf", - "defence_level": "7", - "safespot": null, - "lifepoints": "69", - "strength_level": "1", - "id": "4414", - "bonuses": "5,5,5,5,5,5,5,5,5,5,5,5,5,5,5", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A popular dwarven delicacy.", - "melee_animation": "2705", - "range_animation": "2705", - "combat_audio": "3102,3104,3103", - "attack_speed": "5", - "defence_animation": "2706", - "magic_animation": "2705", - "death_animation": "2707", - "name": "Rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "2", - "strength_level": "1", - "id": "4415", - "range_level": "1", - "attack_level": "1" - }, { "melee_animation": "4300", "attack_speed": "5", @@ -166788,22 +150996,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Half horse", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Centaur", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4439", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A noble creature!", "melee_animation": "6376", @@ -167306,22 +151498,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "He knows the past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Ethereal Guide", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4506", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Luck is probably on his side.", "melee_animation": "0", @@ -167557,47 +151733,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "85", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "85", - "strength_level": "30", - "id": "4534", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Either a very fremennikey pirate", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Lokar Searunner", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4537", - "range_level": "1", - "attack_level": "1" - }, { "examine": "I always wondered what that job description actually meant...", "melee_animation": "0", @@ -168209,23 +152344,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "What is that thing!", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "6", - "magic_animation": "0", - "death_animation": "0", - "name": "Evil creature", - "defence_level": "1", - "safespot": null, - "lifepoints": "0", - "strength_level": "1", - "id": "4615", - "range_level": "1", - "attack_level": "1" - }, { "name": "Goblin", "defence_level": "1", @@ -168366,151 +152484,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "King Healthorg riding his War Tortoise.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Healthorg and tortoise", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4643", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A weasly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Glouphrie the Untrusted", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4645", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "With the prices he charges", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Stan", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4650", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Looks very stylish", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4651", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "That suit looks a little briny around the edges.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4652", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "First storm he is in that hat will blow away.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4653", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "She'll never be able to climb rigging in that.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4654", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "High heels on a ship? What is she thinking?", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4655", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The effect is sort of spoiled by all those tattoos.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "movement_radius": "710", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4656", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He works evil magic.", "start_gfx": "93", @@ -168580,32 +152553,6 @@ "projectile": "98", "attack_level": "1" }, - { - "name": "Baby red dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "4667", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Baby red dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "4668", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "examine": "He's got icicles in his beard.", "slayer_task": "47", @@ -168681,160 +152628,6 @@ "range_level": "1", "attack_level": "40" }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "4688", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4698", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4699", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4700", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4701", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "85", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "85", - "strength_level": "30", - "id": "4706", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, { "examine": "A flea-infested black market trader.", "melee_animation": "0", @@ -170564,22 +154357,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yauchomi, follower of Saradomin.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Prayer Tutor", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4903", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Feoras looks a bit fiery.", "melee_animation": "0", @@ -170644,22 +154421,6 @@ "range_level": "1", "attack_level": "1" }, - { - "melee_animation": "4868", - "attack_speed": "7", - "respawn_delay": "60", - "defence_animation": "4869", - "death_animation": "4870", - "name": "Earth elemental", - "defence_level": "1", - "safespot": null, - "lifepoints": "35", - "strength_level": "1", - "id": "4910", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An elemental rock.", "melee_animation": "0", @@ -172681,32 +156442,6 @@ "range_level": "58", "attack_level": "58" }, - { - "combat_style": "2", - "name": "Ogre shaman", - "defence_level": "1", - "safespot": null, - "lifepoints": "1", - "strength_level": "1", - "id": "5190", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "combat_style": "2", - "name": "Ogre shaman", - "defence_level": "1", - "safespot": null, - "lifepoints": "1", - "strength_level": "1", - "id": "5193", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "examine": "A wizard.", "melee_animation": "0", @@ -172777,38 +156512,6 @@ "range_level": "80", "attack_level": "80" }, - { - "combat_style": "1", - "melee_animation": "5395", - "respawn_delay": "60", - "defence_animation": "5396", - "death_animation": "5937", - "name": "Penance Ranger", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "5229", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "combat_style": "1", - "melee_animation": "5395", - "respawn_delay": "60", - "defence_animation": "5396", - "death_animation": "5937", - "name": "Penance Ranger", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "5237", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Run away! Run away!", "melee_animation": "5411", @@ -172861,28 +156564,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Part scarab", - "slayer_task": "70", - "combat_style": "2", - "melee_animation": "7615", - "range_animation": "0", - "magic_level": "54", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "7616", - "name": "Scarab mage", - "defence_level": "54", - "safespot": null, - "lifepoints": "77", - "strength_level": "40", - "id": "5250", - "aggressive": "true", - "range_level": "1", - "attack_level": "40" - }, { "examine": "A mounted lancer.", "slayer_task": "70", @@ -172941,22 +156622,6 @@ "range_level": "62", "attack_level": "62" }, - { - "combat_style": "2", - "melee_animation": "7615", - "respawn_delay": "60", - "defence_animation": "7617", - "death_animation": "7616", - "name": "Scarab mage", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "5254", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He can look after my money.", "melee_animation": "0", @@ -173056,307 +156721,6 @@ "range_level": "80", "attack_level": "80" }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5293", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5294", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5295", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5296", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5297", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5298", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5299", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5300", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5301", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5302", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5303", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5304", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Examine not added", - "melee_animation": "5568", - "range_animation": "5568", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5567", - "slayer_exp": "30", - "magic_animation": "5568", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "10", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "5305", - "bonuses": "6,15,15,15,15,15,15,6,6,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "11" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5306", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Examine not added", - "melee_animation": "5568", - "range_animation": "5568", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5567", - "slayer_exp": "30", - "magic_animation": "5568", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "10", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "5307", - "bonuses": "6,15,15,15,15,15,15,6,6,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "11" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "24", - "strength_level": "1", - "id": "5308", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Examine not added", - "melee_animation": "5571", - "range_animation": "5571", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5574", - "slayer_exp": "30", - "magic_animation": "5571", - "death_animation": "5575", - "name": "Zombie", - "defence_level": "16", - "safespot": null, - "lifepoints": "40", - "strength_level": "1", - "id": "5309", - "bonuses": "10,15,16,16,15,16,16,10,10,16,15,15,15,15,15", - "range_level": "1", - "attack_level": "15" - }, { "melee_animation": "5568", "combat_audio": "931,923,922", @@ -174096,30 +157460,6 @@ "range_level": "1", "attack_level": "60" }, - { - "examine": "A fiendish embodiment of water.", - "slayer_task": "90", - "combat_style": "1", - "melee_animation": "1582", - "range_animation": "1582", - "attack_speed": "6", - "magic_level": "77", - "defence_animation": "1581", - "weakness": "4", - "magic_animation": "1582", - "death_animation": "1580", - "name": "Waterfiend", - "defence_level": "50", - "poison_immune": "true", - "safespot": null, - "lifepoints": "128", - "strength_level": "167", - "id": "5361", - "aggressive": "true", - "range_level": "167", - "projectile": "16", - "attack_level": "70" - }, { "examine": "It appears to be intelligent and savage.", "slayer_task": "41", @@ -174181,6 +157521,7 @@ "attack_level": "34" }, { + "examine": "Could do with gaining a few pounds.", "combat_audio": "774,775,777", "attack_speed": "5", "respawn_delay": "60", @@ -174197,6 +157538,7 @@ "attack_level": "1" }, { + "examine": "Could do with gaining a few pounds.", "combat_audio": "774,775,777", "attack_speed": "5", "respawn_delay": "60", @@ -174213,6 +157555,7 @@ "attack_level": "1" }, { + "examine": "Could do with gaining a few pounds.", "combat_audio": "774,775,777", "attack_speed": "5", "respawn_delay": "60", @@ -175531,24 +158874,6 @@ "projectile": "276", "attack_level": "80" }, - { - "examine": "A hairy, smelly, grazing animal.", - "melee_animation": "5782", - "range_animation": "5782", - "attack_speed": "4", - "defence_animation": "5783", - "weakness": "7", - "magic_animation": "5782", - "death_animation": "5784", - "name": "Yak", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "strength_level": "10", - "id": "5529", - "range_level": "1", - "attack_level": "20" - }, { "examine": "Antisocial.", "melee_animation": "0", @@ -178195,23 +161520,6 @@ "range_level": "1", "attack_level": "20" }, - { - "examine": "A greasy", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "5910", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He's suspiciously talented with a meat-cleaver.", "melee_animation": "0", @@ -179605,20 +162913,6 @@ "attack_level": "1", "defence_animation": "425" }, - { - "death_animation": "836", - "name": "Yadviga", - "defence_level": "1", - "safespot": null, - "lifepoints": "60", - "melee_animation": "422", - "strength_level": "1", - "id": "6041", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, { "death_animation": "836", "name": "Nikita", @@ -179770,43 +163064,6 @@ "range_level": "1", "attack_level": "20" }, - { - "melee_animation": "6559", - "respawn_delay": "60", - "defence_animation": "6557", - "death_animation": "6558", - "name": "Ice wolf", - "defence_level": "1", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "6052", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Dragon impling", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6054", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Dragon impling", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6064", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She tends the wheat.", "melee_animation": "0", @@ -180017,6 +163274,7 @@ "attack_level": "2" }, { + "examine": "Ey.", "combat_audio": "774,775,777", "attack_speed": "5", "respawn_delay": "60", @@ -180033,6 +163291,7 @@ "attack_level": "1" }, { + "examine": "Could do with gaining a few pounds.", "combat_audio": "774,775,777", "attack_speed": "5", "respawn_delay": "60", @@ -180144,7 +163403,7 @@ "attack_level": "53" }, { - "examine": "An ex-barbarian", + "examine": "An ex-barbarian, willing to make you ex too.", "slayer_task": "75", "melee_animation": "422", "range_animation": "0", @@ -180207,7 +163466,7 @@ "attack_level": "64" }, { - "examine": "Floats like an anvil", + "examine": "Floats like an anvil, hits like a hammer.", "slayer_task": "75", "melee_animation": "422", "range_animation": "0", @@ -180265,67 +163524,6 @@ "range_level": "1", "attack_level": "38" }, - { - "death_animation": "6791", - "name": "Mounted terrorbird gnome", - "defence_level": "1", - "safespot": null, - "lifepoints": "55", - "melee_animation": "6790", - "strength_level": "1", - "id": "6110", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "6792" - }, - { - "death_animation": "6791", - "name": "Mounted terrorbird gnome", - "defence_level": "1", - "safespot": null, - "lifepoints": "55", - "melee_animation": "6790", - "strength_level": "1", - "id": "6111", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "6792" - }, - { - "examine": "Aww", - "slayer_task": "7", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Ducklings", - "defence_level": "1", - "water_npc": "true", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "6112", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "death_animation": "750", - "name": "Duck", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "melee_animation": "747", - "strength_level": "1", - "id": "6113", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "3268" - }, { "examine": "A messy bird.", "slayer_task": "7", @@ -180614,186 +163812,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "50", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6142", - "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "25", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6143", - "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "50", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6144", - "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "50", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6145", - "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6146", - "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "15", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6147", - "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6148", - "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6149", - "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "70", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6150", - "bonuses": "150,150,150,75,75,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6151", - "bonuses": "150,150,150,150,37,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "70", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6152", - "bonuses": "150,150,75,150,75,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "70", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6153", - "bonuses": "75,75,150,150,75,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, { "examine": "The Void Knight will soon weaken the shield.", "attack_speed": "5", @@ -181187,49 +164205,6 @@ "range_level": "1", "attack_level": "44" }, - { - "examine": "The tongue of evil.", - "melee_animation": "9130", - "range_animation": "1552", - "attack_speed": "4", - "respawn_delay": "60", - "defence_animation": "9132", - "slayer_exp": "120", - "magic_animation": "1552", - "death_animation": "9131", - "name": "Bloodveld", - "defence_level": "30", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "6215", - "aggressive": "true", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "1582", - "range_animation": "1582", - "respawn_delay": "25", - "defence_animation": "1581", - "weakness": "7", - "magic_animation": "1582", - "death_animation": "1580", - "name": "Pyrefiend", - "defence_level": "25", - "safespot": null, - "lifepoints": "48", - "strength_level": "25", - "id": "6216", - "aggressive": "true", - "bonuses": "25,25,20,40,40,40,15,30,20,60,20,0,0,0,0", - "clue_level": "1", - "range_level": "1", - "attack_level": "25" - }, { "examine": "A small ice demon.", "melee_animation": "8080", @@ -181881,30 +164856,6 @@ "attack_level": "1", "prj_height": "92" }, - { - "agg_radius": "64", - "examine": "The bane of darkness.", - "melee_animation": "6376", - "range_animation": "6376", - "magic_level": "125", - "respawn_delay": "50", - "defence_animation": "6375", - "weakness": "7", - "slayer_exp": "0", - "magic_animation": "6376", - "death_animation": "6377", - "name": "Starlight", - "defence_level": "120", - "poison_immune": "true", - "safespot": null, - "lifepoints": "160", - "strength_level": "125", - "id": "6248", - "aggressive": "true", - "bonuses": "60,60,60,0,0,12,14,13,5,13,0,10,0,0,0", - "range_level": "1", - "attack_level": "120" - }, { "name": "", "defence_level": "1", @@ -181916,34 +164867,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Defender of the faithful.", - "start_gfx": "1184", - "combat_style": "2", - "melee_animation": "7019", - "attack_speed": "5", - "respawn_delay": "50", - "slayer_exp": "0", - "magic_animation": "7019", - "death_animation": "7016", - "lifepoints": "146", - "id": "6250", - "aggressive": "true", - "bonuses": "10,10,10,0,0,12,14,14,18,5,0,7,0,0,0", - "prj_height": "0", - "agg_radius": "64", - "range_animation": "7019", - "magic_level": "150", - "end_gfx": "1186", - "defence_animation": "7017", - "name": "Growler", - "defence_level": "120", - "safespot": null, - "strength_level": "101", - "range_level": "1", - "projectile": "1185", - "attack_level": "100" - }, { "name": "", "defence_level": "1", @@ -183733,28 +166656,7 @@ "attack_level": "1" }, { - "examine": "Flies like a rock.", - "melee_animation": "9454", - "range_animation": "1516", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9455", - "slayer_exp": "105", - "magic_animation": "1516", - "death_animation": "1518", - "name": "Gargoyle", - "defence_level": "107", - "safespot": null, - "lifepoints": "105", - "strength_level": "95", - "id": "6389", - "aggressive": "true", - "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { + "examine": "Stinky.", "name": "Goblin", "defence_level": "1", "safespot": null, @@ -183767,6 +166669,7 @@ "attack_level": "1" }, { + "examine": "Smelly.", "name": "Goblin", "defence_level": "1", "safespot": null, @@ -185514,25 +168417,6 @@ "range_level": "1", "attack_level": "55" }, - { - "examine": "A giant", - "melee_animation": "7586", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "7581", - "name": "Scabaras locust", - "defence_level": "55", - "safespot": null, - "lifepoints": "78", - "strength_level": "41", - "id": "6776", - "aggressive": "true", - "range_level": "55", - "attack_level": "41" - }, { "examine": "Bouncy", "slayer_task": "70", @@ -185576,61 +168460,6 @@ "projectile": "11", "attack_level": "41" }, - { - "melee_animation": "7588", - "attack_speed": "6", - "respawn_delay": "60", - "defence_animation": "7590", - "slayer_exp": "62", - "death_animation": "7591", - "name": "Crocodile", - "defence_level": "1", - "safespot": null, - "lifepoints": "72", - "strength_level": "1", - "id": "6779", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Part scarab", - "slayer_task": "70", - "combat_style": "2", - "melee_animation": "7615", - "range_animation": "0", - "magic_level": "55", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "4", - "magic_animation": "0", - "death_animation": "7616", - "name": "Scabaras mage", - "defence_level": "55", - "safespot": null, - "lifepoints": "78", - "strength_level": "41", - "id": "6780", - "aggressive": "true", - "range_level": "1", - "attack_level": "41" - }, - { - "combat_style": "2", - "melee_animation": "7620", - "respawn_delay": "60", - "defence_animation": "7617", - "death_animation": "7616", - "name": "Scabaras mage", - "defence_level": "1", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "6781", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An animated clay statue.", "melee_animation": "0", @@ -187343,17 +170172,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6901", - "range_level": "1", - "attack_level": "1" - }, { "name": "Hatchling dragon", "defence_level": "1", @@ -187365,17 +170183,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6903", - "range_level": "1", - "attack_level": "1" - }, { "name": "Hatchling dragon", "defence_level": "1", @@ -187387,17 +170194,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6905", - "range_level": "1", - "attack_level": "1" - }, { "name": "Hatchling dragon", "defence_level": "1", @@ -187409,17 +170205,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6907", - "range_level": "1", - "attack_level": "1" - }, { "examine": "It's so adorably tiny!", "melee_animation": "0", @@ -187580,54 +170365,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "7003", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "7004", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, { "examine": "Must be the pack leader.", "slayer_task": "92", @@ -187849,46 +170586,6 @@ "range_level": "1", "attack_level": "48" }, - { - "examine": "Irascible", - "slayer_task": "64", - "melee_animation": "8636", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "6", - "magic_animation": "0", - "death_animation": "8640", - "name": "Ogress warrior", - "defence_level": "45", - "safespot": null, - "lifepoints": "64", - "strength_level": "45", - "id": "7079", - "aggressive": "true", - "range_level": "1", - "attack_level": "45" - }, - { - "examine": "Irascible", - "slayer_task": "64", - "melee_animation": "8637", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "6", - "magic_animation": "0", - "death_animation": "8641", - "name": "Ogress warrior", - "defence_level": "45", - "safespot": null, - "lifepoints": "64", - "strength_level": "45", - "id": "7080", - "aggressive": "true", - "range_level": "1", - "attack_level": "45" - }, { "examine": "A large and contentious lady ogre.", "slayer_task": "64", @@ -188086,38 +170783,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "The head farmer", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Farmer Blinkin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7131", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Owner of this homestead.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mrs. Winkin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7132", - "range_level": "1", - "attack_level": "1" - }, { "agg_radius": "64", "examine": "That's one big Ork... ", @@ -188169,94 +170834,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2359", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2360", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2361", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2362", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, { "examine": "A Mourner showing his true identity.", "melee_animation": "0", @@ -188403,26 +170980,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs... especially really big ones!", - "melee_animation": "2368", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "68", - "safespot": null, - "lifepoints": "97", - "strength_level": "68", - "id": "2452", - "aggressive": "true", - "range_level": "1", - "attack_level": "68" - }, { "examine": "Heavy rock!", "melee_animation": "0", @@ -188502,167 +171059,6 @@ "projectile": "294", "attack_level": "90" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "5", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "20", - "safespot": null, - "lifepoints": "19", - "strength_level": "5", - "id": "2463", - "aggressive": "true", - "bonuses": "25,85,105,75,103,85,65,0,0,0,0,0,0,0,0", - "range_level": "5", - "projectile": "337", - "attack_level": "5" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "10", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "40", - "safespot": null, - "lifepoints": "40", - "strength_level": "10", - "id": "2464", - "aggressive": "true", - "bonuses": "35,105,125,95,128,105,85,0,0,0,0,0,0,0,0", - "range_level": "10", - "projectile": "337", - "attack_level": "10" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "15", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "50", - "safespot": null, - "lifepoints": "60", - "strength_level": "15", - "id": "2465", - "aggressive": "true", - "bonuses": "35,185,185,155,188,125,165,0,0,0,0,0,0,0,0", - "range_level": "15", - "projectile": "337", - "attack_level": "15" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "25", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "60", - "safespot": null, - "lifepoints": "80", - "strength_level": "45", - "id": "2466", - "aggressive": "true", - "bonuses": "45,235,235,205,238,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "35", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "70", - "safespot": null, - "lifepoints": "105", - "strength_level": "45", - "id": "2467", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "45", - "respawn_delay": "25", - "defence_animation": "2300", - "weakness": "9", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "90", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "2468", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, { "examine": "A Retired Highwayman", "combat_style": "1", @@ -189456,132 +171852,6 @@ "projectile": "442", "attack_level": "70" }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2610", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2611", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2612", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2613", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2614", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2615", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2616", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, { "name": "Tz-Kih", "defence_level": "1", @@ -189935,22 +172205,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A strange man with a strange name. Probably a strange past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Longbow Ben", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2691", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She quackers.", "slayer_task": "7", @@ -190357,22 +172611,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A wise barbarian", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Otto Godblessed", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2725", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Holy looking.", "melee_animation": "0", @@ -190685,29 +172923,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "From a darker dimension.", - "slayer_task": "25", - "melee_animation": "2731", - "range_animation": "2731", - "attack_speed": "4", - "magic_level": "160", - "defence_animation": "2732", - "weakness": "4", - "slayer_exp": "225", - "magic_animation": "2731", - "death_animation": "2733", - "name": "Dark beast", - "defence_level": "120", - "safespot": null, - "lifepoints": "220", - "strength_level": "160", - "id": "2783", - "aggressive": "true", - "bonuses": "0,0,0,0,0,30,40,100,90,100,0,0,0,0,0", - "range_level": "1", - "attack_level": "140" - }, { "examine": "Digging.", "melee_animation": "0", @@ -191958,44 +174173,6 @@ "range_level": "255", "attack_level": "255" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "1312", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "1313", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "240", - "strength_level": "1", - "id": "2885", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "name": "Boulder", "defence_level": "1", @@ -192044,25 +174221,6 @@ "projectile": "288", "attack_level": "1" }, - { - "examine": "It wasn't a rock... It was a rock lobster!", - "melee_animation": "2860", - "range_animation": "2860", - "attack_speed": "2", - "defence_animation": "2861", - "weakness": "7", - "magic_animation": "2860", - "death_animation": "2862", - "name": "Rock lobster", - "defence_level": "100", - "safespot": null, - "lifepoints": "150", - "strength_level": "100", - "id": "2889", - "bonuses": "0,0,0,0,0,100,100,50,50,150,0,0,0,0,0", - "range_level": "1", - "attack_level": "100" - }, { "agg_radius": "12", "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", @@ -192171,22 +174329,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Lovely", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Bones", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2945", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Obviously punches above his weight.", "melee_animation": "0", @@ -192448,68 +174590,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "King rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "2982", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not a soft touch.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pusskins", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2984", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A not-so friendly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Captain Tom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2986", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fully grown feline.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mittens", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2988", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Cute and fluffy.", "melee_animation": "0", @@ -194564,50 +176644,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7438", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7439", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7440", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7441", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He holds up passers by.", "melee_animation": "386", @@ -195396,22 +177432,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Looks after your Farming tools.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Brawler", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7559", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Looks after your Farming tools.", "melee_animation": "0", @@ -195647,54 +177667,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A penguin pushing paper", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Torcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7585", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A penguin pushing paper", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Torcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7586", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He's a little rough around the edges.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shifter", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7593", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He has unbelievable strength!", "melee_animation": "0", @@ -197271,24 +179243,6 @@ "name": "Yeti", "id": "130" }, - { - "examine": "Servant of the Duke of Lumbridge.", - "melee_animation": "422", - "range_animation": "422", - "attack_speed": "4", - "magic_level": "22", - "defence_animation": "404", - "magic_animation": "422", - "death_animation": "9055", - "name": "Hans", - "defence_level": "14", - "safespot": "0", - "lifepoints": "12", - "strength_level": "17", - "id": "0", - "range_level": "1", - "attack_level": "17" - }, { "examine": "He grows the crops in this area.", "melee_animation": "422", @@ -197363,22 +179317,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A man down on his luck.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Tramp", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "11", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Not very civilised looking.", "name": "Barbarian", @@ -197704,26 +179642,6 @@ "range_level": "1", "attack_level": "31" }, - { - "examine": "A soldier of the town of Yanille.", - "melee_animation": "390", - "range_animation": "0", - "combat_audio": "511,513,512", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Soldier", - "defence_level": "26", - "safespot": null, - "lifepoints": "22", - "strength_level": "25", - "id": "35", - "range_level": "1", - "attack_level": "26" - }, { "examine": "The head gardener.", "melee_animation": "0", @@ -197808,27 +179726,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "slayer_task": "7", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "weakness": "9", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "41", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Freshly sheared.", "melee_animation": "0", @@ -197953,23 +179850,6 @@ "range_level": "1", "attack_level": "40" }, - { - "examine": "A dragon covered in frost and ice.", - "combat_audio": "408,410,409", - "magic_level": "116", - "respawn_delay": "25", - "weakness": "0", - "name": "Baby dragon", - "defence_level": "112", - "safespot": null, - "lifepoints": "160", - "strength_level": "103", - "id": "51", - "aggressive": "true", - "bonuses": "124,130,137,184,176,128,168,145,104,54,0,0,0,0,0", - "range_level": "80", - "attack_level": "102" - }, { "examine": "A wood nymph.", "melee_animation": "0", @@ -198047,27 +179927,6 @@ "range_level": "1", "attack_level": "20" }, - { - "examine": "Incey wincey.", - "slayer_task": "76", - "melee_animation": "6249", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "2", - "magic_animation": "0", - "death_animation": "6251", - "name": "Spider", - "defence_level": "1", - "safespot": null, - "lifepoints": "1", - "strength_level": "1", - "id": "61", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A barely visible deadly jungle spider.", "slayer_task": "76", @@ -198384,32 +180243,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "4", - "magic_level": "1", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "81", - "safespot": null, - "lifepoints": "89", - "strength_level": "78", - "id": "83", - "aggressive": "true", - "bonuses": "0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "76" - }, { "examine": "A creature made from clay.", "melee_animation": "422", @@ -198612,262 +180445,6 @@ "range_level": "1", "attack_level": "35" }, - { - "examine": "An ugly green creature.", - "melee_animation": "6185", - "range_animation": "6185", - "combat_audio": "469,472,471", - "attack_speed": "4", - "defence_animation": "6183", - "slayer_exp": "5", - "magic_animation": "6185", - "death_animation": "6182", - "name": "Goblin", - "defence_level": "1", - "safespot": null, - "lifepoints": "5", - "strength_level": "1", - "id": "100", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "An ugly green creature.", - "melee_animation": "6185", - "range_animation": "6185", - "combat_audio": "469,472,471", - "attack_speed": "5", - "defence_animation": "6183", - "slayer_exp": "5", - "magic_animation": "6185", - "death_animation": "6182", - "name": "Goblin", - "defence_level": "3", - "safespot": null, - "lifepoints": "10", - "strength_level": "2", - "id": "101", - "clue_level": "0", - "range_level": "1", - "attack_level": "3" - }, - { - "examine": "An ugly green creature.", - "melee_animation": "6185", - "range_animation": "6185", - "combat_audio": "469,472,471", - "attack_speed": "5", - "defence_animation": "6183", - "slayer_exp": "16", - "magic_animation": "6185", - "death_animation": "6182", - "name": "Goblin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "2", - "id": "102", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Eek! A bear!", - "slayer_task": "6", - "melee_animation": "4925", - "range_animation": "0", - "combat_audio": "498,500,499", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "27", - "magic_animation": "0", - "death_animation": "4929", - "name": "Grizzly bear", - "defence_level": "23", - "safespot": null, - "lifepoints": "32", - "strength_level": "23", - "id": "105", - "aggressive": "true", - "range_level": "1", - "attack_level": "23" - }, - { - "examine": "Eek! A bear!", - "slayer_task": "6", - "melee_animation": "4925", - "range_animation": "0", - "combat_audio": "498,500,499", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "25", - "magic_animation": "0", - "death_animation": "4929", - "name": "Black bear", - "defence_level": "17", - "safespot": null, - "lifepoints": "24", - "strength_level": "17", - "id": "106", - "range_level": "1", - "attack_level": "17" - }, - { - "melee_animation": "6254", - "combat_audio": "3611,3612,3610", - "respawn_delay": "60", - "defence_animation": "6255", - "slayer_exp": "17", - "death_animation": "6256", - "name": "Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "17", - "strength_level": "1", - "id": "107", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Tiny", - "slayer_task": "71", - "melee_animation": "6254", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "respawn_delay": "60", - "defence_animation": "6255", - "weakness": "0", - "magic_animation": "0", - "death_animation": "6256", - "name": "Pit Scorpion", - "defence_level": "40", - "safespot": null, - "lifepoints": "57", - "strength_level": "1", - "id": "109", - "aggressive": "true", - "range_level": "40", - "attack_level": "1" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "110", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "He's got icicles in his beard.", - "slayer_task": "47", - "melee_animation": "4672", - "range_animation": "0", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "70", - "magic_animation": "0", - "death_animation": "4673", - "name": "Ice giant", - "defence_level": "40", - "safespot": null, - "lifepoints": "70", - "strength_level": "40", - "id": "111", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "40" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "112", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "An aggressive humanoid.", - "melee_animation": "128", - "range_animation": "128", - "attack_speed": "5", - "defence_animation": "129", - "magic_animation": "128", - "death_animation": "131", - "name": "Jogre", - "defence_level": "41", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "113", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "41" - }, - { - "examine": "Big, ugly, and smelly.", - "melee_animation": "359", - "range_animation": "359", - "attack_speed": "6", - "magic_level": "27", - "respawn_delay": "25", - "defence_animation": "360", - "magic_animation": "359", - "death_animation": "361", - "name": "Mogre", - "defence_level": "27", - "safespot": null, - "lifepoints": "60", - "strength_level": "27", - "id": "114", - "aggressive": "true", - "bonuses": "15,15,10,20,40,15,50,50,50,20,50,58,0,0,0", - "range_level": "27", - "attack_level": "27" - }, { "examine": "A large dim looking humanoid.", "melee_animation": "359", @@ -199207,29 +180784,6 @@ "range_level": "1", "attack_level": "63" }, - { - "examine": "Wow! Scorpions shouldn't grow that big.", - "slayer_task": "71", - "melee_animation": "6254", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "17", - "magic_animation": "0", - "death_animation": "6256", - "name": "King Scorpion", - "defence_level": "28", - "safespot": null, - "lifepoints": "40", - "strength_level": "21", - "id": "144", - "aggressive": "true", - "range_level": "28", - "attack_level": "21" - }, { "examine": "A cold-hearted elemental warrior.", "slayer_task": "48", @@ -199657,24 +181211,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Rogueish.", - "melee_animation": "386", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Rogue", - "defence_level": "7", - "safespot": null, - "lifepoints": "10", - "strength_level": "7", - "id": "187", - "range_level": "1", - "attack_level": "7" - }, { "examine": "An evil human cleric.", "start_gfx": "99", @@ -199840,48 +181376,6 @@ "range_level": "1", "attack_level": "28" }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "1595", - "range_animation": "1595", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "1596", - "weakness": "7", - "magic_animation": "1595", - "death_animation": "1597", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1631", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "1595", - "range_animation": "1595", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "1596", - "weakness": "7", - "magic_animation": "1595", - "death_animation": "1597", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1632", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, { "examine": "Has a fearsome posture.", "melee_animation": "390", @@ -199955,7 +181449,7 @@ "lifepoints": "17", "strength_level": "12", "id": "206", - "aggressive": "true", + "aggressive": "false", "clue_level": "1", "range_level": "1", "attack_level": "12" @@ -200369,25 +181863,6 @@ "range_level": "1", "attack_level": "46" }, - { - "examine": "A large", - "melee_animation": "6254", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "6256", - "name": "Khazard Scorpion", - "defence_level": "36", - "safespot": null, - "lifepoints": "51", - "strength_level": "27", - "id": "271", - "aggressive": "true", - "range_level": "36", - "attack_level": "27" - }, { "examine": "A guard who has devoted their life to Armadyl.", "range_animation": "0", @@ -200571,25 +182046,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "288", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An official of Ardougne.", "melee_animation": "0", @@ -200884,40 +182340,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A mourner", - "melee_animation": "414", - "range_animation": "0", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Mourner", - "defence_level": "24", - "safespot": null, - "lifepoints": "34", - "strength_level": "24", - "id": "347", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A mourner", - "melee_animation": "422", - "range_animation": "0", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Mourner", - "defence_level": "24", - "safespot": null, - "lifepoints": "34", - "strength_level": "24", - "id": "348", - "range_level": "1", - "attack_level": "24" - }, { "examine": "A child of West Ardougne.", "melee_animation": "0", @@ -200966,17 +182388,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Paladin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "365", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Smells very chemically...", "melee_animation": "0", @@ -201067,23 +182478,6 @@ "range_level": "27", "attack_level": "27" }, - { - "examine": "A pirate.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "498,500,499", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Redbeard Frank", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "375", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Inspects people's packages.", "melee_animation": "0", @@ -201133,47 +182527,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Looks vicious!", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "3611,3612,3610", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Kharid Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "385", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Looks vicious!", - "name": "Kharid Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "3611,3612,3610", - "strength_level": "1", - "id": "386", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Looks vicious!", - "name": "Kharid Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "3611,3612,3610", - "strength_level": "1", - "id": "387", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Could do with a shave...", "melee_animation": "0", @@ -201207,22 +182560,6 @@ "range_level": "1", "attack_level": "3" }, - { - "examine": "A brightly coloured game bird.", - "melee_animation": "2371", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "2373", - "name": "River troll", - "defence_level": "3", - "safespot": null, - "lifepoints": "50", - "strength_level": "3", - "id": "392", - "range_level": "1", - "attack_level": "3" - }, { "examine": "Beefy.", "slayer_task": "20", @@ -202305,22 +183642,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Likes you more", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shop assistant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "525", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A product of a consumerist society.", "melee_animation": "0", @@ -202337,22 +183658,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Likes you more", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shop assistant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "527", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Has an interesting assortment of items for sale.", "melee_animation": "0", @@ -202466,22 +183771,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Ironically", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shopkeeper", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "551", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Helps the shopkeeper sell swords.", "melee_animation": "0", @@ -203602,18 +184891,6 @@ "range_level": "1", "attack_level": "1" }, - { - "slayer_exp": "0", - "examine": "It's an NPC.", - "name": "Edmond", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "714", - "range_level": "1", - "attack_level": "1" - }, { "examine": "In charge of people with silly outfits.", "melee_animation": "0", @@ -204444,24 +185721,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Tough-looking.", - "slayer_task": "64", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Ogre chieftain", - "defence_level": "58", - "safespot": null, - "lifepoints": "331", - "strength_level": "58", - "id": "852", - "range_level": "1", - "attack_level": "58" - }, { "name": "Gorad", "defence_level": "1", @@ -205031,25 +186290,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "951", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A holy man.", "melee_animation": "0", @@ -205409,1608 +186649,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "One of the guardians of Iban.", - "melee_animation": "64", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "65", - "death_animation": "67", - "name": "Holthion", - "defence_level": "1", - "safespot": null, - "lifepoints": "90", - "strength_level": "1", - "id": "1000", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A user of dark magic.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "0", - "name": "Dark mage", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1001", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A dark magic user.", - "melee_animation": "422", - "range_animation": "0", - "magic_level": "32", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "836", - "name": "Disciple of Iban", - "defence_level": "32", - "safespot": null, - "lifepoints": "45", - "strength_level": "24", - "id": "1002", - "range_level": "1", - "attack_level": "24" - }, - { - "melee_animation": "6249", - "respawn_delay": "60", - "defence_animation": "6250", - "death_animation": "6251", - "name": "Spider", - "defence_level": "1", - "safespot": null, - "lifepoints": "2", - "strength_level": "1", - "id": "1004", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A servant of Zamorak.", - "combat_style": "2", - "melee_animation": "811", - "range_animation": "0", - "attack_speed": "5", - "magic_level": "60", - "spell_id": "43", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "811", - "death_animation": "836", - "name": "Zamorak wizard", - "defence_level": "50", - "safespot": null, - "lifepoints": "73", - "strength_level": "50", - "id": "1007", - "aggressive": "true", - "range_level": "50", - "attack_level": "50" - }, - { - "examine": "A green skinned croaker", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Swamp toad", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1013", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Useful for hitting rocks.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "death_animation": "0", - "name": "Iron pickaxe", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1015", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "slayer_task": "7", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "weakness": "9", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "1017", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He rules the", - "slayer_task": "7", - "melee_animation": "5387", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "5389", - "name": "Rooster", - "defence_level": "2", - "safespot": null, - "lifepoints": "2", - "strength_level": "2", - "id": "1018", - "range_level": "1", - "attack_level": "2" - }, - { - "examine": "A fire elemental.", - "melee_animation": "1029", - "range_animation": "0", - "magic_level": "32", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "1031", - "name": "Fire elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "24", - "id": "1019", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "An earth elemental.", - "melee_animation": "4868", - "range_animation": "0", - "attack_speed": "7", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "death_animation": "4870", - "name": "Earth elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "32", - "id": "1020", - "aggressive": "true", - "range_level": "1", - "attack_level": "32" - }, - { - "examine": "An air elemental.", - "melee_animation": "1040", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "1", - "magic_animation": "0", - "death_animation": "1041", - "name": "Air elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "24", - "id": "1021", - "range_level": "32", - "attack_level": "24" - }, - { - "examine": "A water elemental.", - "melee_animation": "1044", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "1", - "magic_animation": "0", - "death_animation": "1048", - "name": "Water elemental", - "defence_level": "32", - "safespot": null, - "movement_radius": "4", - "lifepoints": "45", - "strength_level": "24", - "id": "1022", - "range_level": "32", - "attack_level": "24" - }, - { - "examine": "Could his name be 'Lurch'?", - "melee_animation": "7183", - "slayer_exp": "50", - "death_animation": "7185", - "name": "Vampire", - "defence_level": "52", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "1023", - "clue_level": "1", - "range_level": "1", - "attack_level": "52" - }, - { - "examine": "An evil human cleric.", - "start_gfx": "99", - "combat_style": "2", - "combat_audio": "511,513,512", - "melee_animation": "422", - "range_animation": "0", - "attack_speed": "4", - "magic_level": "25", - "end_gfx": "101", - "respawn_delay": "60", - "defence_animation": "404", - "weakness": "3", - "magic_animation": "711", - "death_animation": "836", - "name": "Monk of Zamorak", - "defence_level": "22", - "safespot": null, - "lifepoints": "20", - "strength_level": "18", - "id": "1044", - "aggressive": "true", - "range_level": "1", - "projectile": "100", - "attack_level": "18" - }, - { - "examine": "An evil human cleric.", - "start_gfx": "99", - "combat_style": "2", - "combat_audio": "511,513,512", - "melee_animation": "422", - "range_animation": "0", - "attack_speed": "4", - "magic_level": "25", - "end_gfx": "101", - "respawn_delay": "60", - "defence_animation": "404", - "weakness": "3", - "magic_animation": "711", - "death_animation": "836", - "name": "Monk of Zamorak", - "defence_level": "17", - "safespot": null, - "lifepoints": "10", - "strength_level": "8", - "id": "1045", - "aggressive": "true", - "range_level": "1", - "projectile": "100", - "attack_level": "8" - }, - { - "examine": "An evil human cleric.", - "start_gfx": "99", - "combat_style": "2", - "combat_audio": "511,513,512", - "melee_animation": "422", - "range_animation": "0", - "attack_speed": "4", - "magic_level": "40", - "end_gfx": "101", - "respawn_delay": "60", - "defence_animation": "404", - "weakness": "3", - "magic_animation": "711", - "death_animation": "836", - "name": "Monk of Zamorak", - "defence_level": "25", - "safespot": null, - "lifepoints": "25", - "strength_level": "25", - "id": "1046", - "aggressive": "true", - "range_level": "1", - "projectile": "100", - "attack_level": "25" - }, - { - "examine": "Ticket trader for the Brimhaven Agility Arena.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "703,705,704", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pirate Jackie the Fruit", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1055", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A member of the audience.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Strange watcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1057", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A member of the audience.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Strange watcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1058", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A member of the audience.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Strange watcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1059", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Commander of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Denulth", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1060", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A sergeant of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Sergeant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1061", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1063", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "1064", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "name": "Soldier", - "defence_level": "44", - "safespot": null, - "lifepoints": "55", - "combat_audio": "511,513,512", - "strength_level": "44", - "id": "1065", - "magic_level": "1", - "range_level": "1", - "attack_level": "44" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1066", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1067", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1068", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A soldier of the Imperial Guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Soldier", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1069", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A Burthorpe Castle Archer.", - "start_gfx": "19", - "combat_style": "1", - "melee_animation": "426", - "range_animation": "426", - "magic_level": "1", - "respawn_delay": "12", - "defence_animation": "404", - "magic_animation": "426", - "death_animation": "9055", - "name": "Archer", - "defence_level": "44", - "safespot": null, - "lifepoints": "55", - "strength_level": "1", - "id": "1073", - "bonuses": "54,68,75,72,67,81,54,35,35,0,0,0,0,0,0", - "range_level": "44", - "projectile": "10", - "attack_level": "1" - }, - { - "examine": "A Burthorpe Castle Archer.", - "start_gfx": "19", - "combat_style": "1", - "melee_animation": "426", - "range_animation": "426", - "magic_level": "1", - "respawn_delay": "12", - "defence_animation": "404", - "magic_animation": "426", - "death_animation": "9055", - "name": "Archer", - "defence_level": "44", - "safespot": null, - "lifepoints": "55", - "strength_level": "1", - "id": "1074", - "bonuses": "54,68,75,72,67,81,54,35,35,0,0,0,0,0,0", - "range_level": "44", - "projectile": "10", - "attack_level": "1" - }, - { - "examine": "A Burthorpe Castle guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "magic_level": "1", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "33", - "safespot": null, - "lifepoints": "44", - "strength_level": "33", - "id": "1076", - "clue_level": "1", - "range_level": "1", - "attack_level": "33" - }, - { - "examine": "A Burthorpe Castle guard.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "magic_level": "1", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "33", - "safespot": null, - "lifepoints": "44", - "strength_level": "33", - "id": "1077", - "clue_level": "1", - "range_level": "1", - "attack_level": "33" - }, - { - "examine": "A servant for Prince Anlaf.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Servant", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1081", - "range_level": "1", - "attack_level": "1" - }, - { - "death_animation": "836", - "name": "Ocga", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1085", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "death_animation": "836", - "name": "Penda", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1087", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "death_animation": "836", - "name": "Hygd", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1088", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "death_animation": "836", - "name": "Ceolburg", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "422", - "strength_level": "1", - "id": "1089", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, - { - "examine": "The knight seems to be watching something.", - "melee_animation": "7042", - "range_animation": "0", - "combat_audio": "511,513,512", - "attack_speed": "8", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "White Knight", - "defence_level": "27", - "safespot": null, - "lifepoints": "38", - "strength_level": "27", - "id": "1092", - "range_level": "1", - "attack_level": "27" - }, - { - "examine": "The biggest and baddest troll.", - "slayer_task": "83", - "melee_animation": "6523", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Rock", - "defence_level": "63", - "safespot": null, - "lifepoints": "90", - "strength_level": "63", - "id": "1095", - "aggressive": "true", - "range_level": "1", - "attack_level": "63" - }, - { - "examine": "A big", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "7", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Stick", - "defence_level": "61", - "safespot": null, - "lifepoints": "87", - "strength_level": "61", - "id": "1096", - "aggressive": "true", - "range_level": "1", - "attack_level": "61" - }, - { - "name": "Pee Hat", - "defence_level": "1", - "safespot": null, - "lifepoints": "126", - "strength_level": "1", - "id": "1097", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Kraka", - "defence_level": "1", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "attack_speed": "6", - "id": "1098", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Dung", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1099", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Ash", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1100", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1101", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1102", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1103", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1104", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but mean, ugly and throws rocks.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower Troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1105", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1106", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1107", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1108", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1109", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1110", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1111", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1112", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "One of the troll generals.", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll general", - "defence_level": "65", - "safespot": null, - "lifepoints": "92", - "strength_level": "65", - "id": "1115", - "aggressive": "true", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "One of the troll generals.", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll general", - "defence_level": "65", - "safespot": null, - "lifepoints": "92", - "strength_level": "65", - "id": "1116", - "aggressive": "true", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "One of the troll generals.", - "slayer_task": "83", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll general", - "defence_level": "65", - "safespot": null, - "lifepoints": "92", - "strength_level": "65", - "id": "1117", - "aggressive": "true", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1118", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1119", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1120", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1121", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1122", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1123", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "He's watching the arena.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Troll spectator", - "defence_level": "47", - "safespot": null, - "lifepoints": "67", - "strength_level": "47", - "id": "1124", - "range_level": "1", - "attack_level": "47" - }, - { - "examine": "An unusually large troll.", - "slayer_task": "83", - "melee_animation": "1158", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Dad", - "defence_level": "55", - "safespot": null, - "lifepoints": "157", - "strength_level": "55", - "id": "1125", - "range_level": "1", - "attack_level": "55" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Twig", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1126", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Berry", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1127", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "melee_animation": "5821", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Twig", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1128", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "He's guarding the cells.", - "slayer_task": "83", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "name": "Berry", - "defence_level": "50", - "safespot": null, - "lifepoints": "71", - "strength_level": "50", - "id": "1129", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1130", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1131", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1132", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1133", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "agg_radius": "6", - "examine": "Small for a troll, but it's mean, ugly and throws rocks.", - "slayer_task": "83", - "start_gfx": "33", - "combat_style": "1", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "7", - "respawn_delay": "35", - "defence_animation": "285", - "weakness": "0", - "magic_animation": "284", - "death_animation": "287", - "name": "Thrower troll", - "defence_level": "30", - "safespot": null, - "lifepoints": "95", - "strength_level": "41", - "id": "1134", - "aggressive": "true", - "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "276", - "attack_level": "41" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1135", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1136", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Human is his speciality.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1137", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Small for a troll, but mean and ugly.", - "slayer_task": "83", - "melee_animation": "284", - "range_animation": "284", - "attack_speed": "5", - "defence_animation": "285", - "weakness": "7", - "magic_animation": "284", - "death_animation": "287", - "name": "Mountain troll", - "defence_level": "53", - "safespot": null, - "lifepoints": "90", - "strength_level": "20", - "id": "1138", - "range_level": "1", - "attack_level": "53" - }, - { - "examine": "He's fast asleep.", - "slayer_task": "83", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "7", - "magic_animation": "0", - "death_animation": "0", - "name": "Mushroom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1139", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "This beast doesn't need climbing boots.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mountain goat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1140", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "This beast doesn't need climbing boots.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mountain goat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1141", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He's guarding the storeroom.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1142", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He's guarding the storeroom.", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "511,513,512", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Guard", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "1143", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "name": "Guard", "defence_level": "1", @@ -207137,50 +186775,6 @@ "range_level": "1", "attack_level": "50" }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "1183", - "clue_level": "2", - "range_level": "72", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "68", - "safespot": null, - "lifepoints": "85", - "strength_level": "68", - "id": "1184", - "clue_level": "2", - "range_level": "1", - "attack_level": "68" - }, { "examine": "An elven city guard.", "melee_animation": "0", @@ -207344,25 +186938,6 @@ "range_level": "1", "attack_level": "42" }, - { - "examine": "I don't want to get on the wrong side of him.", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "426", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "105", - "strength_level": "1", - "id": "1201", - "clue_level": "2", - "range_level": "1", - "projectile": "249", - "attack_level": "1" - }, { "examine": "One of King Tyras's men.", "melee_animation": "395", @@ -207603,17 +187178,6 @@ "range_level": "1", "attack_level": "46" }, - { - "name": "Wizard", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "1263", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A follower of Saradomin.", "melee_animation": "376", @@ -207636,27 +187200,6 @@ "range_level": "70", "attack_level": "90" }, - { - "examine": "No one likes crabs...", - "melee_animation": "1312", - "range_animation": "1312", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "1313", - "weakness": "7", - "magic_animation": "1312", - "death_animation": "1314", - "name": "Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "51", - "strength_level": "1", - "id": "1265", - "bonuses": "-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A rocky outcrop.", "melee_animation": "1312", @@ -207676,26 +187219,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs...", - "melee_animation": "1312", - "range_animation": "1312", - "attack_speed": "5", - "defence_animation": "1313", - "magic_animation": "1312", - "death_animation": "1314", - "name": "Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "1267", - "aggressive": "true", - "bonuses": "-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75", - "clue_level": "0", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A rocky outcrop.", "melee_animation": "1312", @@ -209079,44 +188602,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "1401", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "1402", - "range_level": "1", - "attack_level": "1" - }, { "death_animation": "5389", "name": "Rooster", @@ -209356,18 +188841,6 @@ "range_level": "1", "attack_level": "5" }, - { - "slayer_exp": "17", - "name": "Scorpion", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "3611,3612,3610", - "strength_level": "1", - "id": "1477", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A very dangerous looking spider", "slayer_task": "76", @@ -209895,205 +189368,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1582", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1583", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1584", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1585", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "1586", - "aggressive": "true", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "1587", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "1588", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Young but still dangerous.", - "slayer_task": "68", - "melee_animation": "25", - "range_animation": "25", - "combat_audio": "408,410,409", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "32", - "defence_animation": "26", - "weakness": "3", - "magic_animation": "25", - "death_animation": "28", - "name": "Baby red dragon", - "defence_level": "42", - "safespot": null, - "lifepoints": "50", - "strength_level": "40", - "id": "1589", - "aggressive": "true", - "bonuses": "50,40,64,60,30,45,40,40,20,40,40,20,0,0,0", - "range_level": "1", - "attack_level": "40" - }, { "examine": "Its scales seem to be made of bronze.", "slayer_task": "13", @@ -210214,92 +189488,6 @@ "range_level": "1", "attack_level": "25" }, - { - "examine": "A spiky crawling critter. ", - "slayer_task": "16", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "weakness": "1", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1600", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "38", - "attack_level": "28" - }, - { - "examine": "A spiky crawling critter. ", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1601", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "A spiky crawling critter. ", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1602", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "A spiky crawling critter. ", - "melee_animation": "266", - "range_animation": "266", - "attack_speed": "4", - "poisonous": "true", - "respawn_delay": "25", - "defence_animation": "267", - "slayer_exp": "22", - "magic_animation": "266", - "death_animation": "265", - "name": "Cave crawler", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "1603", - "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, { "examine": "A very smelly ghost.", "slayer_task": "0", @@ -210408,28 +189596,6 @@ "projectile": "335", "attack_level": "1" }, - { - "examine": "Flies like a rock.", - "melee_animation": "9454", - "range_animation": "1516", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9455", - "slayer_exp": "105", - "magic_animation": "1516", - "death_animation": "1518", - "name": "Gargoyle", - "defence_level": "107", - "safespot": null, - "lifepoints": "105", - "strength_level": "95", - "id": "1610", - "aggressive": "true", - "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, { "examine": "Flies like a rock.", "slayer_task": "84", @@ -210471,26 +189637,6 @@ "range_level": "1", "attack_level": "9" }, - { - "examine": "An evil death demon.", - "melee_animation": "9487", - "range_animation": "1528", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9489", - "magic_animation": "1528", - "death_animation": "9488", - "name": "Nechryael", - "defence_level": "105", - "safespot": null, - "lifepoints": "105", - "strength_level": "97", - "id": "1613", - "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "97" - }, { "examine": "An evil death spawn.", "melee_animation": "1540", @@ -210513,29 +189659,6 @@ "range_level": "1", "attack_level": "67" }, - { - "examine": "A denizen of the Abyss!", - "slayer_task": "1", - "melee_animation": "1537", - "range_animation": "1537", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "0", - "weakness": "1", - "slayer_exp": "150", - "magic_animation": "1537", - "death_animation": "1538", - "name": "Abyssal demon", - "defence_level": "135", - "safespot": null, - "lifepoints": "150", - "strength_level": "67", - "id": "1615", - "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "97" - }, { "examine": "The eyes of evil.", "melee_animation": "260", @@ -210574,110 +189697,6 @@ "range_level": "75", "attack_level": "80" }, - { - "examine": "The tongue of evil.", - "melee_animation": "9130", - "range_animation": "1552", - "attack_speed": "4", - "respawn_delay": "60", - "defence_animation": "9132", - "slayer_exp": "120", - "magic_animation": "1552", - "death_animation": "9131", - "name": "Bloodveld", - "defence_level": "30", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "1618", - "aggressive": "true", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { - "examine": "The tongue of evil.", - "melee_animation": "9130", - "range_animation": "1552", - "attack_speed": "4", - "respawn_delay": "60", - "defence_animation": "9132", - "slayer_exp": "120", - "magic_animation": "1552", - "death_animation": "9131", - "name": "Bloodveld", - "defence_level": "30", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "1619", - "aggressive": "true", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { - "examine": "The winged reptile.", - "slayer_task": "19", - "melee_animation": "7762", - "range_animation": "7762", - "attack_speed": "5", - "defence_animation": "7761", - "weakness": "2", - "slayer_exp": "37", - "magic_animation": "7762", - "death_animation": "7763", - "name": "Cockatrice", - "defence_level": "35", - "safespot": null, - "lifepoints": "37", - "strength_level": "32", - "id": "1620", - "bonuses": "30,30,30,30,30,35,0,0,0,0,0,0,0,0,0", - "clue_level": "1", - "range_level": "32", - "attack_level": "32" - }, - { - "examine": "The winged reptile.", - "melee_animation": "7762", - "range_animation": "7762", - "attack_speed": "5", - "defence_animation": "7761", - "slayer_exp": "37", - "magic_animation": "7762", - "death_animation": "7763", - "name": "Cockatrice", - "defence_level": "35", - "safespot": null, - "lifepoints": "37", - "strength_level": "32", - "id": "1621", - "bonuses": "30,30,30,30,30,35,0,0,0,0,0,0,0,0,0", - "clue_level": "1", - "range_level": "1", - "attack_level": "32" - }, - { - "examine": "The vacuumed face of evil.", - "slayer_task": "28", - "melee_animation": "1557", - "range_animation": "1557", - "attack_speed": "4", - "defence_animation": "1555", - "weakness": "2", - "slayer_exp": "105", - "magic_animation": "1557", - "death_animation": "1558", - "name": "Dust devil", - "defence_level": "40", - "safespot": null, - "lifepoints": "105", - "strength_level": "70", - "id": "1624", - "range_level": "1", - "attack_level": "105" - }, { "examine": "The cave-dwelling cousin of the dust devils.", "slayer_task": "28", @@ -210696,469 +189715,6 @@ "range_level": "61", "attack_level": "105" }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "9506", - "range_animation": "9506", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "9508", - "weakness": "7", - "magic_animation": "9506", - "death_animation": "9507", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1631", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "A rocky slug.", - "slayer_task": "69", - "melee_animation": "9506", - "range_animation": "9506", - "attack_speed": "5", - "magic_level": "1", - "defence_animation": "9508", - "weakness": "7", - "magic_animation": "9506", - "death_animation": "9507", - "name": "Rockslug", - "defence_level": "30", - "safespot": null, - "lifepoints": "30", - "strength_level": "30", - "id": "1632", - "clue_level": "2", - "range_level": "1", - "attack_level": "24" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1633", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1634", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1635", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "spawn_animation": "8081", - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "8080", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "60", - "defence_animation": "8084", - "weakness": "4", - "slayer_exp": "45", - "death_animation": "8078", - "name": "Pyrefiend", - "defence_level": "19", - "safespot": null, - "lifepoints": "45", - "strength_level": "29", - "id": "1636", - "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", - "clue_level": "1", - "range_level": "19", - "attack_level": "22" - }, - { - "examine": "It's a Jelly.", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "8569", - "attack_speed": "5", - "magic_level": "40", - "defence_animation": "8571", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "8569", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "40", - "safespot": null, - "lifepoints": "75", - "strength_level": "45", - "id": "1637", - "clue_level": "2", - "range_level": "40", - "attack_level": "40" - }, - { - "examine": "Doesn't look so tough...", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "0", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "49", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "1638", - "clue_level": "2", - "range_level": "49", - "attack_level": "1" - }, - { - "examine": "Wibbly.", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "0", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "49", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "1639", - "clue_level": "2", - "range_level": "49", - "attack_level": "1" - }, - { - "examine": "There's always room for jelly.", - "slayer_task": "51", - "melee_animation": "8569", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "75", - "magic_animation": "0", - "death_animation": "8570", - "name": "Jelly", - "defence_level": "49", - "safespot": null, - "lifepoints": "140", - "strength_level": "1", - "id": "1640", - "clue_level": "2", - "range_level": "49", - "attack_level": "1" - }, - { - "melee_animation": "8569", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "8571", - "slayer_exp": "75", - "name": "Jelly", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "1641", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "8569", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "8571", - "slayer_exp": "75", - "name": "Jelly", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "1642", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Now THAT'S handy.", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "9125", - "attack_speed": "5", - "respawn_delay": "20", - "defence_animation": "9127", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "9125", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "5", - "safespot": null, - "lifepoints": "16", - "strength_level": "5", - "id": "1648", - "bonuses": "5,0,0,0,0,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "5" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1649", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1650", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1651", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Gimmie five. Actually", - "slayer_task": "21", - "melee_animation": "9125", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "19", - "magic_animation": "0", - "death_animation": "9126", - "name": "Crawling Hand", - "defence_level": "8", - "safespot": null, - "lifepoints": "5", - "strength_level": "8", - "id": "1652", - "range_level": "1", - "attack_level": "8" - }, - { - "examine": "Now THAT's handy.", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1653", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "I'm glad it's just the hand I can see...", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1654", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "A big severed hand.", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1655", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "Give the guy a big hand.....", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1656", - "range_level": "1", - "attack_level": "13" - }, - { - "examine": "A big severed hand.", - "slayer_task": "21", - "melee_animation": "9444", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "slayer_exp": "16", - "magic_animation": "0", - "death_animation": "9445", - "name": "Crawling Hand", - "defence_level": "13", - "safespot": null, - "lifepoints": "18", - "strength_level": "13", - "id": "1657", - "range_level": "1", - "attack_level": "13" - }, { "examine": "He's in charge of the Skullball Course.", "melee_animation": "0", @@ -211240,27 +189796,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "His beard seems to have a life of its own.", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "magic_level": "1", - "defence_animation": "4665", - "weakness": "3", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "60", - "safespot": null, - "lifepoints": "120", - "strength_level": "60", - "id": "1681", - "aggressive": "true", - "bonuses": "66,62,0,0,0,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, { "examine": "A trader from across the eastern sea.", "start_gfx": "0", @@ -211338,22 +189873,22 @@ "melee_animation": "422", "range_animation": "0", "attack_speed": "5", - "magic_level": "38", + "magic_level": "1", "respawn_delay": "60", "defence_animation": "0", "weakness": "3", - "slayer_exp": "25", + "slayer_exp": "51", "magic_animation": "0", "death_animation": "836", "name": "Tortured soul", "defence_level": "38", "safespot": null, - "lifepoints": "85", - "strength_level": "28", + "lifepoints": "51", + "strength_level": "62", "id": "1698", "aggressive": "true", "range_level": "1", - "attack_level": "28" + "attack_level": "52" }, { "examine": "A guard for the humans against monster group.", @@ -212440,28 +190975,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Flies like a rock.", - "melee_animation": "9454", - "range_animation": "1516", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9455", - "slayer_exp": "105", - "magic_animation": "1516", - "death_animation": "1518", - "name": "Gargoyle", - "defence_level": "107", - "safespot": null, - "lifepoints": "105", - "strength_level": "95", - "id": "1827", - "aggressive": "true", - "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, { "examine": "It didn't get that big eating flies!", "melee_animation": "1793", @@ -213674,23 +192187,6 @@ "range_level": "40", "attack_level": "30" }, - { - "melee_animation": "7588", - "attack_speed": "6", - "respawn_delay": "60", - "defence_animation": "7590", - "slayer_exp": "62", - "death_animation": "7591", - "name": "Crocodile", - "defence_level": "1", - "safespot": null, - "lifepoints": "63", - "strength_level": "1", - "id": "1993", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He has had his day.", "slayer_task": "27", @@ -214042,78 +192538,6 @@ "range_level": "1", "attack_level": "65" }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2044", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2045", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2046", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2047", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2048", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2049", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "name": "Skogre", "defence_level": "1", @@ -214126,66 +192550,6 @@ "respawn_delay": "60", "attack_level": "1" }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2051", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2052", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2053", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2054", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Zogre", - "defence_level": "1", - "safespot": null, - "lifepoints": "71", - "strength_level": "1", - "id": "2055", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "name": "Skogre", "defence_level": "1", @@ -215231,7 +193595,7 @@ "attack_level": "1" }, { - "examine": "A rich landlord", + "examine": "A rich landlord, fat and jolly.", "melee_animation": "0", "range_animation": "0", "defence_animation": "0", @@ -215503,21 +193867,6 @@ "range_level": "1", "attack_level": "1" }, - { - "melee_animation": "401", - "attack_speed": "6", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Khazard trooper", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "2245", - "range_level": "1", - "attack_level": "1" - }, { "examine": "It's one of General Khazard's warriors.", "melee_animation": "429", @@ -215537,51 +193886,6 @@ "range_level": "1", "attack_level": "32" }, - { - "combat_style": "1", - "melee_animation": "190", - "respawn_delay": "60", - "defence_animation": "193", - "death_animation": "196", - "name": "Gnome troop", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2247", - "range_level": "1", - "attack_level": "1" - }, - { - "combat_style": "1", - "melee_animation": "190", - "respawn_delay": "60", - "defence_animation": "193", - "death_animation": "196", - "name": "Gnome troop", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2248", - "range_level": "1", - "attack_level": "1" - }, - { - "combat_audio": "511,513,512", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Paladin", - "defence_level": "1", - "safespot": null, - "lifepoints": "66", - "strength_level": "1", - "id": "2256", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An initiate of Zamorak.", "melee_animation": "0", @@ -215598,27 +193902,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A blood-drinking denizen of the abyss.", - "melee_animation": "2181", - "range_animation": "0", - "attack_speed": "3", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "slayer_exp": "0", - "magic_animation": "0", - "death_animation": "2183", - "name": "Abyssal leech", - "defence_level": "52", - "safespot": null, - "lifepoints": "74", - "strength_level": "1", - "id": "2263", - "aggressive": "true", - "range_level": "52", - "attack_level": "1" - }, { "examine": "It seems to have eyes in the back of its head...", "melee_animation": "2186", @@ -215640,26 +193923,6 @@ "range_level": "135", "attack_level": "65" }, - { - "examine": "Apparently walks the abyss.", - "melee_animation": "2192", - "range_animation": "2192", - "attack_speed": "5", - "defence_animation": "2193", - "weakness": "8", - "slayer_exp": "0", - "magic_animation": "2192", - "death_animation": "2194", - "name": "Abyssal walker", - "defence_level": "55", - "safespot": null, - "lifepoints": "95", - "strength_level": "116", - "id": "2265", - "aggressive": "true", - "range_level": "1", - "attack_level": "60" - }, { "examine": "A snowman armed with a holly bow.", "melee_animation": "0", @@ -215868,21 +194131,6 @@ "range_level": "1", "attack_level": "1" }, - { - "melee_animation": "400", - "respawn_delay": "60", - "defence_animation": "425", - "death_animation": "836", - "name": "Sir Leye", - "defence_level": "1", - "safespot": null, - "lifepoints": "21", - "strength_level": "1", - "id": "2285", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An observer for the Temple Knights.", "melee_animation": "0", @@ -215979,17 +194227,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "511,513,512", - "strength_level": "1", - "id": "2309", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Young, but still beefy.", "slayer_task": "20", @@ -216027,63 +194264,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2313", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2314", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Yep. Definitely a chicken.", - "melee_animation": "5387", - "range_animation": "5387", - "combat_audio": "355,357,356", - "attack_speed": "6", - "respawn_delay": "18", - "defence_animation": "5388", - "magic_animation": "5387", - "death_animation": "5389", - "name": "Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "strength_level": "1", - "id": "2315", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Swine.", "melee_animation": "0", @@ -216246,94 +194426,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2359", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2360", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2361", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2362", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, { "examine": "A Mourner showing his true identity.", "melee_animation": "0", @@ -216480,26 +194572,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs... especially really big ones!", - "melee_animation": "2368", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "68", - "safespot": null, - "lifepoints": "97", - "strength_level": "68", - "id": "2452", - "aggressive": "true", - "range_level": "1", - "attack_level": "68" - }, { "examine": "Heavy rock!", "melee_animation": "0", @@ -216580,167 +194652,6 @@ "projectile": "294", "attack_level": "68" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "5", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "20", - "safespot": null, - "lifepoints": "19", - "strength_level": "5", - "id": "2463", - "aggressive": "true", - "bonuses": "25,85,105,75,103,85,65,0,0,0,0,0,0,0,0", - "range_level": "5", - "projectile": "337", - "attack_level": "5" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "10", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "40", - "safespot": null, - "lifepoints": "40", - "strength_level": "10", - "id": "2464", - "aggressive": "true", - "bonuses": "35,105,125,95,128,105,85,0,0,0,0,0,0,0,0", - "range_level": "10", - "projectile": "337", - "attack_level": "10" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "15", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "50", - "safespot": null, - "lifepoints": "60", - "strength_level": "15", - "id": "2465", - "aggressive": "true", - "bonuses": "35,185,185,155,188,125,165,0,0,0,0,0,0,0,0", - "range_level": "15", - "projectile": "337", - "attack_level": "15" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "25", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "60", - "safespot": null, - "lifepoints": "80", - "strength_level": "45", - "id": "2466", - "aggressive": "true", - "bonuses": "45,235,235,205,238,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "35", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "70", - "safespot": null, - "lifepoints": "105", - "strength_level": "45", - "id": "2467", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "45", - "respawn_delay": "25", - "defence_animation": "2300", - "weakness": "9", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "90", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "2468", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, { "examine": "A Retired Highwayman", "combat_style": "1", @@ -217444,132 +195355,6 @@ "projectile": "442", "attack_level": "70" }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2610", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2611", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2612", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2613", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2614", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2615", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2616", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, { "name": "Tz-Kih", "defence_level": "1", @@ -217941,22 +195726,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A strange man with a strange name. Probably a strange past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Longbow Ben", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2691", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She quackers.", "slayer_task": "7", @@ -218343,22 +196112,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A wise barbarian", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Otto Godblessed", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2725", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Holy looking.", "melee_animation": "0", @@ -218671,29 +196424,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "From a darker dimension.", - "slayer_task": "25", - "melee_animation": "2731", - "range_animation": "2731", - "attack_speed": "4", - "magic_level": "160", - "defence_animation": "2732", - "weakness": "4", - "slayer_exp": "225", - "magic_animation": "2731", - "death_animation": "2733", - "name": "Dark beast", - "defence_level": "120", - "safespot": null, - "lifepoints": "220", - "strength_level": "160", - "id": "2783", - "aggressive": "true", - "bonuses": "0,0,0,0,0,30,40,100,90,100,0,0,0,0,0", - "range_level": "1", - "attack_level": "140" - }, { "examine": "Digging.", "melee_animation": "0", @@ -219634,44 +197364,6 @@ "range_level": "255", "attack_level": "255" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "1312", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "1313", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "240", - "strength_level": "1", - "id": "2885", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "name": "Boulder", "defence_level": "1", @@ -219720,25 +197412,6 @@ "projectile": "288", "attack_level": "1" }, - { - "examine": "It wasn't a rock... It was a rock lobster!", - "melee_animation": "2860", - "range_animation": "2860", - "attack_speed": "2", - "defence_animation": "2861", - "weakness": "7", - "magic_animation": "2860", - "death_animation": "2862", - "name": "Rock lobster", - "defence_level": "100", - "safespot": null, - "lifepoints": "150", - "strength_level": "100", - "id": "2889", - "bonuses": "0,0,0,0,0,100,100,50,50,150,0,0,0,0,0", - "range_level": "1", - "attack_level": "100" - }, { "agg_radius": "12", "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", @@ -219847,22 +197520,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Lovely", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Bones", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2945", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Obviously punches above his weight.", "melee_animation": "0", @@ -220124,68 +197781,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "King rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "2982", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not a soft touch.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pusskins", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2984", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A not-so friendly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Captain Tom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2986", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fully grown feline.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mittens", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2988", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Cute and fluffy.", "melee_animation": "0", @@ -221911,24 +199506,6 @@ "range_level": "1", "attack_level": "28" }, - { - "examine": "One of RuneScape's many citizens", - "melee_animation": "422", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Drunken man", - "defence_level": "4", - "safespot": null, - "lifepoints": "5", - "strength_level": "4", - "id": "3222", - "range_level": "1", - "attack_level": "4" - }, { "examine": "He tries to keep order around here.", "melee_animation": "386", @@ -222252,314 +199829,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Alberich", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3246", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Fafner", - "melee_animation": "7048", - "range_animation": "7048", - "attack_speed": "6", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "7048", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "18", - "strength_level": "22", - "id": "3247", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Fasolt", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3248", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Siegmund", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3249", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Siegfried", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3250", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Lydspor", - "melee_animation": "7048", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3251", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Hagen", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3252", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Minarch", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3253", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Wotan", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3255", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Acelin", - "melee_animation": "390", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3256", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Adelino", - "melee_animation": "2067", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3257", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Adolpho", - "melee_animation": "401", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3258", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Aitan", - "melee_animation": "426", - "range_animation": "426", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "31", - "strength_level": "22", - "id": "3259", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, - { - "examine": "Brunnhilde", - "melee_animation": "428", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "20", - "safespot": null, - "lifepoints": "28", - "strength_level": "20", - "id": "3260", - "clue_level": "0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Gutrune", - "melee_animation": "428", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "20", - "safespot": null, - "lifepoints": "28", - "strength_level": "20", - "id": "3261", - "clue_level": "0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Edelschwarz", - "melee_animation": "428", - "range_animation": "0", - "defence_animation": "0", - "weakness": "8", - "magic_animation": "0", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "20", - "safespot": null, - "lifepoints": "28", - "strength_level": "20", - "id": "3262", - "clue_level": "0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Sieglinde", - "melee_animation": "428", - "range_animation": "428", - "attack_speed": "6", - "defence_animation": "404", - "weakness": "8", - "magic_animation": "428", - "death_animation": "836", - "name": "Barbarian", - "defence_level": "22", - "safespot": null, - "lifepoints": "20", - "strength_level": "20", - "id": "3263", - "clue_level": "0", - "range_level": "1", - "attack_level": "22" - }, { "examine": "An ugly green creature.", "melee_animation": "6185", @@ -223128,6 +200397,7 @@ "name": "Fairy chef", "defence_level": "1", "safespot": null, + "movement_radius": "2", "lifepoints": "10", "strength_level": "1", "id": "3322", @@ -223182,112 +200452,6 @@ "range_level": "300", "attack_level": "200" }, - { - "examine": "Holy Mole-y!", - "melee_animation": "3312", - "range_animation": "3312", - "attack_speed": "4", - "magic_level": "200", - "respawn_delay": "56", - "defence_animation": "3311", - "weakness": "7", - "magic_animation": "3312", - "death_animation": "3310", - "name": "Giant Mole", - "defence_level": "200", - "safespot": null, - "lifepoints": "200", - "strength_level": "200", - "id": "3340", - "bonuses": "0,0,0,0,0,60,80,100,80,60,0,0,0,0,0", - "range_level": "1", - "attack_level": "200" - }, - { - "examine": "I will call him", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Baby Mole", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3341", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fun guy. No wait", - "melee_animation": "0", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Fungi", - "defence_level": "1", - "safespot": null, - "lifepoints": "65", - "strength_level": "1", - "id": "3344", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "2776", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "2775", - "death_animation": "2777", - "name": "Fungi", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "3345", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A bouncy fungus.", - "slayer_task": "94", - "melee_animation": "2776", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "1", - "magic_animation": "0", - "death_animation": "2777", - "name": "Zygomite", - "defence_level": "42", - "safespot": null, - "lifepoints": "60", - "strength_level": "1", - "id": "3346", - "range_level": "42", - "attack_level": "1" - }, - { - "melee_animation": "2776", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "2775", - "death_animation": "2777", - "name": "Zygomite", - "defence_level": "1", - "safespot": null, - "lifepoints": "75", - "strength_level": "1", - "id": "3347", - "range_level": "1", - "attack_level": "1" - }, { "melee_animation": "7049", "combat_audio": "511,513,512", @@ -223336,119 +200500,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3366", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3367", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3368", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3369", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3370", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Evil Chicken", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "355,357,356", - "strength_level": "1", - "id": "3371", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "slayer_task": "7", - "melee_animation": "2299", - "range_animation": "0", - "combat_audio": "355,357,356", - "magic_level": "55", - "respawn_delay": "0", - "defence_animation": "0", - "weakness": "10", - "magic_animation": "0", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "55", - "safespot": null, - "lifepoints": "117", - "strength_level": "55", - "id": "3375", - "aggressive": "true", - "range_level": "55", - "attack_level": "55" - }, - { - "examine": "Young but still dangerous.", - "slayer_task": "68", - "melee_animation": "25", - "range_animation": "25", - "combat_audio": "408,410,409", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "32", - "defence_animation": "26", - "weakness": "3", - "slayer_exp": "0", - "magic_animation": "25", - "death_animation": "28", - "name": "Baby black dragon", - "defence_level": "42", - "safespot": null, - "lifepoints": "50", - "strength_level": "80", - "id": "3376", - "aggressive": "true", - "bonuses": "50,40,64,60,30,45,40,40,20,40,40,20,0,0,0", - "range_level": "1", - "attack_level": "80" - }, { "examine": "He seems to like wearing black.", "melee_animation": "0", @@ -223743,23 +200794,6 @@ "range_level": "65", "attack_level": "65" }, - { - "examine": "He may be a funky cook", - "melee_animation": "0", - "range_animation": "0", - "combat_audio": "469,472,471", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Goblin Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3413", - "range_level": "1", - "attack_level": "1" - }, { "examine": "More like a goblin cooked.", "melee_animation": "0", @@ -223777,17 +200811,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Goblin Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "469,472,471", - "strength_level": "1", - "id": "3415", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He'll store my items for me.", "melee_animation": "0", @@ -224720,29 +201743,6 @@ "range_level": "27", "attack_level": "27" }, - { - "examine": "Young but still dangerous.", - "melee_animation": "25", - "range_animation": "25", - "combat_audio": "408,410,409", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "32", - "defence_animation": "26", - "weakness": "8", - "magic_animation": "25", - "death_animation": "28", - "name": "Baby red dragon", - "defence_level": "42", - "safespot": null, - "lifepoints": "50", - "strength_level": "40", - "id": "3588", - "aggressive": "true", - "bonuses": "20,10,10,20,40,40,20,40,40,20,0,0,0,0,0", - "range_level": "1", - "attack_level": "40" - }, { "examine": "Its scales seem to be made of steel.", "combat_audio": "408,410,409", @@ -224762,17 +201762,6 @@ "range_level": "185", "attack_level": "234" }, - { - "name": "Dagannoth", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "3591", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Arrgh! Look at its pointy teeth!", "range_animation": "0", @@ -225108,58 +202097,6 @@ "range_level": "1", "attack_level": "25" }, - { - "name": "Angry unicorn", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "496,498,497", - "strength_level": "1", - "id": "3661", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Angry giant rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "3662", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He looks a little on the cross side!", - "slayer_task": "38", - "melee_animation": "6185", - "range_animation": "0", - "combat_audio": "469,472,471", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "6182", - "name": "Angry goblin", - "defence_level": "25", - "safespot": null, - "lifepoints": "35", - "strength_level": "25", - "id": "3663", - "range_level": "1", - "attack_level": "25" - }, - { - "name": "Angry bear", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "498,500,499", - "strength_level": "1", - "id": "3664", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Freshly sheared.", "melee_animation": "5341", @@ -225198,38 +202135,6 @@ "range_level": "1", "attack_level": "2" }, - { - "examine": "If you see them circling", - "melee_animation": "2019", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "2021", - "name": "Vulture", - "defence_level": "38", - "safespot": null, - "lifepoints": "54", - "strength_level": "38", - "id": "3675", - "range_level": "1", - "attack_level": "38" - }, - { - "death_animation": "2026", - "name": "Vulture", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "melee_animation": "2025", - "strength_level": "1", - "id": "3676", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "2024" - }, { "examine": "A young boy handing out flyers.", "melee_animation": "0", @@ -225333,1078 +202238,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "5", - "respawn_delay": "120", - "defence_animation": "3890", - "weakness": "8", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "20", - "safespot": null, - "lifepoints": "13", - "strength_level": "20", - "id": "3727", - "bonuses": "5,10,10,10,10,2,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "10", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "25", - "safespot": null, - "lifepoints": "23", - "strength_level": "25", - "id": "3728", - "bonuses": "10,15,15,15,15,5,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "25" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "10", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "30", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "3729", - "bonuses": "15,20,20,20,20,8,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "15", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "35", - "safespot": null, - "lifepoints": "23", - "strength_level": "35", - "id": "3730", - "bonuses": "20,25,25,25,25,10,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "35" - }, - { - "examine": "Don't burst its bubble!", - "melee_animation": "3891", - "range_animation": "3891", - "magic_level": "20", - "respawn_delay": "120", - "defence_animation": "3890", - "magic_animation": "3891", - "death_animation": "3888", - "name": "Splatter", - "defence_level": "40", - "safespot": null, - "lifepoints": "23", - "strength_level": "40", - "id": "3731", - "bonuses": "25,30,30,30,30,15,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "40" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "14", - "respawn_delay": "127", - "defence_animation": "3902", - "weakness": "9", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "28", - "poison_immune": "true", - "safespot": null, - "lifepoints": "23", - "strength_level": "28", - "id": "3732", - "aggressive": "true", - "bonuses": "20,25,20,40,40,40,40,5,18,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "14", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "28", - "poison_immune": "true", - "safespot": null, - "lifepoints": "23", - "strength_level": "28", - "id": "3733", - "aggressive": "true", - "bonuses": "20,25,20,40,40,40,40,5,18,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "20", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "42", - "poison_immune": "true", - "safespot": null, - "lifepoints": "38", - "strength_level": "42", - "id": "3734", - "aggressive": "true", - "bonuses": "30,35,30,50,50,50,50,10,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "42" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "20", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "42", - "poison_immune": "true", - "safespot": null, - "lifepoints": "38", - "strength_level": "42", - "id": "3735", - "aggressive": "true", - "bonuses": "30,35,30,50,50,50,50,10,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "42" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "25", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "54", - "poison_immune": "true", - "safespot": null, - "lifepoints": "53", - "strength_level": "54", - "id": "3736", - "aggressive": "true", - "bonuses": "35,40,35,60,60,60,60,20,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "54" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "25", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "54", - "poison_immune": "true", - "safespot": null, - "lifepoints": "53", - "strength_level": "54", - "id": "3737", - "aggressive": "true", - "bonuses": "35,40,35,60,60,60,60,20,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "54" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "30", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "60", - "poison_immune": "true", - "safespot": null, - "lifepoints": "68", - "strength_level": "60", - "id": "3738", - "aggressive": "true", - "bonuses": "40,50,40,70,70,70,70,30,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "30", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "60", - "poison_immune": "true", - "safespot": null, - "lifepoints": "68", - "strength_level": "60", - "id": "3739", - "aggressive": "true", - "bonuses": "40,50,40,70,70,70,70,30,15,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "35", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "70", - "poison_immune": "true", - "safespot": null, - "lifepoints": "83", - "strength_level": "70", - "id": "3740", - "aggressive": "true", - "bonuses": "50,60,50,80,70,90,80,35,14,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "70" - }, - { - "examine": "Nippy little thing!", - "melee_animation": "3901", - "range_animation": "3901", - "magic_level": "35", - "respawn_delay": "127", - "defence_animation": "3902", - "magic_animation": "3901", - "death_animation": "3903", - "name": "Shifter", - "defence_level": "70", - "poison_immune": "true", - "safespot": null, - "lifepoints": "83", - "strength_level": "70", - "id": "3741", - "aggressive": "true", - "bonuses": "50,60,50,80,70,90,80,35,14,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "70" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "10", - "respawn_delay": "120", - "defence_animation": "3916", - "weakness": "7", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "15", - "safespot": null, - "lifepoints": "23", - "strength_level": "30", - "id": "3742", - "bonuses": "45,45,45,45,50,5,45,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "15" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "15", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "20", - "safespot": null, - "lifepoints": "38", - "strength_level": "40", - "id": "3743", - "bonuses": "45,45,45,45,50,5,55,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "20", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "30", - "safespot": null, - "lifepoints": "53", - "strength_level": "60", - "id": "3744", - "bonuses": "45,55,55,55,50,10,45,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "45", - "safespot": null, - "lifepoints": "53", - "strength_level": "75", - "id": "3745", - "bonuses": "60,60,60,60,80,10,45,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "45" - }, - { - "examine": "Worse than termites!", - "melee_animation": "3915", - "range_animation": "3915", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "120", - "defence_animation": "3916", - "magic_animation": "3915", - "death_animation": "3917", - "name": "Ravager", - "defence_level": "60", - "safespot": null, - "lifepoints": "53", - "strength_level": "80", - "id": "3746", - "bonuses": "65,70,70,70,90,20,56,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "10", - "respawn_delay": "125", - "defence_animation": "3909", - "weakness": "6", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "20", - "safespot": null, - "lifepoints": "33", - "strength_level": "20", - "id": "3747", - "bonuses": "20,40,40,40,40,10,38,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "20" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "15", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "30", - "safespot": null, - "lifepoints": "50", - "strength_level": "30", - "id": "3748", - "bonuses": "30,60,60,60,60,15,38,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "20", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "40", - "safespot": null, - "lifepoints": "67", - "strength_level": "40", - "id": "3749", - "bonuses": "50,70,70,70,70,20,38,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "40" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "30", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "60", - "safespot": null, - "lifepoints": "101", - "strength_level": "60", - "id": "3750", - "bonuses": "60,100,100,100,100,30,25,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "Eeewww!", - "melee_animation": "3908", - "range_animation": "3908", - "magic_level": "25", - "respawn_delay": "125", - "defence_animation": "3909", - "magic_animation": "3908", - "death_animation": "3910", - "name": "Spinner", - "defence_level": "50", - "safespot": null, - "lifepoints": "84", - "strength_level": "50", - "id": "3751", - "bonuses": "55,80,80,80,85,25,30,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "25", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "weakness": "5", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "25", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "3752", - "aggressive": "true", - "bonuses": "30,30,30,30,15,30,40,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "25", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "25", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "3753", - "aggressive": "true", - "bonuses": "30,30,30,30,15,30,40,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "40", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "40", - "safespot": null, - "lifepoints": "30", - "strength_level": "1", - "id": "3754", - "aggressive": "true", - "bonuses": "45,40,40,40,25,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "40", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "40", - "safespot": null, - "lifepoints": "30", - "strength_level": "1", - "id": "3755", - "aggressive": "true", - "bonuses": "45,40,40,40,25,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "50", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "50", - "safespot": null, - "lifepoints": "42", - "strength_level": "1", - "id": "3756", - "aggressive": "true", - "bonuses": "35,40,40,40,30,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "50", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "50", - "safespot": null, - "lifepoints": "42", - "strength_level": "1", - "id": "3757", - "aggressive": "true", - "bonuses": "35,40,40,40,30,35,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "60", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "60", - "safespot": null, - "lifepoints": "51", - "strength_level": "1", - "id": "3758", - "aggressive": "true", - "bonuses": "60,80,80,80,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "60", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "60", - "safespot": null, - "lifepoints": "51", - "strength_level": "1", - "id": "3759", - "aggressive": "true", - "bonuses": "60,80,80,80,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "70", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "70", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3760", - "aggressive": "true", - "bonuses": "40,100,100,100,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Burn, baby, burn!", - "start_gfx": "646", - "combat_style": "2", - "melee_animation": "3882", - "range_animation": "3882", - "magic_level": "70", - "respawn_delay": "120", - "end_gfx": "648", - "defence_animation": "3880", - "magic_animation": "3882", - "death_animation": "3881", - "name": "Torcher", - "defence_level": "70", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3761", - "aggressive": "true", - "bonuses": "40,100,100,100,50,50,35,0,0,0,0,0,0,0,0", - "range_level": "1", - "projectile": "647", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "30", - "respawn_delay": "120", - "defence_animation": "3921", - "weakness": "0", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "25", - "safespot": null, - "lifepoints": "27", - "strength_level": "1", - "id": "3762", - "aggressive": "true", - "bonuses": "20,40,40,40,40,40,40,40,0,0,0,0,0,0,0", - "range_level": "25", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "30", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "25", - "safespot": null, - "lifepoints": "27", - "strength_level": "1", - "id": "3763", - "aggressive": "true", - "bonuses": "20,40,40,40,40,40,40,40,0,0,0,0,0,0,0", - "range_level": "25", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "40", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "40", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "3764", - "aggressive": "true", - "bonuses": "30,50,60,60,60,60,40,40,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "40", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "40", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "3765", - "aggressive": "true", - "bonuses": "30,40,60,60,60,60,40,40,0,0,0,0,0,0,0", - "range_level": "40", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "50", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "50", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3766", - "aggressive": "true", - "bonuses": "35,65,70,70,70,70,40,40,0,0,0,0,0,0,0", - "range_level": "50", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "50", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "50", - "safespot": null, - "lifepoints": "62", - "strength_level": "1", - "id": "3767", - "aggressive": "true", - "bonuses": "35,65,70,70,70,70,40,40,0,0,0,0,0,0,0", - "range_level": "50", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "60", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "60", - "safespot": null, - "lifepoints": "78", - "strength_level": "1", - "id": "3768", - "aggressive": "true", - "bonuses": "40,90,80,80,80,80,40,40,0,0,0,0,0,0,0", - "range_level": "60", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "60", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "60", - "safespot": null, - "lifepoints": "78", - "strength_level": "1", - "id": "3769", - "aggressive": "true", - "bonuses": "40,90,80,80,80,80,40,40,0,0,0,0,0,0,0", - "range_level": "60", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "start_gfx": "657", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "70", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "70", - "safespot": null, - "lifepoints": "97", - "strength_level": "1", - "id": "3770", - "aggressive": "true", - "bonuses": "50,100,100,100,120,100,40,40,80,0,0,0,0,0,0", - "range_level": "70", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Duck!", - "combat_style": "1", - "melee_animation": "3920", - "range_animation": "3920", - "magic_level": "70", - "respawn_delay": "120", - "defence_animation": "3921", - "magic_animation": "3920", - "death_animation": "3922", - "name": "Defiler", - "defence_level": "70", - "safespot": null, - "lifepoints": "97", - "strength_level": "1", - "id": "3771", - "aggressive": "true", - "bonuses": "50,100,100,100,120,100,40,40,80,0,0,0,0,0,0", - "range_level": "70", - "projectile": "657", - "attack_level": "1" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "14", - "respawn_delay": "120", - "defence_animation": "3895", - "weakness": "9", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "28", - "safespot": null, - "lifepoints": "53", - "strength_level": "28", - "id": "3772", - "aggressive": "true", - "bonuses": "45,45,50,50,50,50,50,15,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "28" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "21", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "42", - "safespot": null, - "lifepoints": "83", - "strength_level": "42", - "id": "3773", - "aggressive": "true", - "bonuses": "45,45,60,50,50,50,50,15,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "42" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "32", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "56", - "safespot": null, - "lifepoints": "113", - "strength_level": "56", - "id": "3774", - "aggressive": "true", - "bonuses": "45,45,60,80,80,80,80,25,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "56" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "38", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "74", - "safespot": null, - "lifepoints": "143", - "strength_level": "74", - "id": "3775", - "aggressive": "true", - "bonuses": "45,45,60,60,60,60,60,20,50,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "74" - }, - { - "examine": "Mind your toes!", - "melee_animation": "3896", - "range_animation": "3896", - "magic_level": "45", - "respawn_delay": "120", - "defence_animation": "3895", - "magic_animation": "3896", - "death_animation": "3894", - "name": "Brawler", - "defence_level": "88", - "safespot": null, - "lifepoints": "173", - "strength_level": "88", - "id": "3776", - "aggressive": "true", - "bonuses": "45,45,80,100,100,100,100,30,46,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "88" - }, { "examine": "Cheerful, helpful and optimistic, I'll bet.", "melee_animation": "0", @@ -227011,18 +202844,6 @@ "range_level": "1", "attack_level": "1" }, - { - "slayer_exp": "37", - "name": "Cockatrice", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4227", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "slayer_exp": "75", "name": "Basilisk", @@ -227034,29 +202855,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A denizen of the Abyss!", - "slayer_task": "1", - "melee_animation": "1537", - "range_animation": "1537", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "0", - "weakness": "1", - "slayer_exp": "150", - "magic_animation": "1537", - "death_animation": "1538", - "name": "Abyssal demon", - "defence_level": "135", - "safespot": null, - "lifepoints": "150", - "strength_level": "67", - "id": "4230", - "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "97" - }, { "name": "Demon butler", "defence_level": "1", @@ -228009,101 +203807,6 @@ "range_level": "1", "attack_level": "63" }, - { - "examine": "A horrible", - "slayer_task": "52", - "melee_animation": "4235", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "45", - "magic_animation": "0", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "48", - "safespot": null, - "lifepoints": "68", - "strength_level": "48", - "id": "4348", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "48" - }, - { - "melee_animation": "4234", - "respawn_delay": "60", - "defence_animation": "4232", - "slayer_exp": "45", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "1", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "4349", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A horrible", - "slayer_task": "52", - "melee_animation": "4235", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "7", - "slayer_exp": "45", - "magic_animation": "0", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "48", - "safespot": null, - "lifepoints": "68", - "strength_level": "48", - "id": "4350", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "48" - }, - { - "melee_animation": "4234", - "respawn_delay": "60", - "defence_animation": "4232", - "slayer_exp": "45", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "1", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "4351", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "4234", - "respawn_delay": "60", - "defence_animation": "4232", - "slayer_exp": "45", - "death_animation": "4233", - "name": "Jungle horror", - "defence_level": "1", - "safespot": null, - "lifepoints": "45", - "strength_level": "1", - "id": "4352", - "aggressive": "true", - "clue_level": "1", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A horrible, emaciated ape like creature with beady red eyes.", "slayer_task": "17", @@ -228369,135 +204072,6 @@ "range_level": "1", "attack_level": "60" }, - { - "examine": "I don't think insect repellent will work…", - "slayer_task": "34", - "melee_animation": "1184", - "range_animation": "1184", - "attack_speed": "3", - "respawn_delay": "30", - "defence_animation": "1186", - "weakness": "0", - "slayer_exp": "25", - "magic_animation": "1184", - "death_animation": "1190", - "name": "Flesh Crawler", - "defence_level": "10", - "safespot": null, - "lifepoints": "25", - "strength_level": "2", - "id": "4389", - "aggressive": "true", - "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't think insect repellent will work…", - "melee_animation": "1184", - "range_animation": "1184", - "attack_speed": "3", - "respawn_delay": "30", - "defence_animation": "1186", - "slayer_exp": "25", - "magic_animation": "1184", - "death_animation": "1190", - "name": "Flesh Crawler", - "defence_level": "10", - "safespot": null, - "lifepoints": "25", - "strength_level": "2", - "id": "4390", - "aggressive": "true", - "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "80" - }, - { - "examine": "I don't think insect repellent will work…", - "melee_animation": "1184", - "range_animation": "1184", - "attack_speed": "3", - "respawn_delay": "30", - "defence_animation": "1186", - "slayer_exp": "25", - "magic_animation": "1184", - "death_animation": "1190", - "name": "Flesh Crawler", - "defence_level": "10", - "safespot": null, - "lifepoints": "25", - "strength_level": "2", - "id": "4391", - "aggressive": "true", - "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "100" - }, - { - "examine": "Examine not added", - "melee_animation": "5568", - "range_animation": "5568", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5567", - "slayer_exp": "30", - "magic_animation": "5568", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "25", - "safespot": null, - "lifepoints": "23", - "strength_level": "1", - "id": "4392", - "bonuses": "15,25,25,25,25,25,25,15,15,25,25,25,25,25,25", - "range_level": "1", - "attack_level": "24" - }, - { - "examine": "Examine not added", - "melee_animation": "5578", - "range_animation": "5578", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5579", - "slayer_exp": "30", - "magic_animation": "5578", - "death_animation": "5580", - "name": "Zombie", - "defence_level": "28", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "4393", - "aggressive": "true", - "bonuses": "15,25,28,28,25,28,28,15,15,28,25,25,25,25,25", - "range_level": "1", - "attack_level": "35" - }, - { - "examine": "Examine not added", - "melee_animation": "5578", - "range_animation": "5578", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5579", - "slayer_exp": "30", - "magic_animation": "5578", - "death_animation": "5580", - "name": "Zombie", - "defence_level": "48", - "safespot": null, - "lifepoints": "40", - "strength_level": "1", - "id": "4394", - "bonuses": "35,45,45,45,45,45,45,35,35,45,45,45,45,45,45", - "range_level": "1", - "attack_level": "47" - }, { "examine": "Overgrown vermin.", "slayer_task": "67", @@ -228636,48 +204210,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "An extremely vicious scorpion.", - "melee_animation": "6254", - "range_animation": "6254", - "combat_audio": "3611,3612,3610", - "attack_speed": "5", - "defence_animation": "6255", - "slayer_exp": "17", - "magic_animation": "6254", - "death_animation": "6256", - "name": "Scorpion", - "defence_level": "49", - "safespot": null, - "lifepoints": "55", - "strength_level": "51", - "id": "4402", - "aggressive": "true", - "bonuses": "12,23,10,51,32,62,29,54,48,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "50" - }, - { - "examine": "An extremely vicious scorpion.", - "melee_animation": "6254", - "range_animation": "6254", - "combat_audio": "3611,3612,3610", - "attack_speed": "5", - "defence_animation": "6255", - "slayer_exp": "17", - "magic_animation": "6254", - "death_animation": "6256", - "name": "Scorpion", - "defence_level": "35", - "safespot": null, - "lifepoints": "37", - "strength_level": "31", - "id": "4403", - "aggressive": "true", - "bonuses": "15,16,12,32,19,38,18,34,32,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "30" - }, { "examine": "Examine not added", "slayer_task": "58", @@ -228865,66 +204397,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Not man's best friend.", - "melee_animation": "6559", - "range_animation": "6559", - "combat_audio": "481,491,490", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "6557", - "slayer_exp": "15", - "magic_animation": "6559", - "death_animation": "6558", - "name": "Wolf", - "defence_level": "9", - "safespot": null, - "lifepoints": "15", - "strength_level": "1", - "id": "4413", - "bonuses": "7,7,7,7,7,7,7,7,7,7,7,7,7,7,7", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not man's best friend.", - "melee_animation": "6559", - "range_animation": "6559", - "combat_audio": "481,491,490", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "6557", - "slayer_exp": "10", - "magic_animation": "6559", - "death_animation": "6558", - "name": "Wolf", - "defence_level": "7", - "safespot": null, - "lifepoints": "69", - "strength_level": "1", - "id": "4414", - "bonuses": "5,5,5,5,5,5,5,5,5,5,5,5,5,5,5", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A popular dwarven delicacy.", - "melee_animation": "2705", - "range_animation": "2705", - "combat_audio": "3102,3104,3103", - "attack_speed": "5", - "defence_animation": "2706", - "magic_animation": "2705", - "death_animation": "2707", - "name": "Rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "2", - "strength_level": "1", - "id": "4415", - "range_level": "1", - "attack_level": "1" - }, { "melee_animation": "4300", "attack_speed": "5", @@ -228973,22 +204445,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Half horse", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Centaur", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4439", - "range_level": "1", - "attack_level": "1" - }, { "examine": "A noble creature!", "melee_animation": "6376", @@ -229491,22 +204947,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "He knows the past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Ethereal Guide", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4506", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Luck is probably on his side.", "melee_animation": "0", @@ -229742,47 +205182,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "85", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "85", - "strength_level": "30", - "id": "4534", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Either a very fremennikey pirate", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Lokar Searunner", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4537", - "range_level": "1", - "attack_level": "1" - }, { "examine": "I always wondered what that job description actually meant...", "melee_animation": "0", @@ -230394,23 +205793,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "What is that thing!", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "weakness": "6", - "magic_animation": "0", - "death_animation": "0", - "name": "Evil creature", - "defence_level": "1", - "safespot": null, - "lifepoints": "0", - "strength_level": "1", - "id": "4615", - "range_level": "1", - "attack_level": "1" - }, { "name": "Goblin", "defence_level": "1", @@ -230551,151 +205933,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "King Healthorg riding his War Tortoise.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Healthorg and tortoise", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4643", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A weasly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Glouphrie the Untrusted", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4645", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "With the prices he charges", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Stan", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4650", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Looks very stylish", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4651", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "That suit looks a little briny around the edges.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4652", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "First storm he is in that hat will blow away.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4653", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "She'll never be able to climb rigging in that.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4654", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "High heels on a ship? What is she thinking?", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4655", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The effect is sort of spoiled by all those tattoos.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Trader Crewmember", - "defence_level": "1", - "movement_radius": "710", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4656", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He works evil magic.", "start_gfx": "93", @@ -230765,32 +206002,6 @@ "projectile": "98", "attack_level": "1" }, - { - "name": "Baby red dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "4667", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "name": "Baby red dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "4668", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "examine": "He's got icicles in his beard.", "slayer_task": "47", @@ -230866,160 +206077,6 @@ "range_level": "1", "attack_level": "40" }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "60", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "60", - "strength_level": "30", - "id": "4688", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4698", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4699", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4700", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "Big, red, and incredibly evil.", - "slayer_task": "40", - "melee_animation": "64", - "range_animation": "64", - "combat_audio": "400,404,403", - "attack_speed": "5", - "magic_level": "59", - "respawn_delay": "32", - "defence_animation": "65", - "weakness": "4", - "slayer_exp": "87", - "magic_animation": "64", - "death_animation": "68", - "name": "Greater demon", - "defence_level": "59", - "safespot": null, - "lifepoints": "87", - "strength_level": "59", - "id": "4701", - "aggressive": "true", - "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", - "clue_level": "2", - "range_level": "59", - "attack_level": "59" - }, - { - "examine": "His beard seems to have a life of its own.", - "slayer_task": "62", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "6", - "magic_level": "1", - "respawn_delay": "30", - "defence_animation": "4665", - "weakness": "1", - "slayer_exp": "85", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Moss giant", - "defence_level": "30", - "safespot": null, - "lifepoints": "85", - "strength_level": "30", - "id": "4706", - "aggressive": "true", - "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "30" - }, { "examine": "A flea-infested black market trader.", "melee_animation": "0", @@ -232749,22 +207806,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Yauchomi, follower of Saradomin.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Prayer Tutor", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "4903", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Feoras looks a bit fiery.", "melee_animation": "0", @@ -232829,22 +207870,6 @@ "range_level": "1", "attack_level": "1" }, - { - "melee_animation": "4868", - "attack_speed": "7", - "respawn_delay": "60", - "defence_animation": "4869", - "death_animation": "4870", - "name": "Earth elemental", - "defence_level": "1", - "safespot": null, - "lifepoints": "35", - "strength_level": "1", - "id": "4910", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An elemental rock.", "melee_animation": "0", @@ -234866,32 +209891,6 @@ "range_level": "58", "attack_level": "58" }, - { - "combat_style": "2", - "name": "Ogre shaman", - "defence_level": "1", - "safespot": null, - "lifepoints": "1", - "strength_level": "1", - "id": "5190", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, - { - "combat_style": "2", - "name": "Ogre shaman", - "defence_level": "1", - "safespot": null, - "lifepoints": "1", - "strength_level": "1", - "id": "5193", - "aggressive": "true", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1" - }, { "examine": "A wizard.", "melee_animation": "0", @@ -234962,38 +209961,6 @@ "range_level": "80", "attack_level": "80" }, - { - "combat_style": "1", - "melee_animation": "5395", - "respawn_delay": "60", - "defence_animation": "5396", - "death_animation": "5937", - "name": "Penance Ranger", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "5229", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "combat_style": "1", - "melee_animation": "5395", - "respawn_delay": "60", - "defence_animation": "5396", - "death_animation": "5937", - "name": "Penance Ranger", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "5237", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Run away! Run away!", "melee_animation": "5411", @@ -235046,28 +210013,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Part scarab", - "slayer_task": "70", - "combat_style": "2", - "melee_animation": "7615", - "range_animation": "0", - "magic_level": "54", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "3", - "magic_animation": "0", - "death_animation": "7616", - "name": "Scarab mage", - "defence_level": "54", - "safespot": null, - "lifepoints": "77", - "strength_level": "40", - "id": "5250", - "aggressive": "true", - "range_level": "1", - "attack_level": "40" - }, { "examine": "A mounted lancer.", "slayer_task": "70", @@ -235126,22 +210071,6 @@ "range_level": "62", "attack_level": "62" }, - { - "combat_style": "2", - "melee_animation": "7615", - "respawn_delay": "60", - "defence_animation": "7617", - "death_animation": "7616", - "name": "Scarab mage", - "defence_level": "1", - "safespot": null, - "lifepoints": "50", - "strength_level": "1", - "id": "5254", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He can look after my money.", "melee_animation": "0", @@ -235241,307 +210170,6 @@ "range_level": "80", "attack_level": "80" }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5293", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5294", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5295", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5296", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5297", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5298", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5299", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5300", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5301", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5302", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5303", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5304", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Examine not added", - "melee_animation": "5568", - "range_animation": "5568", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5567", - "slayer_exp": "30", - "magic_animation": "5568", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "10", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "5305", - "bonuses": "6,15,15,15,15,15,15,6,6,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "11" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "22", - "strength_level": "1", - "id": "5306", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Examine not added", - "melee_animation": "5568", - "range_animation": "5568", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5567", - "slayer_exp": "30", - "magic_animation": "5568", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "10", - "safespot": null, - "lifepoints": "18", - "strength_level": "1", - "id": "5307", - "bonuses": "6,15,15,15,15,15,15,6,6,15,15,15,15,15,15", - "range_level": "1", - "attack_level": "11" - }, - { - "melee_animation": "5568", - "combat_audio": "931,923,922", - "respawn_delay": "60", - "defence_animation": "5567", - "slayer_exp": "30", - "death_animation": "5569", - "name": "Zombie", - "defence_level": "1", - "safespot": null, - "lifepoints": "24", - "strength_level": "1", - "id": "5308", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Examine not added", - "melee_animation": "5571", - "range_animation": "5571", - "combat_audio": "931,923,922", - "attack_speed": "5", - "respawn_delay": "30", - "defence_animation": "5574", - "slayer_exp": "30", - "magic_animation": "5571", - "death_animation": "5575", - "name": "Zombie", - "defence_level": "16", - "safespot": null, - "lifepoints": "40", - "strength_level": "1", - "id": "5309", - "bonuses": "10,15,16,16,15,16,16,10,10,16,15,15,15,15,15", - "range_level": "1", - "attack_level": "15" - }, { "melee_animation": "5568", "combat_audio": "931,923,922", @@ -236073,30 +210701,6 @@ "range_level": "1", "attack_level": "60" }, - { - "examine": "A fiendish embodiment of water.", - "slayer_task": "90", - "combat_style": "1", - "melee_animation": "1582", - "range_animation": "1582", - "attack_speed": "6", - "magic_level": "77", - "defence_animation": "1581", - "weakness": "4", - "magic_animation": "1582", - "death_animation": "1580", - "name": "Waterfiend", - "defence_level": "50", - "poison_immune": "true", - "safespot": null, - "lifepoints": "128", - "strength_level": "167", - "id": "5361", - "aggressive": "true", - "range_level": "167", - "projectile": "16", - "attack_level": "70" - }, { "examine": "It appears to be intelligent and savage.", "slayer_task": "41", @@ -237415,24 +212019,6 @@ "projectile": "276", "attack_level": "80" }, - { - "examine": "A hairy, smelly, grazing animal.", - "melee_animation": "5782", - "range_animation": "5782", - "attack_speed": "5", - "defence_animation": "5783", - "weakness": "7", - "magic_animation": "5782", - "death_animation": "5784", - "name": "Yak", - "defence_level": "30", - "safespot": null, - "lifepoints": "50", - "strength_level": "7", - "id": "5529", - "range_level": "1", - "attack_level": "3" - }, { "examine": "Antisocial.", "melee_animation": "0", @@ -240079,23 +214665,6 @@ "range_level": "1", "attack_level": "20" }, - { - "examine": "A greasy", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Cook", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "5910", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He's suspiciously talented with a meat-cleaver.", "melee_animation": "0", @@ -241489,20 +216058,6 @@ "attack_level": "1", "defence_animation": "425" }, - { - "death_animation": "836", - "name": "Yadviga", - "defence_level": "1", - "safespot": null, - "lifepoints": "60", - "melee_animation": "422", - "strength_level": "1", - "id": "6041", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "425" - }, { "death_animation": "836", "name": "Nikita", @@ -241654,43 +216209,6 @@ "range_level": "1", "attack_level": "20" }, - { - "melee_animation": "6559", - "respawn_delay": "60", - "defence_animation": "6557", - "death_animation": "6558", - "name": "Ice wolf", - "defence_level": "1", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "6052", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Dragon impling", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6054", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Dragon impling", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6064", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She tends the wheat.", "melee_animation": "0", @@ -241990,67 +216508,6 @@ "range_level": "1", "attack_level": "38" }, - { - "death_animation": "6791", - "name": "Mounted terrorbird gnome", - "defence_level": "1", - "safespot": null, - "lifepoints": "55", - "melee_animation": "6790", - "strength_level": "1", - "id": "6110", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "6792" - }, - { - "death_animation": "6791", - "name": "Mounted terrorbird gnome", - "defence_level": "1", - "safespot": null, - "lifepoints": "55", - "melee_animation": "6790", - "strength_level": "1", - "id": "6111", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "6792" - }, - { - "examine": "Aww", - "slayer_task": "7", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Ducklings", - "defence_level": "1", - "water_npc": "true", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "6112", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "death_animation": "750", - "name": "Duck", - "defence_level": "1", - "safespot": null, - "lifepoints": "3", - "melee_animation": "747", - "strength_level": "1", - "id": "6113", - "range_level": "1", - "respawn_delay": "60", - "attack_level": "1", - "defence_animation": "3268" - }, { "examine": "A messy bird.", "slayer_task": "7", @@ -242339,186 +216796,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "50", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6142", - "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "25", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6143", - "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "50", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6144", - "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "50", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "50", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6145", - "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6146", - "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "15", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6147", - "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6148", - "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "The Void Knight will soon weaken the shield.", - "attack_speed": "5", - "magic_level": "30", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "30", - "safespot": null, - "lifepoints": "200", - "strength_level": "1", - "id": "6149", - "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "70", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6150", - "bonuses": "150,150,150,75,75,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "40", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6151", - "bonuses": "150,150,150,150,37,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "70", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6152", - "bonuses": "150,150,75,150,75,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not somewhere I want to go...", - "attack_speed": "5", - "magic_level": "70", - "respawn_delay": "125", - "name": "Portal", - "defence_level": "70", - "safespot": null, - "lifepoints": "250", - "strength_level": "1", - "id": "6153", - "bonuses": "75,75,150,150,75,0,0,0,0,0,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, { "examine": "The Void Knight will soon weaken the shield.", "attack_speed": "5", @@ -242912,49 +217189,6 @@ "range_level": "1", "attack_level": "44" }, - { - "examine": "The tongue of evil.", - "melee_animation": "9130", - "range_animation": "1552", - "attack_speed": "4", - "respawn_delay": "60", - "defence_animation": "9132", - "slayer_exp": "120", - "magic_animation": "1552", - "death_animation": "9131", - "name": "Bloodveld", - "defence_level": "30", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "6215", - "aggressive": "true", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, - { - "examine": "A small fire demon.", - "slayer_task": "66", - "melee_animation": "1582", - "range_animation": "1582", - "respawn_delay": "25", - "defence_animation": "1581", - "weakness": "7", - "magic_animation": "1582", - "death_animation": "1580", - "name": "Pyrefiend", - "defence_level": "25", - "safespot": null, - "lifepoints": "48", - "strength_level": "25", - "id": "6216", - "aggressive": "true", - "bonuses": "25,25,20,40,40,40,15,30,20,60,20,0,0,0,0", - "clue_level": "1", - "range_level": "1", - "attack_level": "25" - }, { "examine": "A small ice demon.", "melee_animation": "8080", @@ -243606,30 +217840,6 @@ "attack_level": "1", "prj_height": "92" }, - { - "agg_radius": "64", - "examine": "The bane of darkness.", - "melee_animation": "6376", - "range_animation": "6376", - "magic_level": "125", - "respawn_delay": "50", - "defence_animation": "6375", - "weakness": "7", - "slayer_exp": "0", - "magic_animation": "6376", - "death_animation": "6377", - "name": "Starlight", - "defence_level": "120", - "poison_immune": "true", - "safespot": null, - "lifepoints": "160", - "strength_level": "125", - "id": "6248", - "aggressive": "true", - "bonuses": "60,60,60,0,0,12,14,13,5,13,0,10,0,0,0", - "range_level": "1", - "attack_level": "120" - }, { "name": "", "defence_level": "1", @@ -243641,34 +217851,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Defender of the faithful.", - "start_gfx": "1184", - "combat_style": "2", - "melee_animation": "7019", - "attack_speed": "5", - "respawn_delay": "50", - "slayer_exp": "0", - "magic_animation": "7019", - "death_animation": "7016", - "lifepoints": "146", - "id": "6250", - "aggressive": "true", - "bonuses": "10,10,10,0,0,12,14,14,18,5,0,7,0,0,0", - "prj_height": "0", - "agg_radius": "64", - "range_animation": "7019", - "magic_level": "150", - "end_gfx": "1186", - "defence_animation": "7017", - "name": "Growler", - "defence_level": "120", - "safespot": null, - "strength_level": "101", - "range_level": "1", - "projectile": "1185", - "attack_level": "100" - }, { "name": "", "defence_level": "1", @@ -245457,28 +219639,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Flies like a rock.", - "melee_animation": "9454", - "range_animation": "1516", - "attack_speed": "4", - "magic_level": "1", - "defence_animation": "9455", - "slayer_exp": "105", - "magic_animation": "1516", - "death_animation": "1518", - "name": "Gargoyle", - "defence_level": "107", - "safespot": null, - "lifepoints": "105", - "strength_level": "95", - "id": "6389", - "aggressive": "true", - "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", - "clue_level": "2", - "range_level": "1", - "attack_level": "75" - }, { "name": "Goblin", "defence_level": "1", @@ -247159,25 +221319,6 @@ "range_level": "1", "attack_level": "55" }, - { - "examine": "A giant", - "melee_animation": "7586", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "7581", - "name": "Scabaras locust", - "defence_level": "55", - "safespot": null, - "lifepoints": "78", - "strength_level": "41", - "id": "6776", - "aggressive": "true", - "range_level": "55", - "attack_level": "41" - }, { "examine": "Bouncy", "slayer_task": "70", @@ -247221,61 +221362,6 @@ "projectile": "11", "attack_level": "41" }, - { - "melee_animation": "7588", - "attack_speed": "6", - "respawn_delay": "60", - "defence_animation": "7590", - "slayer_exp": "62", - "death_animation": "7591", - "name": "Crocodile", - "defence_level": "1", - "safespot": null, - "lifepoints": "72", - "strength_level": "1", - "id": "6779", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Part scarab", - "slayer_task": "70", - "combat_style": "2", - "melee_animation": "7615", - "range_animation": "0", - "magic_level": "55", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "4", - "magic_animation": "0", - "death_animation": "7616", - "name": "Scabaras mage", - "defence_level": "55", - "safespot": null, - "lifepoints": "78", - "strength_level": "41", - "id": "6780", - "aggressive": "true", - "range_level": "1", - "attack_level": "41" - }, - { - "combat_style": "2", - "melee_animation": "7620", - "respawn_delay": "60", - "defence_animation": "7617", - "death_animation": "7616", - "name": "Scabaras mage", - "defence_level": "1", - "safespot": null, - "lifepoints": "70", - "strength_level": "1", - "id": "6781", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "An animated clay statue.", "melee_animation": "0", @@ -248988,17 +223074,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6901", - "range_level": "1", - "attack_level": "1" - }, { "name": "Hatchling dragon", "defence_level": "1", @@ -249010,17 +223085,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6903", - "range_level": "1", - "attack_level": "1" - }, { "name": "Hatchling dragon", "defence_level": "1", @@ -249032,17 +223096,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6905", - "range_level": "1", - "attack_level": "1" - }, { "name": "Hatchling dragon", "defence_level": "1", @@ -249054,17 +223107,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Baby dragon", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "408,410,409", - "strength_level": "1", - "id": "6907", - "range_level": "1", - "attack_level": "1" - }, { "examine": "It's so adorably tiny!", "melee_animation": "0", @@ -249225,54 +223267,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "7003", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, - { - "examine": "A very large elemental adversary.", - "slayer_task": "33", - "melee_animation": "4666", - "range_animation": "4666", - "combat_audio": "449,451,450", - "attack_speed": "5", - "magic_level": "1", - "respawn_delay": "20", - "defence_animation": "4664", - "weakness": "1", - "slayer_exp": "111", - "magic_animation": "4666", - "death_animation": "4668", - "name": "Fire giant", - "defence_level": "65", - "safespot": null, - "lifepoints": "111", - "strength_level": "65", - "id": "7004", - "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", - "range_level": "1", - "attack_level": "65" - }, { "examine": "Must be the pack leader.", "slayer_task": "92", @@ -249494,46 +223488,6 @@ "range_level": "1", "attack_level": "48" }, - { - "examine": "Irascible", - "slayer_task": "64", - "melee_animation": "8636", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "6", - "magic_animation": "0", - "death_animation": "8640", - "name": "Ogress warrior", - "defence_level": "45", - "safespot": null, - "lifepoints": "64", - "strength_level": "45", - "id": "7079", - "aggressive": "true", - "range_level": "1", - "attack_level": "45" - }, - { - "examine": "Irascible", - "slayer_task": "64", - "melee_animation": "8637", - "range_animation": "0", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "6", - "magic_animation": "0", - "death_animation": "8641", - "name": "Ogress warrior", - "defence_level": "45", - "safespot": null, - "lifepoints": "64", - "strength_level": "45", - "id": "7080", - "aggressive": "true", - "range_level": "1", - "attack_level": "45" - }, { "examine": "A large and contentious lady ogre.", "slayer_task": "64", @@ -249731,38 +223685,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "The head farmer", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Farmer Blinkin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7131", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Owner of this homestead.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mrs. Winkin", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7132", - "range_level": "1", - "attack_level": "1" - }, { "agg_radius": "64", "examine": "That's one big Ork... ", @@ -249814,94 +223736,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2359", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "I don't wanna be at the wrong end of that pike.", - "slayer_task": "31", - "melee_animation": "428", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "60", - "safespot": null, - "lifepoints": "85", - "strength_level": "60", - "id": "2360", - "clue_level": "2", - "range_level": "1", - "attack_level": "60" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2361", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, - { - "examine": "He looks pretty handy with that bow.", - "slayer_task": "31", - "start_gfx": "250", - "combat_style": "1", - "melee_animation": "428", - "range_animation": "426", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "2", - "magic_animation": "0", - "death_animation": "836", - "name": "Elf warrior", - "defence_level": "64", - "safespot": null, - "lifepoints": "91", - "strength_level": "1", - "id": "2362", - "clue_level": "2", - "range_level": "64", - "projectile": "249", - "attack_level": "1" - }, { "examine": "A Mourner showing his true identity.", "melee_animation": "0", @@ -250048,26 +223882,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "No one likes crabs... especially really big ones!", - "melee_animation": "2368", - "range_animation": "0", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "0", - "weakness": "9", - "magic_animation": "0", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "68", - "safespot": null, - "lifepoints": "97", - "strength_level": "68", - "id": "2452", - "aggressive": "true", - "range_level": "1", - "attack_level": "68" - }, { "examine": "Heavy rock!", "melee_animation": "0", @@ -250147,167 +223961,6 @@ "projectile": "294", "attack_level": "90" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "5", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "20", - "safespot": null, - "lifepoints": "19", - "strength_level": "5", - "id": "2463", - "aggressive": "true", - "bonuses": "25,85,105,75,103,85,65,0,0,0,0,0,0,0,0", - "range_level": "5", - "projectile": "337", - "attack_level": "5" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "10", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "40", - "safespot": null, - "lifepoints": "40", - "strength_level": "10", - "id": "2464", - "aggressive": "true", - "bonuses": "35,105,125,95,128,105,85,0,0,0,0,0,0,0,0", - "range_level": "10", - "projectile": "337", - "attack_level": "10" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "15", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "50", - "safespot": null, - "lifepoints": "60", - "strength_level": "15", - "id": "2465", - "aggressive": "true", - "bonuses": "35,185,185,155,188,125,165,0,0,0,0,0,0,0,0", - "range_level": "15", - "projectile": "337", - "attack_level": "15" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "25", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "60", - "safespot": null, - "lifepoints": "80", - "strength_level": "45", - "id": "2466", - "aggressive": "true", - "bonuses": "45,235,235,205,238,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "35", - "respawn_delay": "25", - "defence_animation": "2300", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "70", - "safespot": null, - "lifepoints": "105", - "strength_level": "45", - "id": "2467", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, - { - "examine": "A fowl beast.", - "combat_style": "2", - "melee_animation": "2302", - "range_animation": "2302", - "combat_audio": "355,357,356", - "magic_level": "45", - "respawn_delay": "25", - "defence_animation": "2300", - "weakness": "9", - "magic_animation": "2302", - "death_animation": "2301", - "name": "Evil Chicken", - "defence_level": "90", - "safespot": null, - "lifepoints": "120", - "strength_level": "45", - "id": "2468", - "aggressive": "true", - "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", - "range_level": "45", - "projectile": "337", - "attack_level": "45" - }, { "examine": "A Retired Highwayman", "combat_style": "1", @@ -251101,132 +224754,6 @@ "projectile": "442", "attack_level": "70" }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2610", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2611", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2612", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2613", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2614", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2615", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, - { - "examine": "Must be a guard or something.", - "melee_animation": "9345", - "range_animation": "9345", - "magic_level": "70", - "defence_animation": "9287", - "magic_animation": "9345", - "death_animation": "9288", - "name": "TzHaar-Ket", - "defence_level": "70", - "safespot": null, - "lifepoints": "140", - "strength_level": "70", - "id": "2616", - "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", - "range_level": "70", - "attack_level": "70" - }, { "name": "Tz-Kih", "defence_level": "1", @@ -251580,22 +225107,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A strange man with a strange name. Probably a strange past", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Longbow Ben", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2691", - "range_level": "1", - "attack_level": "1" - }, { "examine": "She quackers.", "slayer_task": "7", @@ -251980,22 +225491,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A wise barbarian", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Otto Godblessed", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2725", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Holy looking.", "melee_animation": "0", @@ -252308,29 +225803,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "From a darker dimension.", - "slayer_task": "25", - "melee_animation": "2731", - "range_animation": "2731", - "attack_speed": "4", - "magic_level": "160", - "defence_animation": "2732", - "weakness": "4", - "slayer_exp": "225", - "magic_animation": "2731", - "death_animation": "2733", - "name": "Dark beast", - "defence_level": "120", - "safespot": null, - "lifepoints": "220", - "strength_level": "160", - "id": "2783", - "aggressive": "true", - "bonuses": "0,0,0,0,0,30,40,100,90,100,0,0,0,0,0", - "range_level": "1", - "attack_level": "140" - }, { "examine": "Digging.", "melee_animation": "0", @@ -253581,44 +227053,6 @@ "range_level": "255", "attack_level": "255" }, - { - "examine": "A fearsome magical creature from the deep.", - "combat_style": "2", - "melee_animation": "2365", - "attack_speed": "6", - "spell_id": "48", - "magic_level": "100", - "respawn_delay": "60", - "defence_animation": "2366", - "magic_animation": "2365", - "death_animation": "2367", - "name": "Wallasalki", - "defence_level": "80", - "safespot": null, - "lifepoints": "120", - "strength_level": "1", - "id": "2457", - "aggressive": "true", - "bonuses": "0,0,0,0,0,100,150,175,250,-10,0,0,0,0,0", - "range_level": "1", - "attack_level": "1" - }, - { - "melee_animation": "1312", - "attack_speed": "5", - "respawn_delay": "60", - "defence_animation": "1313", - "death_animation": "1314", - "name": "Giant Rock Crab", - "defence_level": "1", - "safespot": null, - "lifepoints": "240", - "strength_level": "1", - "id": "2885", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "name": "Boulder", "defence_level": "1", @@ -253667,25 +227101,6 @@ "projectile": "288", "attack_level": "1" }, - { - "examine": "It wasn't a rock... It was a rock lobster!", - "melee_animation": "2860", - "range_animation": "2860", - "attack_speed": "2", - "defence_animation": "2861", - "weakness": "7", - "magic_animation": "2860", - "death_animation": "2862", - "name": "Rock lobster", - "defence_level": "100", - "safespot": null, - "lifepoints": "150", - "strength_level": "100", - "id": "2889", - "bonuses": "0,0,0,0,0,100,100,50,50,150,0,0,0,0,0", - "range_level": "1", - "attack_level": "100" - }, { "agg_radius": "12", "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", @@ -253794,22 +227209,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Lovely", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Bones", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2945", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Obviously punches above his weight.", "melee_animation": "0", @@ -254071,68 +227470,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "King rat", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "combat_audio": "703,705,704", - "strength_level": "1", - "id": "2982", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "Not a soft touch.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Pusskins", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2984", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A not-so friendly", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Captain Tom", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2986", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A fully grown feline.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Mittens", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "2988", - "aggressive": "true", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Cute and fluffy.", "melee_animation": "0", @@ -256187,50 +229524,6 @@ "range_level": "1", "attack_level": "1" }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7438", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7439", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7440", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, - { - "name": "Elf warrior", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7441", - "clue_level": "2", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He holds up passers by.", "melee_animation": "386", @@ -257019,22 +230312,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "Looks after your Farming tools.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Brawler", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7559", - "range_level": "1", - "attack_level": "1" - }, { "examine": "Looks after your Farming tools.", "melee_animation": "0", @@ -257270,54 +230547,6 @@ "range_level": "1", "attack_level": "1" }, - { - "examine": "A penguin pushing paper", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Torcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7585", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "A penguin pushing paper", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Torcher", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7586", - "range_level": "1", - "attack_level": "1" - }, - { - "examine": "He's a little rough around the edges.", - "melee_animation": "0", - "range_animation": "0", - "defence_animation": "0", - "magic_animation": "0", - "death_animation": "0", - "name": "Shifter", - "defence_level": "1", - "safespot": null, - "lifepoints": "10", - "strength_level": "1", - "id": "7593", - "range_level": "1", - "attack_level": "1" - }, { "examine": "He has unbelievable strength!", "melee_animation": "0", @@ -259414,5 +232643,778 @@ "examine": "A labrador puppy.", "name": "Labrador", "id": "6895" + }, + { + "examine": "Dwarvish.", + "name": "Thurgo", + "id": "604" + }, + { + "examine": "Get useful information from this guy.", + "name": "Town crier", + "id": "6137" + }, + { + "examine": "The mace salesman.", + "name": "Flynn", + "id": "580" + }, + { + "examine": "Works in the Rising Sun.", + "name": "Kaylee", + "id": "3217" + }, + { + "examine": "Works in the Rising Sun.", + "name": "Emily", + "id": "736" + }, + { + "examine": "Nice eyes.", + "name": "Cassie", + "id": "577" + }, + { + "examine": "Chief Herald of Falador.", + "name": "Sir Renitee", + "id": "4249" + }, + { + "examine": "An elderly White Knight.", + "name": "Sir Vyvin", + "id": "605" + }, + { + "examine": "Head of recruitment for the Temple Knights.", + "name": "Sir Tiffy Cashien", + "id": "2290" + }, + { + "examine": "Smells like fish.", + "name": "Woman", + "id": "3226" + }, + { + "examine": "An armourer.", + "name": "Wayne", + "id": "581" + }, + { + "examine": "A master of necromancy!", + "name": "Malignius Mortifer", + "id": "2713" + }, + { + "examine": "She seems like a nice sort of person.", + "name": "Betty", + "id": "583" + }, + { + "examine": "Loves his gold!", + "name": "Grum", + "id": "556" + }, + { + "examine": "Unkempt and a bit smelly.", + "name": "Bellemorde", + "id": "2942" + }, + { + "examine": "A Fishing expert.", + "name": "Gerrant", + "id": "558" + }, + { + "examine": "Likes his food to be kept fresh.", + "name": "Wydin", + "id": "557" + }, + { + "examine": "A sea bird.", + "name": "Gull", + "id": "2726" + }, + { + "examine": "An old sea dog.", + "name": "Captain Tobias", + "id": "376" + }, + { + "examine": "A young sailor.", + "name": "Klarense", + "id": "744" + }, + { + "examine": "An expert on axes.", + "name": "Brian", + "id": "559" + }, + { + "examine": "I could get a beer from him.", + "name": "Bartender", + "id": "734" + }, + { + "examine": "She is a seed merchant.", + "name": "Olivia", + "id": "2572" + }, + { + "examine": "Get useful information from this guy.", + "name": "Town crier", + "id": "6136" + }, + { + "examine": "Looks like he could do with a sip of Amontillado.", + "name": "Fortunato", + "id": "3671" + }, + { + "examine": "A young sailor.", + "name": "Seaman Thresnor", + "id": "378" + }, + { + "examine": "A young sailor.", + "name": "Seaman Lorris", + "id": "377" + }, + { + "examine": "A venerable and rich sage.", + "name": "Wise Old Man", + "id": "2253" + }, + { + "examine": "She comes from Al-Kharid.", + "name": "Leela", + "id": "915" + }, + { + "examine": "An old sailor.", + "name": "Ned", + "id": "743" + }, + { + "examine": "He looks scared.", + "name": "Morgan", + "id": "755" + }, + { + "examine": "A witch.", + "name": "Aggie", + "id": "922" + }, + { + "examine": "Bacon-in-training.", + "name": "Piglet", + "id": "2243" + }, + { + "examine": "An infamous bandit.", + "name": "Lady Keli", + "id": "919" + }, + { + "examine": "A young prince.", + "name": "Prince Ali", + "id": "920" + }, + { + "examine": "A gnome mage on sabbatical.", + "name": "Professor Onglewip", + "id": "4585" + }, + { + "examine": "Chief of research at Wizards Tower.", + "name": "Sedridor", + "id": "300" + }, + { + "examine": "An old wizard.", + "name": "Traiborn", + "id": "881" + }, + { + "examine": "Master of imps.", + "name": "Wizard Grayzag", + "id": "707" + }, + { + "examine": "A very brave merchant.", + "name": "Edmond", + "id": "1785" + }, + { + "examine": "She's an expert on armoured skirts.", + "name": "Ranael", + "id": "544" + }, + { + "examine": "Spymaster of Al Kharid.", + "name": "Osman", + "id": "924" + }, + { + "examine": "Kebabs are full of meaty goodness!", + "name": "Karim", + "id": "543" + }, + { + "examine": "He can look after my money.", + "name": "Banker", + "id": "496" + }, + { + "examine": "She can look after my money.", + "name": "Banker", + "id": "497" + }, + { + "examine": "Manufacturer of fine leathers.", + "name": "Ellis", + "id": "2824" + }, + { + "examine": "Sells superior scimitars.", + "name": "Zeke", + "id": "541" + }, + { + "examine": "If Crafting's your thing, he's your man.", + "name": "Dommik", + "id": "545" + }, + { + "examine": "He's in control of the Shantay Pass.", + "name": "Shantay", + "id": "836" + }, + { + "examine": "A resident of Al Kharid.", + "name": "Irena", + "id": "835" + }, + { + "examine": "A farmer's enemy.", + "name": "Crow", + "id": "1755" + }, + { + "examine": "The hat's a dead giveaway.", + "name": "Witch", + "id": "5200" + }, + { + "examine": "A mad scientist if I ever saw one!", + "name": "Professor Oddenstein", + "id": "286" + }, + { + "examine": "She's watching you.", + "name": "Ava", + "id": "5198" + }, + { + "examine": "Litara, a barbarian explorer.", + "name": "Litara", + "id": "4376" + }, + { + "examine": "Always up-to-date with the latest helmet fashions.", + "name": "Peksa", + "id": "538" + }, + { + "examine": "A strange little man.", + "name": "Oziach", + "id": "747" + }, + { + "examine": "A very brave merchant.", + "name": "Richard", + "id": "1783" + }, + { + "examine": "Loves you more, the more you spend.", + "name": "Shop assistant", + "id": "529" + }, + { + "examine": "Sells stuff.", + "name": "Shopkeeper", + "id": "528" + }, + { + "examine": "Roald's advisor - he seems to be a follower of Saradomin.", + "name": "Aeonisig Raispher", + "id": "648" + }, + { + "examine": "One of the king's knights.", + "name": "Sir Prysin", + "id": "883" + }, + { + "examine": "Reldo the librarian.", + "name": "Reldo", + "id": "2660" + }, + { + "examine": "A powerful wizard.", + "name": "Surok Magis", + "id": "5834" + }, + { + "examine": "Animal skins are a specialty.", + "name": "Baraek", + "id": "547" + }, + { + "examine": "One of Gertrude's Sons.", + "name": "Shilop", + "id": "781" + }, + { + "examine": "The man with the armour.", + "name": "Horvik", + "id": "549" + }, + { + "examine": "Sells arrows.", + "name": "Lowe", + "id": "550" + }, + { + "examine": "This looks like an angry, aggressive man.", + "name": "Draul Leptoc", + "id": "3324" + }, + { + "examine": "A quiet, more reserved sort of lady.", + "name": "Phillipa", + "id": "3325" + }, + { + "examine": "A tearful damsel, maybe I can help her?", + "name": "Juliet", + "id": "637" + }, + { + "agg_radius": "", + "examine": "Like a mini man!", + "combat_style": "1", + "melee_animation": "190", + "attack_speed": "4", + "respawn_delay": "60", + "defence_animation": "193", + "weakness": "", + "end_height": "", + "death_animation": "196", + "name": "Gnome", + "defence_level": "1", + "lifepoints": "2", + "strength_level": "1", + "id": "2250", + "aggressive": "", + "range_level": "1", + "attack_level": "1" + }, + { + "examine": "Like a mini man!", + "combat_style": "1", + "melee_animation": "190", + "attack_speed": "4", + "respawn_delay": "60", + "defence_animation": "193", + "death_animation": "196", + "name": "Gnome", + "defence_level": "1", + "lifepoints": "3", + "strength_level": "1", + "id": "2249", + "range_level": "1", + "attack_level": "1" + }, + { + "name": "null", + "defence_level": "1", + "safespot": "null", + "combat_audio": "511,513,512", + "id": "2309", + "range_level": "1", + "attack_level": "1", + "defence_animation": "" + }, + { + "examine": "Yanni Salika; he buys and sells antiques.", + "name": "Yanni Salika", + "id": "515" + }, + { + "examine": "This is Kaleb Paramaya, a warm and friendly inn owner.", + "name": "Kaleb Paramaya", + "id": "512" + }, + { + "examine": "This is Fernahei; he owns the local fishing tackle shop.", + "name": "Fernahei", + "id": "517" + }, + { + "examine": "A warrior from Shilo Village.", + "name": "Mosol Rei", + "id": "500" + }, + { + "examine": "An unquiet soul.", + "name": "Spirit of Zadimus", + "id": "501" + }, + { + "examine": "A minion of Rashiliyia.", + "name": "Undead one", + "id": "502" + }, + { + "examine": "A minion of Rashiliyia.", + "name": "Undead one", + "id": "503" + }, + { + "examine": "The animated dead, one of Rashiliyia's minions.", + "name": "Undead one", + "id": "504" + }, + { + "examine": "The animated dead, one of Rashiliyia's minions.", + "name": "Undead one", + "id": "505" + }, + { + "examine": "The animated spirit of Rashiliyia the Zombie Queen.", + "name": "Rashiliyia ", + "id": "506" + }, + { + "examine": "A giant zombie of huge strength and devastating power.", + "name": "Nazastarool", + "id": "507" + }, + { + "examine": "A giant skeleton of huge strength and devastating power.", + "name": "Nazastarool", + "id": "508" + }, + { + "examine": "A giant ghost of huge strength and devastating power.", + "name": "Nazastarool", + "id": "509" + }, + { + "examine": "A dwarf miner. He's shoring up the walls.", + "name": "Ferd", + "id": "3937" + }, + { + "examine": "A crafty dwarf.", + "name": "Nolar", + "id": "2158" + }, + { + "examine": "She sells general items at the Legends Guild.", + "name": "Fionella", + "id": "932" + }, + { + "examine": "A dwarf who's currently living in Miscellania.", + "name": "Alviss", + "id": "3933" + }, + { + "examine": "Smithy for Sogthorpe.", + "name": "Derrik", + "id": "1376" + }, + { + "examine": "A rather scared-looking dwarf. He doesn't seem all that drunk.", + "name": "Donal", + "id": "3938" + }, + { + "examine": "A dwarf miner. He's shoring up the walls.", + "name": "Ferd", + "id": "3937" + }, + { + "examine": "Runs the general store.", + "name": "Finn", + "id": "3922" + }, + { + "examine": "Hmm, he smells.", + "name": "Fishmonger", + "id": "1393" + }, + { + "examine": "No-one would mistake her for a duchess.", + "name": "Flower Girl", + "id": "1378" + }, + { + "examine": "A dwarf who's currently living in Miscellania.", + "name": "Fullangr", + "id": "3934" + }, + { + "examine": "At least he eats his greens.", + "name": "Greengrocer", + "id": "1394" + }, + { + "examine": "A subject of Miscellania.", + "name": "Halla", + "id": "3921" + }, + { + "examine": "A dwarf who's currently living in Miscellania.", + "name": "Jari", + "id": "3935" + }, + { + "examine": "A subject of Miscellania.", + "name": "Alrik", + "id": "1381" + }, + { + "examine": "A subject of Miscellania.", + "name": "Broddi", + "id": "1390" + }, + { + "examine": "A subject of Miscellania.", + "name": "Einar", + "id": "1380" + }, + { + "examine": "A subject of Miscellania.", + "name": "Ragnar", + "id": "1379" + }, + { + "examine": "A subject of Miscellania.", + "name": "Ragnvald", + "id": "1392" + }, + { + "examine": "A subject of Miscellania.", + "name": "Rannveig", + "id": "1386" + }, + { + "examine": "A subject of Miscellania.", + "name": "Thora", + "id": "3927" + }, + { + "examine": "A subject of Miscellania.", + "name": "Thorhild", + "id": "1382" + }, + { + "examine": "A subject of Miscellania.", + "name": "Valgerd", + "id": "1388" + }, + { + "examine": "A subject of Miscellania.", + "name": "Tjorvi", + "id": "3925" + }, + { + "examine": "Likes fish... hates people.", + "melee_animation": "284", + "attack_speed": "4", + "magic_level": "1", + "respawn_delay": "", + "defence_animation": "285", + "death_animation": "287", + "name": "River troll", + "defence_level": "17", + "lifepoints": "20", + "strength_level": "17", + "id": "391", + "aggressive": "true", + "clue_level": "", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "1", + "attack_level": "17" + }, + { + "examine": "Likes fish... hates people.", + "melee_animation": "284", + "attack_speed": "4", + "magic_level": "1", + "defence_animation": "285", + "death_animation": "287", + "name": "River troll", + "defence_level": "48", + "lifepoints": "48", + "strength_level": "48", + "id": "393", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "1", + "attack_level": "48" + }, + { + "examine": "Likes fish... hates people.", + "melee_animation": "284", + "attack_speed": "4", + "magic_level": "1", + "defence_animation": "285", + "death_animation": "287", + "name": "River troll", + "defence_level": "65", + "lifepoints": "85", + "strength_level": "65", + "id": "394", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "1", + "attack_level": "65" + }, + { + "examine": "Likes fish... hates people.", + "melee_animation": "284", + "attack_speed": "4", + "magic_level": "1", + "defence_animation": "285", + "death_animation": "287", + "name": "River troll", + "defence_level": "100", + "lifepoints": "120", + "strength_level": "100", + "id": "395", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "1", + "attack_level": "100" + }, + { + "examine": "Likes fish... hates people.", + "melee_animation": "284", + "attack_speed": "4", + "magic_level": "1", + "defence_animation": "285", + "death_animation": "287", + "name": "River troll", + "defence_level": "130", + "lifepoints": "170", + "strength_level": "130", + "id": "396", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "1", + "attack_level": "130" + }, + { + "examine": "Rock with attitude.", + "combat_style": "1", + "range_animation": "0", + "attack_speed": "4", + "defence_animation": "8", + "name": "Rock Golem", + "lifepoints": "25", + "strength_level": "8", + "id": "413", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "15", + "attack_level": "8" + }, + { + "examine": "Rock with attitude.", + "combat_style": "1", + "range_animation": "0", + "attack_speed": "4", + "defence_animation": "17", + "name": "Rock Golem", + "lifepoints": "40", + "strength_level": "17", + "id": "414", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "30", + "attack_level": "17" + }, + { + "examine": "Rock with attitude.", + "combat_style": "1", + "range_animation": "0", + "attack_speed": "4", + "defence_animation": "36", + "name": "Rock Golem", + "lifepoints": "60", + "strength_level": "36", + "id": "415", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "40", + "attack_level": "38" + }, + { + "examine": "Rock with attitude.", + "combat_style": "1", + "range_animation": "0", + "attack_speed": "4", + "defence_animation": "64", + "name": "Rock Golem", + "lifepoints": "86", + "strength_level": "64", + "id": "416", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "60", + "attack_level": "64" + }, + { + "examine": "Rock with attitude.", + "combat_style": "1", + "range_animation": "0", + "attack_speed": "4", + "defence_animation": "100", + "name": "Rock Golem", + "lifepoints": "120", + "strength_level": "100", + "id": "417", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "75", + "attack_level": "100" + }, + { + "examine": "Rock with attitude.", + "combat_style": "1", + "range_animation": "0", + "attack_speed": "4", + "defence_animation": "130", + "name": "Rock Golem", + "lifepoints": "166", + "strength_level": "130", + "id": "418", + "aggressive": "true", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "range_level": "80", + "attack_level": "130" + }, + { + "examine": "Mooooooooooooole.", + "name": "Baby Mole", + "id": "3342" + }, + { + "examine": "Moley, moley, moley!", + "name": "Baby Mole", + "id": "3343" } ] \ No newline at end of file diff --git a/Server/data/configs/npc_spawns.json b/Server/data/configs/npc_spawns.json index 878868cd2..6e65f0458 100644 --- a/Server/data/configs/npc_spawns.json +++ b/Server/data/configs/npc_spawns.json @@ -3403,6 +3403,10 @@ "npc_id": "1469", "loc_data": "{2595,3277,0,0,0}" }, + { + "npc_id": "1471", + "loc_data": "{2707,9102,0,1,0}-{2704,9107,0,1,0}-{2705,9110,0,1,0}-{2708,9107,0,1,0}-{2743,9105,0,1,0}-{2741,9103,0,1,0}-{2744,9101,0,1,0}-{2743,9099,0,1,0}-{2737,9124,0,1,0}-{2741,9123,0,1,0}-{2740,9120,0,1,0}-{2736,9119,0,1,0}-{2734,9117,0,1,0}-{2712,9135,0,1,0}-{2714,9131,0,1,0}-{2709,9131,0,1,0}-{2708,9135,0,1,0}" + }, { "npc_id": "1514", "loc_data": "{3432,3487,0,0,0}" @@ -3735,6 +3739,10 @@ "npc_id": "1697", "loc_data": "{3662,3502,0,1,4}-{3664,3493,0,1,6}-{3672,3486,0,1,2}-{3685,3485,0,1,3}-{3684,3496,0,1,3}-{3675,3502,0,1,3}-{3667,3484,0,1,0}-{3666,3471,0,1,4}-{3676,3464,0,1,3}-{3683,3467,0,1,6}-{3685,3474,0,1,4}-{3690,3474,0,1,1}-{3695,3473,0,1,3}-{3693,3466,0,1,7}-{3698,3463,0,1,3}-{3688,3467,0,1,3}-{3675,3474,0,1,4}-{3665,3476,0,1,6}-{3662,3491,0,1,1}-{3662,3495,0,1,4}-{3661,3501,0,1,6}-{3682,3486,0,1,4}-{3678,3493,0,1,4}-{3673,3491,0,1,3}-{3658,3502,0,1,4}-{3660,3505,0,1,1}-{3665,3469,0,1,6}-{3659,3465,0,1,6}-{3667,3461,0,1,1}" }, + { + "npc_id": "1698", + "loc_data": "{3665,3529,0,1,4}-{3669,3522,0,1,4}-{3672,3529,0,1,4}-{3668,3534,0,1,4}-{3657,3534,0,1,4}-{3654,3537,0,1,4}-{3649,3503,0,1,2}-{3647,3473,0,1,3}" + }, { "npc_id": "1699", "loc_data": "{3659,3480,0,1,3}" @@ -4199,6 +4207,10 @@ "npc_id": "2059", "loc_data": "{2588,3088,0,1,3}" }, + { + "npc_id": "2067", + "loc_data": "{3154,9544,0,0,0}-{3245,9570,0,0,0}" + }, { "npc_id": "2082", "loc_data": "{3210,3220,1,1,6}" @@ -6091,6 +6103,22 @@ "npc_id": "3917", "loc_data": "{2581,3861,0,0,1}" }, + { + "npc_id": "3920", + "loc_data": "{2527,10259,0,1,1}" + }, + { + "npc_id": "3921", + "loc_data": "{2506,10251,0,1,1}" + }, + { + "npc_id": "3922", + "loc_data": "{2508,10260,0,1,1}" + }, + { + "npc_id": "3923", + "loc_data": "{2521,10251,0,1,1}" + }, { "npc_id": "3937", "loc_data": "{2508,3866,0,0,3}" @@ -8083,6 +8111,10 @@ "npc_id": "5672", "loc_data": "{3788,2825,2,0,0}" }, + { + "npc_id": "5748", + "loc_data": "{3483,3449,0,0,0}-{3490,3444,0,0,0}-{3479,3434,0,0,0}-{3481,3473,0,0,0}-{3479,3430,0,0,0}-{3434,3417,0,0,0}-{3431,3415,0,0,0}-{3440,3410,0,0,0}-{3424,3409,0,0,0}-{3425,3410,0,0,0}-{3425,3407,0,0,0}-{3429,3276,0,0,0}-{3440,3281,0,0,0}-{3437,3272,0,0,0}-{3440,3271,0,0,0}-{3443,3272,0,0,0}-{3445,3279,0,0,0}-{3445,3274,0,0,0}" + }, { "npc_id": "5750", "loc_data": "{3290,5544,0,1,4}-{3270,5552,0,1,1}-{3274,5547,0,1,7}" @@ -8269,7 +8301,7 @@ }, { "npc_id": "5828", - "loc_data": "{2697,5316,0,0,0}" + "loc_data": "{2697,5316,0,0,0}-{3323,9606,0,0,0}" }, { "npc_id": "5832", @@ -9607,6 +9639,10 @@ "npc_id": "7052", "loc_data": "{2571,2855,0,0,0}" }, + { + "npc_id": "7054", + "loc_data": "{2561,2850,0,0,0}" + }, { "npc_id": "7055", "loc_data": "{2559,2851,0,0,0}-{2560,2852,0,0,0}" @@ -10154,7 +10190,7 @@ { "npc_id": "8171", "loc_data": "{3281,3403,0,1,6}" - }, + }, { "npc_id": "8273", "loc_data": "{2931,3536,0,1,5}" @@ -10926,5 +10962,13 @@ { "npc_id": "7130", "loc_data": "{1625,4689,0,1,0}-{1614,4704,0,1,0}-{1631,4719,0,1,0}-{1651,4705,0,1,0}" + }, + { + "npc_id": "800", + "loc_data": "{2884,9765,0,1,0}-{2890,9766,0,1,0}-{2894,9764,0,1,0}" + }, + { + "npc_id": "3322", + "loc_data": "{2384,4439,0,1,0}" } ] diff --git a/Server/data/configs/shops.json b/Server/data/configs/shops.json index d1e5404be..f8bef5fb2 100644 --- a/Server/data/configs/shops.json +++ b/Server/data/configs/shops.json @@ -69,7 +69,7 @@ "general_store": "true", "id": "8", "title": "West Ardougne General Store", - "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}" + "stock": "{1931,10}-{954,10}-{1265,10}-{1925,30}-{590,10}-{2347,10}-{1061,10}-{841,10}-{882,100}-{329,10}-{2327,10}-{2309,10}-{2142,10}" }, { "npcs": "1917", @@ -204,7 +204,7 @@ "general_store": "true", "id": "23", "title": "Lletya General Store", - "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}" + "stock": "{1931,10}-{954,10}-{1265,10}-{1925,30}-{590,10}-{2347,10}-{1061,10}-{841,10}-{882,100}-{329,10}-{2327,10}-{2309,10}-{2142,10}" }, { "npcs": "4516", @@ -213,7 +213,7 @@ "general_store": "true", "id": "24", "title": "Moon Clan General Store", - "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}" + "stock": "{1931,30}-{1935,10}-{1735,10}-{1925,30}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{9003,10}-{229,1000}" }, { "npcs": "520,521", @@ -360,7 +360,7 @@ "stock": "{1931,5}-{1935,2}-{1735,2}-{1925,3}-{1923,2}-{1887,2}-{590,2}-{1755,2}-{2347,5}-{550,5}-{9003,5}-{954,2}-{946,2}-{2114,0}-{1963,15}-{2108,10}-{4286,10}-{1785,15}-{1783,inf}-{401,inf}-{1781,10}-{301,20}-{307,20}-{1941,30}-{9629,25}-{3226,20}-{1025,5}" }, { - "npcs": "534", + "npcs": "534,535", "high_alch": "0", "currency": "995", "general_store": "true", @@ -702,13 +702,13 @@ "stock": "{4012,10}-{1963,10}-{4016,10}-{4014,10}" }, { - "npcs": "7053", + "npcs": "7054", "high_alch": "0", "currency": "995", "general_store": "false", "id": "80", "title": "Fresh Meat", - "stock": "{2134,10}-{2132,300}-{2136,10}-{2142,10}-{2138,10}-{2140,10}-{3226,100}-{7224,0}-{7223,0}-{3228,10}-{2876,0}-{7230,0}-{2878,0}-{7566,0}-{2337,0}-{9978,10}-{9984,0}-{9980,0}-{9986,0}-{9992,0}-{9988,0}" + "stock": "{2134,10}-{2132,300}-{2136,10}-{2142,10}-{2138,10}-{2140,10}-{3226,100}-{7224,0}-{7223,0}-{3228,10}-{2876,0}-{7230,0}-{2878,0}-{7566,0}-{2337,0}-{9978,100}-{9984,0}-{9980,0}-{9986,0}-{9992,0}-{9988,0}" }, { "npcs": "571", @@ -1229,8 +1229,8 @@ "currency": "995", "general_store": "false", "id": "139", - "title": "Spice Shop", - "stock": "{1931,30}-{2169,10}-{5970,0}" + "title": "The Spice Is Right", + "stock": "{1931,30}-{2169,10}-{5970,0}-{175,10}" }, { "npcs": "546", @@ -2031,7 +2031,7 @@ "general_store": "false", "id": "229", "title": "Lletya Food Store", - "stock": "{2309,10}-{379,15}-{1993,3}-{1985,10}-{1891,5}" + "stock": "{2309,10}-{379,10}-{1993,10}-{1985,10}-{1891,10}" }, { "npcs": "2356", @@ -2042,15 +2042,6 @@ "title": "Lletya Archery Shop", "stock": "{884,2000}-{886,500}-{888,500}-{890,450}-{892,400}-{877,1500}-{843,5}-{845,5}-{837,5}-{849,5}-{847,5}" }, - { - "npcs": "2352", - "high_alch": "0", - "currency": "995", - "general_store": "true", - "id": "231", - "title": "Lletya General Store", - "stock": "" - }, { "npcs": "1282", "high_alch": "0", @@ -2164,8 +2155,89 @@ "high_alch": "0", "currency": "995", "general_store": "false", - "id": "245", + "id": "244", "title": "The Armour Store", "stock": "{1147,0}-{1163,0}-{1127,0}-{1093,0}-{1185,0}-{1201,0}-{1113,0}-{1079,0}-{1145,0}-{1161,0}-{1123,0}-{1091,0}-{1183,0}-{1199,0}-{1111,0}-{1073,0}-{1143,0}-{1159,0}-{1121,0}-{1085,0}-{1181,0}-{1197,0}-{1109,0}-{1071,0}" + }, + { + "npcs": "7048", + "high_alch": "0", + "currency": "995", + "general_store": "false", + "id": "245", + "title": "Gift Shop", + "stock": "{590,10}-{2866,100}-{2878,10}-{314,1000}-{1351,10}-{954,10}-{1931,30}-{1925,30}-{2347,10}-{946,10}-{12561,10}-{12563,10}-{12565,0}-{12567,0}-{12568,0}-{12559,0}-{12570,0}" + }, + { + "npcs": "3923", + "high_alch": "0", + "currency": "995", + "general_store": "false", + "id": "246", + "title": "Miscellanian Food Shop", + "stock": "{2309,5}-{1985,5}-{1965,5}-{1942,5}-{1957,5}-{1933,5}-{1973,5}-{1927,5}" + }, + { + "npcs": "3920", + "high_alch": "0", + "currency": "995", + "general_store": "false", + "id": "247", + "title": "The Esoterican Arms", + "stock": "{1917,10}-{5763,10}-{1993,5}-{1798,5}" + }, + { + "npcs": "1383,3921", + "high_alch": "0", + "currency": "995", + "general_store": "false", + "id": "248", + "title": "Miscellanian Clothes Shop", + "stock": "{3767,5}-{3769,5}-{3771,5}-{3773,5}-{3775,5}-{3795,5}-{5050,3}-{5052,3}-{5038,3}-{5040,3}-{5044,3}-{5046,3}-{5026,3}-{5028,3}-{5032,3}-{5034,3}" + }, + { + "npcs": "1393", + "high_alch": "0", + "currency": "995", + "general_store": "false", + "id": "249", + "title": "Island Fishmonger", + "stock": "{303,5}-{307,5}-{309,5}-{311,2}-{301,2}-{313,1500}-{314,1000}-{305,5}-{317,0}-{325,200}-{345,0}-{353,0}-{341,0}-{321,0}-{335,0}-{349,0}-{331,0}-{359,0}-{377,0}-{363,0}-{371,0}-{383,0}" + }, + { + "npcs": "1394", + "high_alch": "0", + "currency": "995", + "general_store": "false", + "id": "250", + "title": "Greengrocer of Miscellania", + "stock": "{1965,10}-{1942,10}-{1957,10}-{1982,10}-{1550,2}" + }, + { + "npcs": "932", + "high_alch": "0", + "currency": "995", + "general_store": "false", + "id": "251", + "title": "Legends Guild General Store", + "stock": "{373,20}-{2323,5}-{121,3}-{886,500}" + }, + { + "npcs": "3161", + "high_alch": "0", + "currency": "995", + "general_store": "false", + "id": "252", + "title": "Two Feet Charley's Fish Shop", + "stock": "{317,10}-{327,10}-{345,10}-{353,10}-{341,10}-{321,10}-{359,0}-{377,0}-{363,0}-{377,0}" + }, + { + "npcs": "1316", + "high_alch": "0", + "currency": "995", + "general_store": "false", + "id": "253", + "title": "Fremennik Fur Trader", + "stock": "{948,10}-{958,10}-{10117,0}-{10121,0}-{10119,0}-{10123,0}-{10093,0}-{10095,0}-{10097,0}-{10099,0}-{10101,0}-{10103,0}" } ] \ No newline at end of file diff --git a/Server/src/main/java/core/game/content/activity/barrows/BarrowsActivityPlugin.java b/Server/src/main/java/core/game/content/activity/barrows/BarrowsActivityPlugin.java index be2820b4d..81c153d46 100644 --- a/Server/src/main/java/core/game/content/activity/barrows/BarrowsActivityPlugin.java +++ b/Server/src/main/java/core/game/content/activity/barrows/BarrowsActivityPlugin.java @@ -34,6 +34,8 @@ import rs09.game.content.activity.barrows.RewardChest; import rs09.game.world.GameWorld; import rs09.plugin.PluginManager; +import static api.ContentAPIKt.getWorldTicks; + /** * Handles the barrows activity plugin. * @author Emperor @@ -77,7 +79,7 @@ public final class BarrowsActivityPlugin extends ActivityPlugin { /** * The activity handling pulse. */ - private static final Pulse PULSE = new Pulse(3) { + private static final Pulse PULSE = new Pulse(0) { @Override public boolean pulse() { boolean end = true; @@ -89,27 +91,30 @@ public final class BarrowsActivityPlugin extends ActivityPlugin { p.getPacketDispatch().sendItemOnInterface(-1, 1, 24, index); continue; } - if (p.getLocation().getZ() == 0 && p.getAttribute("barrow:looted", false)) { + if (p.getLocation().getZ() == 0 && p.getAttribute("barrow:looted", false) && getWorldTicks() % 3 == 0) { if (RandomFunction.random(15) == 0) { p.getImpactHandler().manualHit(p, RandomFunction.random(5), HitsplatType.NORMAL); Graphics.send(Graphics.create(405), p.getLocation()); } } - if (p.getLocks().isLocked("barrow:drain") || RandomFunction.random(100) % 2 == 0) { - continue; - } int drain = 8; + System.out.println(getWorldTicks() % 30); + //if (p.getLocks().isLocked("barrow:drain") || RandomFunction.random(100) % 2 == 0) { + // continue; + //} for (boolean killed : p.getSavedData().getActivityData().getBarrowBrothers()) { if (killed) { drain += 1; } } - p.getSkills().decrementPrayerPoints(drain); - p.getLocks().lock("barrow:drain", (3 + RandomFunction.random(15)) * 3); - index = 1 + RandomFunction.random(6); - p.setAttribute("barrow:drain-index", index); - p.getPacketDispatch().sendItemZoomOnInterface(4761 + RandomFunction.random(12), 100, 24, index); - p.getPacketDispatch().sendAnimationInterface(9810, 24, index); + if(getWorldTicks() % 30 == 0){ + p.getSkills().decrementPrayerPoints(drain); + p.getLocks().lock("barrow:drain", (3 + RandomFunction.random(15)) * 3); + index = 1 + RandomFunction.random(6); + p.setAttribute("barrow:drain-index", index); + p.getPacketDispatch().sendItemZoomOnInterface(4761 + RandomFunction.random(12), 100, 24, index); + p.getPacketDispatch().sendAnimationInterface(9810, 24, index); + } } return end; } diff --git a/Server/src/main/java/core/game/content/activity/guild/MiningGuildPlugin.java b/Server/src/main/java/core/game/content/activity/guild/MiningGuildPlugin.java index d77056288..1a4d0358b 100644 --- a/Server/src/main/java/core/game/content/activity/guild/MiningGuildPlugin.java +++ b/Server/src/main/java/core/game/content/activity/guild/MiningGuildPlugin.java @@ -1,5 +1,6 @@ package core.game.content.activity.guild; +import static api.ContentAPIKt.*; import core.cache.def.impl.SceneryDefinition; import core.game.content.global.action.ClimbActionHandler; import core.game.content.global.action.DoorActionHandler; @@ -14,6 +15,8 @@ import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; +import static api.ContentAPIKt.getDynLevel; + /** * Represents the plugin used for the mining guild. * @author 'Vexia @@ -34,7 +37,7 @@ public final class MiningGuildPlugin extends OptionHandler { public boolean handle(Player player, Node node, String option) { if (option.equals("climb-down")) { if (player.getLocation().withinDistance(Location.create(3019, 3339, 0), 4)) { - if (player.getSkills().getStaticLevel(Skills.MINING) < 60) { + if (getDynLevel(player, Skills.MINING) < 60) { player.getDialogueInterpreter().open(382, NPC.create(382, Location.create(0, 0, 0)), 1); return true; } @@ -45,7 +48,7 @@ public final class MiningGuildPlugin extends OptionHandler { return true; } if (option.equals("open")) { - if (player.getSkills().getStaticLevel(Skills.MINING) < 60) { + if (getDynLevel(player, Skills.MINING) < 60) { player.getDialogueInterpreter().open(382, NPC.create(382, Location.create(0, 0, 0)), 1); return true; } diff --git a/Server/src/main/java/core/game/content/consumable/Consumables.java b/Server/src/main/java/core/game/content/consumable/Consumables.java index 244e8b84f..40041fc6a 100644 --- a/Server/src/main/java/core/game/content/consumable/Consumables.java +++ b/Server/src/main/java/core/game/content/consumable/Consumables.java @@ -65,6 +65,7 @@ public enum Consumables { TRIANGLE_SANDWICH(new Food(new int[] {6962}, new HealingEffect(6))), SQUARE_SANDWICH(new Food(new int[] {6965}, new HealingEffect(6))), SEAWEED_SANDWICH(new FakeConsumable(3168, new String[] {"You really, really do not want to eat that."})), + FROGBURGER(new Food(new int[] {10962}, new HealingEffect(2))), /** Kebabs */ UGTHANKI_KEBAB(new Food(new int[] {1883}, new UgthankiKebabEffect())), @@ -86,7 +87,7 @@ public enum Consumables { STEW(new Food(new int[] {2003, 1923}, new HealingEffect(11))), SPICY_STEW(new Food(new int[] {7479, 1923}, new HealingEffect(11))), CURRY(new Food(new int[] {2011, 1923}, new HealingEffect(19))), - BANANA_STEW(new Food(new int[] {4016}, new HealingEffect(11))), + BANANA_STEW(new Food(new int[] {4016, 1923}, new HealingEffect(11))), /** Pizzas */ PLAIN_PIZZA(new HalfableFood(new int[] {2289, 2291}, new HealingEffect(7))), diff --git a/Server/src/main/java/core/game/content/dialogue/ArchaeologicalExpertDialogue.java b/Server/src/main/java/core/game/content/dialogue/ArchaeologicalExpertDialogue.java deleted file mode 100644 index 82ac3a222..000000000 --- a/Server/src/main/java/core/game/content/dialogue/ArchaeologicalExpertDialogue.java +++ /dev/null @@ -1,51 +0,0 @@ -package core.game.content.dialogue; - -import core.plugin.Initializable; -import core.game.node.entity.player.Player; - -/** - * Handles the archaeologicals expert dialogue. - * @author Aero - * @version 1.0 - */ -@Initializable -public class ArchaeologicalExpertDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code ArchaeologicalExpertDialogue} {@code Object}. - */ - public ArchaeologicalExpertDialogue() { - /** - * Empty to stop instantiation. - */ - } - - /** - * Constructs a new {@code ArchaeologicalExpertDialogue} {@code Object}. - * @param player The player to construct the class for. - */ - public ArchaeologicalExpertDialogue(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new ArchaeologicalExpertDialogue(player); - } - - @Override - public boolean open(Object... args) { - return false; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - return true; - } - - @Override - public int[] getIds() { - return new int[] { 619 }; - } - -} diff --git a/Server/src/main/java/core/game/content/dialogue/BarkerDialogue.java b/Server/src/main/java/core/game/content/dialogue/BarkerDialogue.java index 1aacd65c7..dd18f36b1 100644 --- a/Server/src/main/java/core/game/content/dialogue/BarkerDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/BarkerDialogue.java @@ -45,33 +45,38 @@ public final class BarkerDialogue extends DialoguePlugin { @Override public boolean handle(int interfaceId, int buttonId) { switch (stage) { - case 0: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You are looking for clothes, yes? You look at my", "products! I have very many nice clothes, yes?"); - stage = 1; - break; - case 1: - interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks."); - stage = 2; - break; - case 2: - switch (buttonId) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You are looking for clothes, yes? You look at my", "products! I have very many nice clothes, yes?"); + stage = 1; + break; case 1: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); - stage = 10; + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks."); + stage = 2; break; case 2: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); + stage = 15; + break; + } + break; + + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Unfortunate for you, yes?", "Many bargains, won't find elsewhere!"); stage = 20; break; - } - break; - case 20: - end(); - break; - case 10: - end(); - npc.openShop(player); - break; + case 20: + end(); + break; + case 10: + end(); + npc.openShop(player); + break; } return true; } diff --git a/Server/src/main/java/core/game/content/dialogue/CabinBoyJenkins.java b/Server/src/main/java/core/game/content/dialogue/CabinBoyJenkins.java index bbace5ed8..ec5295fa2 100644 --- a/Server/src/main/java/core/game/content/dialogue/CabinBoyJenkins.java +++ b/Server/src/main/java/core/game/content/dialogue/CabinBoyJenkins.java @@ -45,7 +45,7 @@ public class CabinBoyJenkins extends DialoguePlugin { quest = player.getQuestRepository().getQuest("Dragon Slayer"); switch (quest.getStage(player)) { case 20: - npc("Ahoy ! Whay d'ye think of yer ship then?"); + npc("Ahoy! Whay d'ye think of yer ship then?"); stage = 0; break; case 40: diff --git a/Server/src/main/java/core/game/content/dialogue/CharlieTheTrampDialogue.java b/Server/src/main/java/core/game/content/dialogue/CharlieTheTrampDialogue.java deleted file mode 100644 index 0dc669e76..000000000 --- a/Server/src/main/java/core/game/content/dialogue/CharlieTheTrampDialogue.java +++ /dev/null @@ -1,258 +0,0 @@ -package core.game.content.dialogue; - -import core.game.node.entity.npc.NPC; -import core.game.node.entity.player.Player; -import core.game.node.entity.player.link.quest.Quest; -import core.plugin.Initializable; -import core.game.node.item.Item; - -/** - * Represents the charlie the tramp dialogue. - * @author 'Vexia - * @dtae 3/1/14 - */ -@Initializable -public class CharlieTheTrampDialogue extends DialoguePlugin { - - /** - * Represents the quest. - */ - private Quest quest; - - /** - * Constructs a new {@code CharlieTheTrampDialogue} {@code Object}. - */ - public CharlieTheTrampDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code CharlieTheTrampDialogue} {@code Object}. - * @param player the player. - */ - public CharlieTheTrampDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new CharlieTheTrampDialogue(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - quest = player.getQuestRepository().getQuest("Shield of Arrav"); - switch (quest.getStage(player)) { - default: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Spare some change guv?"); - stage = 0; - break; - } - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (quest.getStage(player)) { - default: - regular(buttonId); - break; - } - return true; - } - - /** - * Method used to handle the regular dial. - * @param buttonId the buttonid. - */ - public void regular(int buttonId) { - switch (stage) { - case 0: - interpreter.sendOptions("Select an Option", "Who are you?", "Sorry, I haven't got any.", "Go get a job!", "Ok. Here you go.", "Is there anything down this alleyway?"); - stage = 1; - break; - case 1: - switch (buttonId) { - case 1: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); - stage = 10; - break; - case 2: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I haven't got any."); - stage = 20; - break; - case 3: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Go get a job!"); - stage = 30; - break; - case 4: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok. Here you go."); - stage = 40; - break; - case 5: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Is there anything down this alleyway?"); - stage = 50; - break; - } - break; - case 10: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Charles. Charles E. Trampin' at your service. Now, about", "that change you were going to give me..."); - stage = 0; - break; - case 20: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Thanks anyways!"); - stage = 21; - break; - case 21: - end(); - break; - case 30: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You startin? I hope your nose falls off!"); - stage = 21; - break; - case 40: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hey, thanks alot!"); - stage = 41; - break; - case 41: - interpreter.sendOptions("Select an Option", "No problem.", "Don't I get some sort of quest hint or something now?"); - stage = 42; - break; - case 42: - switch (buttonId) { - case 1: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No problem."); - stage = 180; - break; - case 2: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So...don't I get some sort of quest hint or something now?"); - stage = 190; - break; - } - break; - case 180: - end(); - if (player.getInventory().contains(995, 1)) - player.getInventory().remove(new Item(995, 1)); - else - player.getPacketDispatch().sendMessage("You need one coin to give away."); - break; - case 190: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Huh? What do you mean? That wasn't why", " I asked you for money."); - stage = 191; - break; - case 191: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I just need to eat..."); - stage = 192; - break; - case 192: - end(); - break; - case 800: - npc("The ruthless and notorious criminal gang known as the", "Black Arm Gang have their headquarters down there."); - stage = 801; - break; - case 801: - options("Thank you for the warning!", "Do you think they would let me join?"); - stage = 802; - break; - case 802: - switch (buttonId) { - case 1: - player("Thanks for the warning!"); - stage = 803; - break; - case 2: - player("Do you think they would let me join?"); - stage = 804; - break; - } - break; - case 803: - npc("Don't worry about it."); - stage = 806; - break; - case 804: - npc("You never know. You'll find a lady down there called", "Katrine. Speak to her."); - stage = 807; - break; - case 807: - npc("But don't upset her, she's pretty dangerous."); - stage = 808; - break; - case 808: - npc("I also heard that Reldo the librarian", "knows more about them, go talk to him."); - stage = 809; - break; - case 809: - end(); - break; - case 806: - player("Do you think they would let me join?"); - stage = 804; - break; - case 50: - if (quest.getStage(player) == 0) { - npc("Funny you should mention that...there is actually."); - stage = 800; - break; - } - if (quest.getStage(player) == 30 || quest.getStage(player) == 40 || quest.getStage(player) == 50) { - npc("Funny you should mention that...there is actually."); - stage = 51; - break; - } - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nope, nothing at all."); - stage = 192; - break; - case 51: - npc("The ruthless and notorious criminal gang known as the", "Black Arm Gang have their headquarters down there."); - stage = 52; - break; - case 52: - options("Thank you for the warning!", "Do you think they would let me join?"); - stage = 53; - break; - case 53: - switch (buttonId) { - case 1: - player("Thanks for the warning!"); - stage = 54; - break; - case 2: - player("Do you think they would let me join?"); - stage = 55; - break; - } - break; - case 54: - npc("Don't worry about it."); - stage = 56; - break; - case 55: - npc("You never know. You'll find a lady down there called", "Katrine. Speak to her."); - stage = 57; - break; - case 57: - npc("But don't upset her, she's pretty dangerous."); - stage = 58; - break; - case 58: - quest.setStage(player, 50); - end(); - break; - case 56: - player("Do you think they would let me join?"); - stage = 55; - break; - } - } - - @Override - public int[] getIds() { - return new int[] { 641 }; - } -} diff --git a/Server/src/main/java/core/game/content/dialogue/CuffsDialogue.java b/Server/src/main/java/core/game/content/dialogue/CuffsDialogue.java index 238059b19..4961acb59 100644 --- a/Server/src/main/java/core/game/content/dialogue/CuffsDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/CuffsDialogue.java @@ -8,6 +8,7 @@ import core.game.node.entity.player.Player; * Represents the dialogue plugin used for the cuffs npc. * @author 'Vexia * @version 1.0 + * Fixed a typo -Nuggles */ @Initializable public final class CuffsDialogue extends DialoguePlugin { @@ -54,7 +55,7 @@ public final class CuffsDialogue extends DialoguePlugin { stage = 2; break; case 2: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nope, we'd never do anuthing like that.", "Just a band of innocent walkers, that's us."); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nope, we'd never do anything like that.", "Just a band of innocent walkers, that's us."); stage = 3; break; case 3: diff --git a/Server/src/main/java/core/game/content/dialogue/GoblinVillageGuardDialogue.java b/Server/src/main/java/core/game/content/dialogue/GoblinVillageGuardDialogue.java index 77c1707dc..4084baee1 100644 --- a/Server/src/main/java/core/game/content/dialogue/GoblinVillageGuardDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/GoblinVillageGuardDialogue.java @@ -7,6 +7,7 @@ import core.plugin.Initializable; /** * Represents the dialogue plugin used for the goblin village guard npc. * @author jamix77 + * Fixed a typo -Nuggles */ @Initializable public final class GoblinVillageGuardDialogue extends DialoguePlugin { @@ -47,7 +48,7 @@ public final class GoblinVillageGuardDialogue extends DialoguePlugin { public boolean handle(int interfaceId, int buttonId) { switch (stage) { case 0: - npc("I know. We guards uaully stay by banks and shops,", "but I got sent all the way out here to keep an eye on","the brigands loitering just south of here."); + npc("I know. We guards usually stay by banks and shops,", "but I got sent all the way out here to keep an eye on","the brigands loitering just south of here."); stage = 1; break; case 1: @@ -59,7 +60,7 @@ public final class GoblinVillageGuardDialogue extends DialoguePlugin { stage++; break; case 3: - player("Honestly people these days just don't know how to behave!"); + player("Honestly, people these days just don't know how to behave!"); stage++; break; case 4: diff --git a/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java b/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java index a59a25d53..b45b358e8 100644 --- a/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java +++ b/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java @@ -180,7 +180,7 @@ public final class HansDialoguePlugin extends DialoguePlugin { } else { stage = 15; } - break; + break; } npc("One moment, please..."); break; diff --git a/Server/src/main/java/core/game/content/dialogue/HighPriestDialogue.java b/Server/src/main/java/core/game/content/dialogue/HighPriestDialogue.java deleted file mode 100644 index a9ab3fad7..000000000 --- a/Server/src/main/java/core/game/content/dialogue/HighPriestDialogue.java +++ /dev/null @@ -1,63 +0,0 @@ -package core.game.content.dialogue; - -import core.game.node.entity.npc.NPC; -import core.plugin.Initializable; -import core.game.node.entity.player.Player; - -/** - * Represents the high priest dialogue plugin. - * @author 'Vexia - * @version 1.0 - */ -@Initializable -public final class HighPriestDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code HighPriestDialogue} {@code Object}. - */ - public HighPriestDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code HighPriestDialogue} {@code Object}. - * @param player the player. - */ - public HighPriestDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new HighPriestDialogue(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Many greetings. Welcome to our fair island."); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Enjoy our stay here. May it be spiritually uplifting!"); - stage = 1; - break; - case 1: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[] { 216 }; - } -} diff --git a/Server/src/main/java/core/game/content/dialogue/LongbowBenDialogue.java b/Server/src/main/java/core/game/content/dialogue/LongbowBenDialogue.java index 0740dd674..490e05ddd 100644 --- a/Server/src/main/java/core/game/content/dialogue/LongbowBenDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/LongbowBenDialogue.java @@ -52,7 +52,7 @@ public final class LongbowBenDialogue extends DialoguePlugin { case 1: switch (buttonId) { case 1: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Why are you called Longbow Ben?"); + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why are you called Longbow Ben?"); stage = 100; break; case 2: diff --git a/Server/src/main/java/core/game/content/dialogue/MazionDialogue.java b/Server/src/main/java/core/game/content/dialogue/MazionDialogue.java deleted file mode 100644 index ad36349af..000000000 --- a/Server/src/main/java/core/game/content/dialogue/MazionDialogue.java +++ /dev/null @@ -1,59 +0,0 @@ -package core.game.content.dialogue; - -import core.game.node.entity.npc.NPC; -import core.plugin.Initializable; -import core.game.node.entity.player.Player; - -/** - * Represents the dialogue used for the mazion npc. - * @author 'Vexia - * @version 1.0 - */ -@Initializable -public final class MazionDialogue extends DialoguePlugin { - - /** - * Constructs a new {@code MazionDialogue} {@code Object}. - */ - public MazionDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code MazionDialogue} {@code Object}. - * @param player the player. - */ - public MazionDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new MazionDialogue(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Please leave me along, a parrot stole my banana."); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - end(); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[] { 3114 }; - } -} diff --git a/Server/src/main/java/core/game/content/dialogue/MissSchismDialogue.java b/Server/src/main/java/core/game/content/dialogue/MissSchismDialogue.java index 92008a86a..2b490b1d2 100644 --- a/Server/src/main/java/core/game/content/dialogue/MissSchismDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/MissSchismDialogue.java @@ -101,7 +101,7 @@ public final class MissSchismDialogue extends DialoguePlugin { stage = 112; break; case 112: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm sure I could, but I don't see why. The vampie wasn't", "bothering me."); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm sure I could, but I don't see why. The vampire wasn't", "bothering me."); stage = 113; break; case 113: @@ -127,7 +127,7 @@ public final class MissSchismDialogue extends DialoguePlugin { stage = 212; break; case 212: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "And who'd have ever thought such a sweet old genleman", "would do such a thing?"); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "And who'd have ever thought such a sweet old gentleman", "would do such a thing?"); stage = 213; break; case 213: @@ -150,12 +150,12 @@ public final class MissSchismDialogue extends DialoguePlugin { stage = 22; break; case 22: - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I also do voluntary work for the Draynor Manor", "Restoration Fund. We're campagning to have", "Draynor manor turned into a museum before the wet-rot", "destroys it completely."); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I also do voluntary work for the Draynor Manor", "Restoration Fund. We're campaigning to have", "Draynor manor turned into a museum before the wet-rot", "destroys it completely."); stage = 23; break; case 23: if(player.getQuestRepository().isComplete("Vampire Slayer")) { - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, now that I've cleared the vampire out of the manor,", "I guess you won't have to mutch trouble turning it into a", "museum."); + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, now that I've cleared the vampire out of the manor,", "I guess you won't have too much trouble turning it into a", "museum."); stage = 24; } else { end(); @@ -185,3 +185,6 @@ public final class MissSchismDialogue extends DialoguePlugin { return new int[] { 2634 }; } } +/** + * Fixed Vexia's crappy English in some sentences + */ \ No newline at end of file diff --git a/Server/src/main/java/core/game/content/dialogue/MonkeyDialogue.java b/Server/src/main/java/core/game/content/dialogue/MonkeyDialogue.java index a6d1df32d..f96e33cfc 100644 --- a/Server/src/main/java/core/game/content/dialogue/MonkeyDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/MonkeyDialogue.java @@ -34,7 +34,7 @@ public final class MonkeyDialogue extends DialoguePlugin { @Override public boolean open(Object... args) { - player("Who's a cute little monkey?"); + player("Hey little man, how's it goin'?"); return true; } @@ -46,15 +46,18 @@ public final class MonkeyDialogue extends DialoguePlugin { stage++; break; case 1: + player(FacialExpression.HALF_GUILTY,"Yeah."); + stage = 5; + break; + case 5: end(); break; } return true; } - @Override public int[] getIds() { return new int[] { 2301 }; } -} +} \ No newline at end of file diff --git a/Server/src/main/java/core/game/content/dialogue/NurmofDialogue.java b/Server/src/main/java/core/game/content/dialogue/NurmofDialogue.java deleted file mode 100644 index 32f2f67bd..000000000 --- a/Server/src/main/java/core/game/content/dialogue/NurmofDialogue.java +++ /dev/null @@ -1,62 +0,0 @@ -package core.game.content.dialogue; - -import core.game.node.entity.npc.NPC; -import core.plugin.Initializable; -import core.game.node.entity.player.Player; - -/** - * Handles the NurmofDialogue dialogue. - * @author 'Vexia - */ -@Initializable -public class NurmofDialogue extends DialoguePlugin { - - public NurmofDialogue() { - - } - - public NurmofDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - - return new NurmofDialogue(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings and welcome to my pickaxe shop. Do you", "want to buy my premium quality pickaxes?"); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you."); - stage = 1; - break; - case 1: - switch (buttonId) { - case 1: - end(); - npc.openShop(player); - break; - case 2: - end(); - break; - } - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[] { 594 }; - } -} diff --git a/Server/src/main/java/core/game/content/dialogue/PikkupstixDialogue.java b/Server/src/main/java/core/game/content/dialogue/PikkupstixDialogue.java index 5a11ddea7..dd73f339e 100644 --- a/Server/src/main/java/core/game/content/dialogue/PikkupstixDialogue.java +++ b/Server/src/main/java/core/game/content/dialogue/PikkupstixDialogue.java @@ -15,6 +15,7 @@ import core.game.node.item.Item; * @notice Modified March 2nd, 2015 to allow the bulk buying of shards. * @notice The previous notice is dubious * @notice Spirit shard packs were released 9 September 2009, outside of 530. Option removed. + * Fixed multiple typos -Nuggles */ @Initializable public final class PikkupstixDialogue extends DialoguePlugin { @@ -438,7 +439,7 @@ public final class PikkupstixDialogue extends DialoguePlugin { stage = 6; break; case 6: - npc("Well, for a start, it has the ability to perform a", "Summoning scroll that forces the oppnents to flee. That is", "what it will use on the giant wolpertinger, with the", "difference being that the giant wolpertinger will be so"); + npc("Well, for a start, it has the ability to perform a", "Summoning scroll that forces the opponents to flee. That is", "what it will use on the giant wolpertinger, with the", "difference being that the giant wolpertinger will be so"); stage = 7; break; case 7: @@ -624,10 +625,10 @@ public final class PikkupstixDialogue extends DialoguePlugin { switch (stage) { case 0: if (player.getSkills().getStaticLevel(Skills.SUMMONING) == 99) { - options("So, what's Summmoning all about, then?", "Can I buy some Summoning supplies?", "Can I buy a Summoning skillcape?"); + options("So, what's Summoning all about, then?", "Can I buy some Summoning supplies?", "Can I buy a Summoning skillcape?"); stage = 600; } else { - options("So, what's Summmoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes."); + options("So, what's Summoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes."); stage = 1; } break; @@ -685,7 +686,7 @@ public final class PikkupstixDialogue extends DialoguePlugin { stage = 102; break; case 102: - npc("These animals can also perform a special move, wich is", "specific to the species. For example, a spirit wolf can", "perform the Howl special move if you are holding the", "correct Howl scroll."); + npc("These animals can also perform a special move, which is", "specific to the species. For example, a spirit wolf can", "perform the Howl special move if you are holding the", "correct Howl scroll."); stage = 103; break; case 103: @@ -743,7 +744,7 @@ public final class PikkupstixDialogue extends DialoguePlugin { stage = 401; break; case 401: - interpreter.sendOptions("Choose an option:", "So, what's Summmoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes."); + interpreter.sendOptions("Choose an option:", "So, what's Summoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes."); stage = 1; break; case 600: diff --git a/Server/src/main/java/core/game/content/global/BirdNest.java b/Server/src/main/java/core/game/content/global/BirdNest.java index 2b56bc9ae..6470c0309 100644 --- a/Server/src/main/java/core/game/content/global/BirdNest.java +++ b/Server/src/main/java/core/game/content/global/BirdNest.java @@ -17,43 +17,45 @@ public enum BirdNest { SEED(new ChanceItem(5073, 1, 65), new ChanceItem(Items.ACORN_5312, 1, NPCDropTables.DROP_RATES[0]), new ChanceItem(Items.APPLE_TREE_SEED_5283, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.WILLOW_SEED_5313, 1, NPCDropTables.DROP_RATES[0]), new ChanceItem(Items.BANANA_TREE_SEED_5284, 1, NPCDropTables.DROP_RATES[0]), - new ChanceItem(Items.ORANGE_TREE_SEED_5285, 1, NPCDropTables.DROP_RATES[1]), - new ChanceItem(Items.WILLOW_SEED_5313, 1, NPCDropTables.DROP_RATES[1]), - new ChanceItem(Items.CURRY_TREE_SEED_5286, 1, NPCDropTables.DROP_RATES[1]), - new ChanceItem(Items.MAPLE_SEED_5314, 1, NPCDropTables.DROP_RATES[2]), - new ChanceItem(Items.PINEAPPLE_SEED_5287, 1, NPCDropTables.DROP_RATES[2]), - new ChanceItem(Items.PAPAYA_TREE_SEED_5288, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.ORANGE_TREE_SEED_5285, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.CURRY_TREE_SEED_5286, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.MAPLE_SEED_5314, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.PINEAPPLE_SEED_5287, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.PAPAYA_TREE_SEED_5288, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[2]), new ChanceItem(Items.PALM_TREE_SEED_5289, 1, NPCDropTables.DROP_RATES[2]), new ChanceItem(Items.CALQUAT_TREE_SEED_5290, 1, NPCDropTables.DROP_RATES[2]), - new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[2]), - new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3]), - new ChanceItem(Items.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3])), + new ChanceItem(Items.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3]), + new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3])), RING(new ChanceItem(5074, 1, 30), new ChanceItem(Items.GOLD_RING_1635, 1, NPCDropTables.DROP_RATES[0]), new ChanceItem(Items.SAPPHIRE_RING_1637, 1, NPCDropTables.DROP_RATES[0]), - new ChanceItem(Items.EMERALD_RING_1639, 1, NPCDropTables.DROP_RATES[1]), - new ChanceItem(Items.RUBY_RING_1641, 1, NPCDropTables.DROP_RATES[2]), - new ChanceItem(Items.DIAMOND_RING_1643, 1, NPCDropTables.DROP_RATES[3])), + new ChanceItem(Items.EMERALD_RING_1639, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.RUBY_RING_1641, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.DIAMOND_RING_1643, 1, NPCDropTables.DROP_RATES[2])), RED(new ChanceItem(5070, 1, 5), new ChanceItem(5076)), GREEN(new ChanceItem(5071, 1, 5), new ChanceItem(5078)), BLUE(new ChanceItem(5072, 1, 5), new ChanceItem(5077)), RAVEN(new ChanceItem(11966, 1, 5), new ChanceItem(11964)), WYSON(new ChanceItem(7413, 1, 1), - new ChanceItem(Items.CABBAGE_SEED_5324, 1, NPCDropTables.DROP_RATES[0]), - new ChanceItem(Items.SWEETCORN_SEED_5320, 1, NPCDropTables.DROP_RATES[0]), - new ChanceItem(Items.TOMATO_SEED_5322, 1, NPCDropTables.DROP_RATES[0]), - new ChanceItem(Items.ONION_SEED_5319, 1, NPCDropTables.DROP_RATES[0]), - new ChanceItem(Items.POTATO_SEED_5318, 1, NPCDropTables.DROP_RATES[0]), - new ChanceItem(Items.LIMPWURT_SEED_5100, 1, NPCDropTables.DROP_RATES[1]), - new ChanceItem(Items.STRAWBERRY_SEED_5323, 1, NPCDropTables.DROP_RATES[1]), - new ChanceItem(Items.TOADFLAX_SEED_5296, 1, NPCDropTables.DROP_RATES[0]), - new ChanceItem(Items.WATERMELON_SEED_5321, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.POTATO_SEED_5318, 14, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.SWEETCORN_SEED_5320, 3, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.TOMATO_SEED_5322, 6, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.CABBAGE_SEED_5324, 9, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.LIMPWURT_SEED_5100, 2, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.ONION_SEED_5319, 11, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.STRAWBERRY_SEED_5323, 3, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.WATERMELON_SEED_5321, 2, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.ACORN_5312, 1, NPCDropTables.DROP_RATES[2]), new ChanceItem(Items.RANARR_SEED_5295, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.WILLOW_SEED_5313, 1, NPCDropTables.DROP_RATES[2]), new ChanceItem(Items.MAPLE_SEED_5314, 1, NPCDropTables.DROP_RATES[2]), - new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[3]), - new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3])); + new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3]), + new ChanceItem(Items.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3])); /** * The random nest items. diff --git a/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayer.java b/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayer.java index 439f10329..913dcc886 100644 --- a/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayer.java +++ b/Server/src/main/java/core/game/content/quest/free/dragonslayer/DragonSlayer.java @@ -12,7 +12,7 @@ import core.game.world.map.Location; import core.game.world.map.RegionManager; import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; -import rs09.game.content.dialogue.DukeHoracioDialogue; +import rs09.game.content.dialogue.region.lumbridge.DukeHoracioDialogue; import rs09.game.content.quest.free.dragonslayer.NedDialogue; import rs09.game.world.GameWorld; import rs09.plugin.PluginManager; diff --git a/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java b/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java index 957d98c71..8b9d0d7d6 100644 --- a/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java +++ b/Server/src/main/java/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java @@ -4,7 +4,7 @@ import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.game.node.item.Item; import core.plugin.Initializable; -import rs09.game.content.dialogue.KingRoaldDialogue; +import rs09.game.content.dialogue.region.varrock.KingRoaldDialogue; import rs09.plugin.PluginManager; /** diff --git a/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingContest.java b/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingContest.java index 7b413d739..08bcf0da0 100644 --- a/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingContest.java +++ b/Server/src/main/java/core/game/content/quest/members/fishingcontest/FishingContest.java @@ -8,7 +8,7 @@ import core.game.node.entity.skill.Skills; @Initializable public class FishingContest extends Quest { - public FishingContest(){super("Fishing Contest",62,61,1,11,0,1,5);} + public FishingContest(){super("Fishing Contest",26,61,1,11,0,1,5);} public static final Item FISHING_ROD = new Item(307); public static final Item FISHING_PASS = new Item(27); public static final Item RED_VINE_WORM = new Item(25); diff --git a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java index 7d1cbd416..76e3eda47 100644 --- a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java +++ b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java @@ -3,6 +3,7 @@ package core.game.content.quest.members.merlinscrystal; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.quest.Quest; import core.plugin.Initializable; +import rs09.game.content.quest.members.merlinsquest.TheLadyOfTheLake; import rs09.plugin.PluginManager; /** diff --git a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java b/Server/src/main/java/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java deleted file mode 100644 index 3e4bf528b..000000000 --- a/Server/src/main/java/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java +++ /dev/null @@ -1,264 +0,0 @@ -package core.game.content.quest.members.merlinscrystal; - -import core.game.container.impl.EquipmentContainer; -import org.rs09.consts.Items; -import core.game.node.entity.player.link.diary.DiaryType; -import core.game.content.dialogue.DialoguePlugin; -import core.game.node.entity.npc.NPC; -import core.game.node.entity.player.Player; -import core.game.node.entity.player.link.quest.Quest; -import core.game.node.item.Item; - -import static rs09.tools.DialogueConstKt.END_DIALOGUE; - -/** - * Handles the LadyOfTheLake dialogue. - * - * @author Vexia - * @author Splinter - */ -public class TheLadyOfTheLake extends DialoguePlugin { - - /** - * Constructs a new {@code TheLadyOfTheLake} {@code Object} - */ - public TheLadyOfTheLake() { - /* - * empty. - */ - } - - /** - * Constructs a new {@code TheLadyOfTheLake} {@code Object} - * - * @param player the player. - */ - public TheLadyOfTheLake(Player player) { - super(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - if (!player.hasItem(new Item(35, 1))) { - npc("Good day to you, " + (player.isMale() ? "sir" : "madam") + "."); - stage = 0; - } else { - npc("Good day to you, " + (player.isMale() ? "sir" : "madam") + "."); - stage = 699; - } - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); - switch (stage) { - case END_DIALOGUE: - end(); - break; - case 0: - options("Who are you?", "I seek the sword Excalibur.", "Good day."); - stage = 1; - break; - case 1: - switch (buttonId) { - case 1: - player("Who are you?"); - stage = 100; - break; - case 2: - player("I seek the sword Excalibur."); - if (quest.getStage(player) < 50) { - stage = 250; - } else { - stage = 161; - } - break; - case 3: - player("Good day."); - stage = END_DIALOGUE; - break; - } - break; - case 250: - npc("I am afraid I do not know what you are talking about."); - stage = END_DIALOGUE; - break; - case 100: - npc("I am the Lady of the Lake."); - if (player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(2) - && player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null - && player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == 14631 - && (player.getInventory().containsAtLeastOneItem(Items.EXCALIBUR_35) || player.getEquipment().containsAtLeastOneItem(Items.EXCALIBUR_35))) { - stage = 110; - } else { - stage = 145; - } - break; - case 110: - player("And I'm-"); - stage++; - break; - case 111: - npc("You're " + player.getName() + ". And I see from the sign you", "wear that you have earned the trust of Sir Kay."); - stage++; - break; - case 112: - player("It was nothing.. really..."); - stage++; - break; - case 113: - npc("You shall be rewarded handsomely!"); - stage++; - break; - case 114: - interpreter.sendItemMessage(Items.EXCALIBUR_35, "The Lady of the Lake reaches out and touches the", "blade Excalibur which seems to vibrate with new power."); - if (player.getInventory().containsAtLeastOneItem(Items.EXCALIBUR_35)) { - player.getInventory().remove(new Item(Items.EXCALIBUR_35)); - player.getInventory().add(new Item(14632)); - } else if (player.getEquipment().containsAtLeastOneItem(Items.EXCALIBUR_35)) { - player.getEquipment().remove(new Item(Items.EXCALIBUR_35)); - player.getEquipment().add(new Item(14632), true, false); - } - stage++; - break; - case 115: - player("What does this do then?"); - stage++; - break; - case 116: - npc("I made the blade more powerful, and also gave it a", "rather healthy effect when you use the special."); - stage++; - break; - case 117: - player("Thanks!"); - stage = END_DIALOGUE; - break; - case 145: - options("I seek the sword Excalibur.", "Good day."); - stage = 150; - break; - case 150: - switch (buttonId) { - case 1: - player("I seek the sword Excalibur."); - stage = 161; - break; - case 2: - player("Good day."); - stage = END_DIALOGUE; - break; - } - break; - case 161: - if (quest.getStage(player) == 50 || quest.getStage(player) == 60) {// they haven't proven themselves yet - npc("Aye, I have that artefact in my possession."); - stage = 300; - } else if (quest.getStage(player) >= 70) { - npc("... But you have already proved thyself to be worthy", "of wielding it once already. I shall return it to you", "if you can prove yourself to still be worthy."); - stage = 162; - } - break; - case 162: - player("... And how can I do that?"); - stage = 163; - break; - case 163: - npc("Why, by proving yourself to be above material goods."); - stage = 164; - break; - case 164: - npc("500 coins ought to do it."); - stage = 166; - break; - case 166: - if (player.getInventory().contains(995, 500)) { - player("Ok, here you go."); - stage = 168; - } else { - player("I don't have that kind of money..."); - stage = 167; - } - break; - case 167: - npc("Well, come back when you do."); - stage = END_DIALOGUE; - break; - case 168: - if (player.getInventory().freeSlots() == 0) { - player("Sorry, I don't seem to have enough inventory space."); - stage = END_DIALOGUE; - } else if (player.getInventory().contains(995, 500)) { - player.getInventory().remove(new Item(995, 500)); - player.getInventory().add(new Item(35, 1)); - npc("You are still worthy to wield Excalibur! And thanks", "for the cash! I felt like getting a new haircut!"); - stage = 170; - } else { - player("I don't have that kind of money..."); - stage = 167; - } - break; - case 170: - interpreter.sendDialogue("The lady of the Lake hands you Excalibur."); - stage = END_DIALOGUE; - break; - case 300: - npc("'Tis very valuable, and not an artefact to be given", "away lightly."); - stage = 301; - break; - case 301: - npc("I would want to give it away only to one who is worthy", "and good."); - stage = 302; - break; - case 302: - player("And how am I meant to prove that?"); - stage = 303; - break; - case 303: - npc("I shall set a test for you."); - stage = 304; - break; - case 304: - npc("First I need you to travel to Port Sarim. Then go to", "the upstairs room of the jeweller's shop there."); - stage = 305; - break; - case 305: - player("Ok. That seems easy enough."); - quest.setStage(player, 60); - stage = END_DIALOGUE; - break; - case 699: - options("Who are you?", "Good day."); - stage = 700; - break; - case 700: - switch (buttonId) { - case 1: - player("Who are you?"); - stage = 720; - break; - case 2: - player("Good day."); - stage = END_DIALOGUE; - break; - } - break; - case 720: - npc("I am the Lady of the Lake."); - stage = END_DIALOGUE; - break; - } - return true; - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new TheLadyOfTheLake(player); - } - - @Override - public int[] getIds() { - return new int[]{250}; - } -} diff --git a/Server/src/main/java/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.java b/Server/src/main/java/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.java index e307fcf08..8aaadad58 100644 --- a/Server/src/main/java/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.java +++ b/Server/src/main/java/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.java @@ -10,6 +10,8 @@ import core.game.world.update.flag.context.Animation; /** * Handles the surok magis dialogue. * @author Vexia + * @editor Nuggles + * fixed the default dialogue, the NPC and Player tags were swapped. */ public class SurokMagisDialogue extends DialoguePlugin { @@ -105,31 +107,31 @@ public class SurokMagisDialogue extends DialoguePlugin { default: switch (stage) { case 0: - player("What do you want? ...Oh, wait. I know! You're", "probably just like all the others, aren't you? After some", "fancy spell or potion from me, I bet!"); + npc("What do you want? ...Oh, wait. I know! You're", "probably just like all the others, aren't you? After some", "fancy spell or potion from me, I bet!"); stage = 1; break; case 1: - npc("No! at least, I don't think so. What sort of spells", "do you have?"); + player("No! at least, I don't think so. What sort of spells", "do you have?"); stage = 2; break; case 2: - player("Hah! I knew it! I expect you want my Aphro-Dizzy-", "Yak spell! Want someone to fall madly in love with you,", "eh?"); + npc("Hah! I knew it! I expect you want my Aphro-Dizzy-", "Yak spell! Want someone to fall madly in love with you,", "eh?"); stage = 3; break; case 3: - npc("That spell sounds very interesting, but I didn't mean to", "disturb you!"); + player("That spell sounds very interesting, but I didn't mean to", "disturb you!"); stage = 4; break; case 4: - player("Well, I see that you do have some manners. I'm glad", "to see that you use them."); + npc("Well, I see that you do have some manners. I'm glad", "to see that you use them."); stage = 5; break; case 5: - player("Now, if it's all the same, I am very bust at the", "moment. Come back another time", "please and thank you."); + npc("Now, if it's all the same, I am very busy at the", "moment. Come back another time", "please and thank you."); stage = 6; break; case 6: - npc("Yes, of course!"); + player("Yes, of course!"); stage = 7; break; case 7: diff --git a/Server/src/main/java/core/game/content/zone/rellekka/RellekkaZone.java b/Server/src/main/java/core/game/content/zone/rellekka/RellekkaZone.java index e6837adfb..9aca35a5c 100644 --- a/Server/src/main/java/core/game/content/zone/rellekka/RellekkaZone.java +++ b/Server/src/main/java/core/game/content/zone/rellekka/RellekkaZone.java @@ -1,10 +1,14 @@ package core.game.content.zone.rellekka; import core.cache.def.impl.SceneryDefinition; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; import core.plugin.Initializable; import core.game.node.entity.skill.agility.AgilityHandler; import core.game.interaction.Option; import core.game.interaction.OptionHandler; +import core.game.component.Component; import core.game.node.Node; import core.game.node.entity.Entity; import core.game.node.entity.impl.ForceMovement; @@ -17,6 +21,7 @@ import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; +import rs09.game.world.GameWorld; import rs09.plugin.PluginManager; /** @@ -36,7 +41,6 @@ public final class RellekkaZone extends MapZone implements Plugin { @Override public Plugin newInstance(Object arg) throws Throwable { ZoneBuilder.configure(this); - PluginManager.definePlugin(new SailorDialogue()); PluginManager.definePlugin(new JarvaldDialogue()); PluginManager.definePlugins(new RellekaOptionHandler(), new MariaGunnarsDialogue()); PluginManager.definePlugin(new OptionHandler() { @@ -72,21 +76,9 @@ public final class RellekkaZone extends MapZone implements Plugin { * (option.equals("Trade") ? "buy clothes here" : * "change their shoes here") + "."); return true; */ - case 4165: - player.getDialogueInterpreter().open(1288); - return true; - case 4166: - player.sendMessage("This door is locked tightly shut."); - return true; - case 1288: - player.getDialogueInterpreter().sendDialogues((NPC) target, null, "I have no interest in talking to you just now", "outerlander."); - return true; - case 34286: - player.getDialogueInterpreter().sendDialogues(1289, null, "Outerlander... do not test my patience. I do not take", "kindly to people wandering in here and acting as though", "they own the place."); - return true; - case 4148: - player.getDialogueInterpreter().sendDialogues(1278, null, "Hey, outerlander. You can't go through there. Talent", "only, backstage."); - return true; + //case 4148: + // player.getDialogueInterpreter().sendDialogues(1278, null, "Hey, outerlander. You can't go through there. Talent", "only, backstage."); + // return true; case 100: player.getDialogueInterpreter().sendDialogue("You try to open the trapdoor but it won't budge! It looks like the", "trapdoor can only be opened from the other side."); return true; @@ -114,6 +106,35 @@ public final class RellekkaZone extends MapZone implements Plugin { register(new ZoneBorders(2602, 3639, 2739, 3741)); } + /** + * Sails a player using the relleka ships. + * @param player the player. + * @param name the name. + * @param destination the destination. + */ + public static void sail(final Player player, final String name, final Location destination) { + player.lock(); + player.getInterfaceManager().open(new Component(224)); + player.addExtension(LogoutTask.class, new LocationLogoutTask(5, destination)); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 5: + player.unlock(); + player.getInterfaceManager().close(); + player.getProperties().setTeleportLocation(destination); + player.getDialogueInterpreter().sendDialogue("The ship arrives at " + name + "."); + return true; + } + return false; + } + + }); + } + /** * Handles options related to relleka. * @author Vexia @@ -126,6 +147,7 @@ public final class RellekkaZone extends MapZone implements Plugin { SceneryDefinition.forId(4615).getHandlers().put("option:cross", this); SceneryDefinition.forId(5847).getHandlers().put("option:climb-over", this); SceneryDefinition.forId(5008).getHandlers().put("option:enter",this); + SceneryDefinition.forId(15116).getHandlers().put("option:climb-down", this); return this; } @@ -154,6 +176,13 @@ public final class RellekkaZone extends MapZone implements Plugin { break; } break; + case "climb-down": + switch(node.getId()){ + case 15116: + player.getProperties().setTeleportLocation(Location.create(2509, 10245, 0)); + break; + } + break; } return true; } diff --git a/Server/src/main/java/core/game/content/zone/rellekka/SailorDialogue.java b/Server/src/main/java/core/game/content/zone/rellekka/SailorDialogue.java deleted file mode 100644 index 5e5b12e60..000000000 --- a/Server/src/main/java/core/game/content/zone/rellekka/SailorDialogue.java +++ /dev/null @@ -1,77 +0,0 @@ -package core.game.content.zone.rellekka; - -import core.game.content.dialogue.DialoguePlugin; -import core.game.node.entity.npc.NPC; -import core.game.node.entity.player.Player; -import core.game.world.map.Location; - -import static rs09.tools.DialogueConstKt.END_DIALOGUE; - -/** - * Handles the sailor dialogue. - * @author Vexia - */ -public final class SailorDialogue extends DialoguePlugin { - - /** - * If its the relleka npc. - */ - private boolean rellekaNpc; - - /** - * Constructs a new {@Code SailorDialogue} {@Code Object} - */ - public SailorDialogue() { - - } - - /** - * Constructs a new {@Code SailorDialogue} {@Code Object} - * @param player the player. - */ - public SailorDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new SailorDialogue(player); - } - - @Override - public boolean open(Object... args) { - npc = (NPC) args[0]; - rellekaNpc = npc.getId() == 1385; - player("Ship's closed due to stingrays?"); - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - npc("Yes."); - stage = END_DIALOGUE; - //npc("Hello again, brother " + player.getUsername() + ". If you're ready to jump", "aboard, we're all ready to set sail with the tide!"); - //stage++; - break; - case 1: - player("Let's go!"); - stage++; - break; - case 2: - end(); - player.lock(); - player.sendMessage("You board the longship..."); - //RellekkaZone.sail(player, rellekaNpc ? "Miscellania" : "Rellekka", rellekaNpc ? Location.create(2581, 3845, 0) : Location.create(2629, 3693, 0)); - break; - } - return true; - } - - @Override - public int[] getIds() { - return new int[] { 1304 }; - } - -} diff --git a/Server/src/main/java/core/game/interaction/item/EmptyOptionPlugin.java b/Server/src/main/java/core/game/interaction/item/EmptyOptionPlugin.java index 5093dfd90..9d351cd14 100644 --- a/Server/src/main/java/core/game/interaction/item/EmptyOptionPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/EmptyOptionPlugin.java @@ -45,6 +45,7 @@ public final class EmptyOptionPlugin extends OptionHandler { public Plugin newInstance(Object arg) throws Throwable { ItemDefinition.setOptionHandler("empty", this); ItemDefinition.setOptionHandler("empty dish", this); + ItemDefinition.setOptionHandler("empty bowl", this); return this; } public enum EmptyItem{ @@ -57,10 +58,19 @@ public final class EmptyOptionPlugin extends OptionHandler { BUCKET_OF_SUPERCOMPOST(6034, BUCKET, "You empty the bucket of supercompost."), BUCKET_OF_SLIME(4286, BUCKET, "You empty the contents of the bucket on the floor."), VIAL_OF_WATER(227, VIAL, "You empty the vial."), - BOWL_OF_SAND(1921, 1923, "You empty the contents of the bowl onto the floor."), + BOWL_OF_WATER(1921, 1923, "You empty the contents of the bowl onto the floor."), JUG_OF_WATER(1937, 1935, "You empty the contents of the jug onto the floor."), BURNT_PIE(2329, 2313, "You empty the pie dish."), - POTION(91, VIAL,null); + POTION(91, VIAL,null), + BURNT_STEW(2005, 1923, "You empty the contents of the bowl onto the floor."), + NETTLE_TEA(4239, 1923, "You empty the contents of the bowl onto the floor."), + NETTLE_WATER(4237, 1923, "You empty the contents of the bowl onto the floor."), + NETTLE_TEA_MILKY(4240, 1923, "You empty the contents of the bowl onto the floor."), + BURNT_CURRY(2013, 1923, "You empty the contents of the bowl onto the floor."), + BURNT_GNOMEBOWL(2175, 2166, "You empty the contents of the gnomebowl onto the floor."), + BURNT_EGG(7090, 1923, "You empty the contents of the bowl onto the floor."), + BURNT_ONION(7092, 1923, "You empty the contents of the bowl onto the floor."), + BURNT_MUSHROOM(7094, 1923, "You empty the contents of the bowl onto the floor."); int fullId, emptyId; String emptyMessage; diff --git a/Server/src/main/java/core/game/interaction/item/SpadeDigOptionPlugin.java b/Server/src/main/java/core/game/interaction/item/SpadeDigOptionPlugin.java index 45872e953..2fad702f4 100644 --- a/Server/src/main/java/core/game/interaction/item/SpadeDigOptionPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/SpadeDigOptionPlugin.java @@ -24,6 +24,7 @@ public class SpadeDigOptionPlugin extends OptionHandler { @Override public boolean handle(final Player player, Node node, String option) { + player.getAudioManager().send(1470,1,1); if (!DigSpadeHandler.dig(player)) { player.sendMessage("You dig but find nothing."); } diff --git a/Server/src/main/java/core/game/interaction/item/withitem/PoisonRemovePlugin.java b/Server/src/main/java/core/game/interaction/item/withitem/PoisonRemovePlugin.java deleted file mode 100644 index 73fb90051..000000000 --- a/Server/src/main/java/core/game/interaction/item/withitem/PoisonRemovePlugin.java +++ /dev/null @@ -1,304 +0,0 @@ -package core.game.interaction.item.withitem; - -import core.game.interaction.NodeUsageEvent; -import core.game.interaction.UseWithHandler; -import core.game.node.entity.player.Player; -import core.game.node.item.Item; -import core.plugin.Initializable; -import core.plugin.Plugin; - -/** - * Represents the plugin used to remove poision from a weapon. - * @author 'Vexia - * @date 29/11/2013 - */ -@Initializable -public class PoisonRemovePlugin extends UseWithHandler { - - /** - * Constructs a new {@code PoisonRemovePlugin} {@code Object}. - */ - public PoisonRemovePlugin() { - super(883, 5616, 883, 885, 5617, 885, 887, 5618, 887, 889, 5619, 889, 891, 5620, 891, 893, 5621, 893, 871, 5655, 5662, 870, 5654, 5661, 872, 5656, 5663, 873, 5657, 5664, 875, 5659, 5666, 876, 5660, 5667, 874, 5658, 5665, 812, 5628, 5635, 813, 5629, 5636, 814, 5630, 5637, 3094, 5631, 5638, 815, 5632, 5639, 816, 5633, 5640, 817, 5634, 5641, 831, 5641, 5648, 832, 5642, 5649, 833, 5643, 5650, 834, 5644, 5651, 835, 5645, 5652, 836, 5646, 5653, 1219, 5668, 5686, 1221, 5670, 5688, 1223, 5672, 5690, 1225, 5674, 5692, 1227, 5676, 5694, 1229, 5678, 5696, 1231, 5680, 5698, 1233, 5682, 5700, 1251, 5704, 5618, 1253, 5706, 5620, 1255, 5708, 5622, 1257, 5710, 5624, 1259, 5712, 5626, 1261, 5714, 5628, 1263, 5716, 5630, 4582, 5734, 5636); - } - - @Override - public Plugin newInstance(Object arg) throws Throwable { - addHandler(3188, ITEM_TYPE, this); - return this; - } - - @Override - public boolean handle(NodeUsageEvent event) { - final Player player = event.getPlayer(); - final PoisonedWeapon weapon = PoisonedWeapon.forItem(event.getBaseItem().getName().contains("Cleaning") ? event.getUsedItem() : event.getBaseItem()); - if (weapon == null) { - return true; - } - if (player.getInventory().remove(event.getBaseItem().getName().contains("Cleaning") ? event.getUsedItem() : event.getBaseItem())) { - player.getInventory().add(new Item(weapon.getItem(), 1)); - } - return true; - } - - /** - * Represents the poisioning of a weapon. - * @author 'Vexia - */ - public enum PoisonedWeapon { - - /** - * Represents a poisioned weapon. - */ - BRONZE_ARROW(882, 883, 5616, 883), - /** - * Represents a poisioned weapon. - */ - IRON_ARROW(884, 885, 5617, 885), - /** - * Represents a poisioned weapon. - */ - STEEL_ARROW(886, 887, 5618, 887), - /** - * Represents a poisioned weapon. - */ - MITHRIL_ARROW(888, 889, 5619, 889), - /** - * Represents a poisioned weapon. - */ - ADAMANT_ARROW(890, 891, 5620, 891), - /** - * Represents a poisioned weapon. - */ - RUNE_ARROW(892, 893, 5621, 893), - /** - * Represents a poisioned weapon. - */ - IRON_KNIFE(863, 871, 5655, 5662), - /** - * Represents a poisioned weapon. - */ - RONZE_KNIFE(864, 870, 5654, 5661), - /** - * Represents a poisioned weapon. - */ - STEEL_KNIFE(865, 872, 5656, 5663), - /** - * Represents a poisioned weapon. - */ - MITHRIL_KNIFE(866, 873, 5657, 5664), - /** - * Represents a poisioned weapon. - */ - ADAMANT_KNIFE(867, 875, 5659, 5666), - /** - * Represents a poisioned weapon. - */ - RUNE_KNIFE(868, 876, 5660, 5667), - /** - * Represents a poisioned weapon. - */ - BLACK_KNIFE(869, 874, 5658, 5665), - /** - * Represents a poisioned weapon. - */ - BRONZE_DART(806, 812, 5628, 5635), - /** - * Represents a poisioned weapon. - */ - IRON_DART(807, 813, 5629, 5636), - /** - * Represents a poisioned weapon. - */ - STEEL_DART(808, 814, 5630, 5637), - /** - * Represents a poisioned weapon. - */ - BLACK_DART(3093, 3094, 5631, 5638), - /** - * Represents a poisioned weapon. - */ - MITHRIL_DART(809, 815, 5632, 5639), - /** - * Represents a poisioned weapon. - */ - ADAMANT_DART(810, 816, 5633, 5640), - /** - * Represents a poisioned weapon. - */ - RUNE_DART(811, 817, 5634, 5641), - /** - * Represents a poisioned weapon. - */ - IRON_JAVELIN(825, 831, 5641, 5648), - /** - * Represents a poisioned weapon. - */ - BRONZE_JAVELIN(826, 832, 5642, 5649), - /** - * Represents a poisioned weapon. - */ - STEEL_JAVELIN(827, 833, 5643, 5650), - /** - * Represents a poisioned weapon. - */ - MITHRIL_JAVELIN(828, 834, 5644, 5651), - /** - * Represents a poisioned weapon. - */ - ADAMANT_JAVELIN(829, 835, 5645, 5652), - /** - * Represents a poisioned weapon. - */ - RUNE_JAVELIN(830, 836, 5646, 5653), - /** - * Represents a poisioned weapon. - */ - IRON_DAGGER(1203, 1219, 5668, 5686), - /** - * Represents a poisioned weapon. - */ - BRONZE_DAGGER(1205, 1221, 5670, 5688), - /** - * Represents a poisioned weapon. - */ - STEEL_DAGGER(1207, 1223, 5672, 5690), - /** - * Represents a poisioned weapon. - */ - MITHRIL_DAGGER(1209, 1225, 5674, 5692), - /** - * Represents a poisioned weapon. - */ - ADAMANT_DAGGER(1211, 1227, 5676, 5694), - /** - * Represents a poisioned weapon. - */ - RUNE_DAGGER(1213, 1229, 5678, 5696), - /** - * Represents a poisioned weapon. - */ - DRAGON_DAGGER(1215, 1231, 5680, 5698), - /** - * Represents a poisioned weapon. - */ - BLACK_DAGGER(1217, 1233, 5682, 5700), - /** - * Represents a poisioned weapon. - */ - BRONZE_SPEAR(1237, 1251, 5704, 5618), - /** - * Represents a poisioned weapon. - */ - IRON_SPEAR(1239, 1253, 5706, 5620), - /** - * Represents a poisioned weapon. - */ - STEEL_SPEAR(1241, 1255, 5708, 5622), - /** - * Represents a poisioned weapon. - */ - MITHRIL_SPEAR(1243, 1257, 5710, 5624), - /** - * Represents a poisioned weapon. - */ - ADAMANT_SPEAR(1245, 1259, 5712, 5626), - /** - * Represents a poisioned weapon. - */ - RUNE_SPEAR(1247, 1261, 5714, 5628), - /** - * Represents a poisioned weapon. - */ - DRAGON_SPEAR(1249, 1263, 5716, 5630), - /** - * Represents a poisioned weapon. - */ - BLACK_SPEAR(4580, 4582, 5734, 5636); - - /** - * @param id the id. - * @return the value. - */ - public static PoisonedWeapon forId(int id) { - for (PoisonedWeapon weapon : PoisonedWeapon.values()) { - if (weapon.getItem() == id) { - return weapon; - } - } - return null; - } - - /** - * The item. - */ - private int item; - - /** - * The first stage. - */ - private int first; - - /** - * The second stage. - */ - private int second; - - /** - * The third stage. - */ - private int third; - - /** - * Constructs a new PoisionWeapon. - */ - PoisonedWeapon(int item, int first, int second, int third) { - this.item = item; - this.first = first; - this.second = second; - this.third = third; - } - - /** - * @return the first. - */ - public int getFirst() { - return first; - } - - /** - * @return the item. - */ - public int getItem() { - return item; - } - - /** - * @return the second. - */ - public int getSecond() { - return second; - } - - /** - * @return the third. - */ - public int getThird() { - return third; - } - - /** - * Method used to get the poisioned weapon for the id. - * @param i the id. - * @return the weapon. - */ - public static PoisonedWeapon forItem(final Item i) { - for (PoisonedWeapon weapon : values()) { - if (weapon.getFirst() == i.getId() || weapon.getSecond() == i.getId() || weapon.getThird() == i.getId()) { - return weapon; - } - } - return null; - } - } -} diff --git a/Server/src/main/java/core/game/interaction/item/withitem/PoisonWeaponPlugin.java b/Server/src/main/java/core/game/interaction/item/withitem/PoisonWeaponPlugin.java deleted file mode 100644 index 2a88511af..000000000 --- a/Server/src/main/java/core/game/interaction/item/withitem/PoisonWeaponPlugin.java +++ /dev/null @@ -1,348 +0,0 @@ -package core.game.interaction.item.withitem; - -import static api.ContentAPIKt.*; -import core.game.interaction.NodeUsageEvent; -import core.game.interaction.UseWithHandler; -import core.game.node.entity.player.Player; -import core.game.node.item.Item; -import core.game.world.update.flag.context.Animation; -import core.plugin.Initializable; -import core.plugin.Plugin; -import org.rs09.consts.Items; - -/** - * Handles weapon poisiong. - * @author 'Vexia - */ -@Initializable -public class PoisonWeaponPlugin extends UseWithHandler { - - /** - * Represents the poisioning of a weapon. - * @author 'Vexia - */ - public enum PoisonedWeapon { - - /** - * Represents a poisioned weapon. - */ - BRONZE_ARROW(882, 883, 5616, 883), - /** - * Represents a poisioned weapon. - */ - IRON_ARROW(884, 885, 5617, 885), - /** - * Represents a poisioned weapon. - */ - STEEL_ARROW(886, 887, 5618, 887), - /** - * Represents a poisioned weapon. - */ - MITHRIL_ARROW(888, 889, 5619, 889), - /** - * Represents a poisioned weapon. - */ - ADAMANT_ARROW(890, 891, 5620, 891), - /** - * Represents a poisioned weapon. - */ - RUNE_ARROW(892, 893, 5621, 893), - /** - * Represents a poisioned weapon. - */ - IRON_KNIFE(863, 871, 5655, 5662), - /** - * Represents a poisioned weapon. - */ - RONZE_KNIFE(864, 870, 5654, 5661), - /** - * Represents a poisioned weapon. - */ - STEEL_KNIFE(865, 872, 5656, 5663), - /** - * Represents a poisioned weapon. - */ - MITHRIL_KNIFE(866, 873, 5657, 5664), - /** - * Represents a poisioned weapon. - */ - ADAMANT_KNIFE(867, 875, 5659, 5666), - /** - * Represents a poisioned weapon. - */ - RUNE_KNIFE(868, 876, 5660, 5667), - /** - * Represents a poisioned weapon. - */ - BLACK_KNIFE(869, 874, 5658, 5665), - /** - * Represents a poisioned weapon. - */ - BRONZE_DART(806, 812, 5628, 5635), - /** - * Represents a poisioned weapon. - */ - IRON_DART(807, 813, 5629, 5636), - /** - * Represents a poisioned weapon. - */ - STEEL_DART(808, 814, 5630, 5637), - /** - * Represents a poisioned weapon. - */ - BLACK_DART(3093, 3094, 5631, 5638), - /** - * Represents a poisioned weapon. - */ - MITHRIL_DART(809, 815, 5632, 5639), - /** - * Represents a poisioned weapon. - */ - ADAMANT_DART(810, 816, 5633, 5640), - /** - * Represents a poisioned weapon. - */ - RUNE_DART(811, 817, 5634, 5641), - /** - * Represents a poisioned weapon. - */ - IRON_JAVELIN(825, 831, 5641, 5648), - /** - * Represents a poisioned weapon. - */ - BRONZE_JAVELIN(826, 832, 5642, 5649), - /** - * Represents a poisioned weapon. - */ - STEEL_JAVELIN(827, 833, 5643, 5650), - /** - * Represents a poisioned weapon. - */ - MITHRIL_JAVELIN(828, 834, 5644, 5651), - /** - * Represents a poisioned weapon. - */ - ADAMANT_JAVELIN(829, 835, 5645, 5652), - /** - * Represents a poisioned weapon. - */ - RUNE_JAVELIN(830, 836, 5646, 5653), - /** - * Represents a poisioned weapon. - */ - IRON_DAGGER(1203, 1219, 5668, 5686), - /** - * Represents a poisioned weapon. - */ - BRONZE_DAGGER(1205, 1221, 5670, 5688), - /** - * Represents a poisioned weapon. - */ - STEEL_DAGGER(1207, 1223, 5672, 5690), - /** - * Represents a poisioned weapon. - */ - MITHRIL_DAGGER(1209, 1225, 5674, 5692), - /** - * Represents a poisioned weapon. - */ - ADAMANT_DAGGER(1211, 1227, 5676, 5694), - /** - * Represents a poisioned weapon. - */ - RUNE_DAGGER(1213, 1229, 5678, 5696), - /** - * Represents a poisioned weapon. - */ - DRAGON_DAGGER(1215, 1231, 5680, 5698), - /** - * Represents a poisioned weapon. - */ - BLACK_DAGGER(1217, 1233, 5682, 5700), - /** - * Represents a poisioned weapon. - */ - BRONZE_SPEAR(1237, 1251, 5704, 5618), - /** - * Represents a poisioned weapon. - */ - IRON_SPEAR(1239, 1253, 5706, 5620), - /** - * Represents a poisioned weapon. - */ - STEEL_SPEAR(1241, 1255, 5708, 5622), - /** - * Represents a poisioned weapon. - */ - MITHRIL_SPEAR(1243, 1257, 5710, 5624), - /** - * Represents a poisioned weapon. - */ - ADAMANT_SPEAR(1245, 1259, 5712, 5626), - /** - * Represents a poisioned weapon. - */ - RUNE_SPEAR(1247, 1261, 5714, 5628), - /** - * Represents a poisioned weapon. - */ - DRAGON_SPEAR(1249, 1263, 5716, 5730), - /** - * Represents a poisioned weapon. - */ - BLACK_SPEAR(4580, 4582, 5734, 5636); - - /** - * @param id the id. - * @return the value. - */ - public static PoisonedWeapon forId(int id) { - for (PoisonedWeapon weapon : PoisonedWeapon.values()) { - if (weapon.getItem() == id) { - return weapon; - } - } - return null; - } - - /** - * The item. - */ - private int item; - - /** - * The first stage. - */ - private int first; - - /** - * The second stage. - */ - private int second; - - /** - * The third stage. - */ - private int third; - - /** - * Constructs a new PoisionWeapon. - */ - PoisonedWeapon(int item, int first, int second, int third) { - this.item = item; - this.first = first; - this.second = second; - this.third = third; - } - - /** - * @return the first. - */ - public int getFirst() { - return first; - } - - /** - * @return the item. - */ - public int getItem() { - return item; - } - - /** - * @return the second. - */ - public int getSecond() { - return second; - } - - /** - * @return the third. - */ - public int getThird() { - return third; - } - - /** - * Method used to get the poisioned weapon for the id. - * @param i the id. - * @return the weapon. - */ - public static PoisonedWeapon forItem(final Item i) { - for (PoisonedWeapon weapon : values()) { - if (weapon.getFirst() == i.getId() || weapon.getSecond() == i.getId() || weapon.getThird() == i.getId()) { - return weapon; - } - } - return null; - } - } - - public static void poison(Player player, int type, int item, final Item weaponItem, PoisonedWeapon weapon) { - int product = -1; - player.animate(new Animation(1652)); - switch (item) { - case 187:// normal. - product = weapon.getFirst(); - player.getInventory().remove(new Item(187, 1)); - break; - case 5937:// second - product = weapon.getSecond(); - player.getInventory().remove(new Item(5937, 1)); - break; - case 5940:// third. - product = weapon.getThird(); - player.getInventory().remove(new Item(5940, 1)); - break; - default: - break; - } - int amt = Math.min(weaponItem.getAmount(), 5); - player.getInventory().remove(new Item(weaponItem.getId(), amt)); - addItemOrDrop(player, product, amt); - addItemOrDrop(player, Items.VIAL_229, 1); - player.getPacketDispatch().sendMessage("You poison the " + weaponItem.getName().toLowerCase() + "."); - } - - public PoisonWeaponPlugin() { - super(882, 884, 886, 888, 890, 892, 863, 864, 865, 866, 867, 868, 869, 806, 807, 808, 3093, 809, 810, 811, 825, 826, 827, 828, 829, 830, 1203, 1205, 1207, 1209, 1211, 1213, 1215, 1217, 1237, 1239, 1241, 1243, 1245, 1247, 1249, 4580); - } - - @Override - public boolean handle(NodeUsageEvent event) { - final Player player = event.getPlayer(); - final Item second = (Item) event.getUsedWith(); - if (event.getUsedItem().getId() == 187 || second.getId() == 187) { - - if (event.getUsedItem().getId() != 187) { - poison(player, 1, second.getId(), event.getUsedItem(), PoisonedWeapon.forId(event.getUsedItem().getId())); - } else if (second.getId() != 187) { - poison(player, 1, event.getUsedItem().getId(), second, PoisonedWeapon.forId(second.getId())); - } - } - if (event.getUsedItem().getId() == 5937 || second.getId() == 5937) { - if (event.getUsedItem().getId() != 5937) { - poison(player, 2, second.getId(), event.getUsedItem(), PoisonedWeapon.forId(event.getUsedItem().getId())); - } else if (second.getId() != 5937) { - poison(player, 2, event.getUsedItem().getId(), second, PoisonedWeapon.forId(second.getId())); - } - } - if (event.getUsedItem().getId() == 5940 || second.getId() == 5940) { - if (event.getUsedItem().getId() != 5940) { - poison(player, 3, second.getId(), event.getUsedItem(), PoisonedWeapon.forId(event.getUsedItem().getId())); - } else if (second.getId() != 5940) { - poison(player, 3, event.getUsedItem().getId(), second, PoisonedWeapon.forId(second.getId())); - } - } - return true; - } - - @Override - public Plugin newInstance(Object arg) throws Throwable { - addHandler(187, ITEM_TYPE, this); - addHandler(5937, ITEM_TYPE, this); - addHandler(5940, ITEM_TYPE, this); - return this; - } - -} diff --git a/Server/src/main/java/core/game/interaction/object/BankingPlugin.java b/Server/src/main/java/core/game/interaction/object/BankingPlugin.java index c4b7c6ecb..60ecc5a96 100644 --- a/Server/src/main/java/core/game/interaction/object/BankingPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/BankingPlugin.java @@ -131,7 +131,7 @@ public final class BankingPlugin extends OptionHandler { /** * Represents the banker npc ids. */ - private static final int[] NPC_IDS = {44, 45, 166, 494, 495, 496, 497, 498, 499, 902, 1036, 1360, 1702, 2163, 2164, 2354, 2355, 2568, 2569, 2570, 2619, 3046, 3198, 3199, 3824, 4296, 4519, 5257, 5258, 5259, 5260, 5383, 5488, 5776, 5777, 5898, 5912, 5913, 6200, 6362, 6532, 6533, 6534, 6535, 6538, 7049, 7050, 7445, 7446, 7605}; + private static final int[] NPC_IDS = {44, 45, 166, 494, 495, 496, 497, 498, 499, 902, 1036, 1360, 1702, 2163, 2164, 2354, 2355, 2568, 2569, 2570, 2619, 3046, 3198, 3199, 3824, 4296, 5257, 5258, 5259, 5260, 5383, 5488, 5776, 5777, 5898, 5912, 5913, 6200, 6362, 6532, 6533, 6534, 6535, 6538, 7049, 7050, 7445, 7446, 7605}; /** * Represents the id to use. diff --git a/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.java b/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.java index b2a2cece0..57c54cc53 100644 --- a/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.java +++ b/Server/src/main/java/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.java @@ -4,6 +4,7 @@ import core.game.component.Component; import core.game.component.ComponentDefinition; import core.game.component.ComponentPlugin; import core.game.content.global.action.DoorActionHandler; +import core.game.node.Node; import core.game.node.entity.impl.ForceMovement; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.audio.Audio; @@ -72,6 +73,31 @@ public final class WildernessInterfacePlugin extends ComponentPlugin { ActivityManager.register(new BountyHunterActivity(CraterType.HIGH_LEVEL)); }*/ } + public static void handleBotDitch(final Player player, Node node) { + Scenery ditch = node.asScenery(); + player.removeAttribute("wildy_ditch"); + Location l = ditch.getLocation(); + int x = player.getLocation().getX(); + int y = player.getLocation().getY(); + if (ditch.getRotation() % 2 == 0) { + if (y <= l.getY()) { + ForceMovement.run(player, Location.create(x, l.getY() - 1, 0), Location.create(x, l.getY() + 2, 0), ANIMATION, 20).setEndAnimation(null); + } else { + ForceMovement.run(player, Location.create(x, l.getY() + 2, 0), Location.create(x, l.getY() - 1, 0), ANIMATION, 20).setEndAnimation(null); + } + } else { + if (x > l.getX()) { + ForceMovement.run(player, Location.create(l.getX() + 2, y, 0), Location.create(l.getX() - 1, y, 0), ANIMATION, 20).setEndAnimation(null); + } else { + ForceMovement.run(player, Location.create(l.getX() - 1, y, 0), Location.create(l.getX() + 2, y, 0), ANIMATION, 20).setEndAnimation(null); + } + } + player.getAudioManager().send(new Audio(2462, 10, 30)); + /*if (GameWorld.getSettings().isPvp()) { + ActivityManager.register(new BountyHunterActivity(CraterType.MID_LEVEL)); + ActivityManager.register(new BountyHunterActivity(CraterType.HIGH_LEVEL)); + }*/ + } public static void handleGate(final Player player){ Scenery gate = player.getAttribute("wildy_gate"); // Cleanup diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/GiantMoleNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/GiantMoleNPC.java index 71a93779d..b3e319508 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/GiantMoleNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/GiantMoleNPC.java @@ -211,11 +211,7 @@ public final class GiantMoleNPC extends AbstractNPC { @Override public void onImpact(final Entity entity, BattleState state) { if (!getLocks().isInteractionLocked()) { - int chance = 15; - if (getSkills().getLifepoints() < getSkills().getMaximumLifepoints() >> 1) { - chance *= 3; - } - if (RandomFunction.randomize(100) < chance && inCombat()) { + if (RandomFunction.randomize(100) < 24 && inCombat() && getSkills().getLifepoints() < 100 && getSkills().getLifepoints() > 5){ dig(); return; } @@ -243,6 +239,7 @@ public final class GiantMoleNPC extends AbstractNPC { public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { if (button == 17) { player.getProperties().setTeleportLocation(Location.create(1752, 5237, 0)); + player.getAudioManager().send(1384); player.getPacketDispatch().sendMessage("You seem to have dropped down into a network of mole tunnels."); if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0, 5)) { diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.java index 0660e4477..80c8963ac 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.java @@ -8,6 +8,7 @@ import core.game.node.entity.combat.equipment.SwitchAttack; import core.game.node.entity.impl.Projectile; import core.game.node.entity.npc.AbstractNPC; import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; import core.game.node.item.Item; import core.game.world.map.Location; import core.game.world.map.RegionManager; @@ -62,7 +63,7 @@ public class ChaosElementalNPC extends AbstractNPC { @Override public void sendImpact(BattleState state) { if (state.getEstimatedHit() > 28) { - state.setEstimatedHit(RandomFunction.random(20, 28)); + state.setEstimatedHit(RandomFunction.random(20, 28)); //possibly absolutely mental "haha random" damage adjustment. not sure. - crash } super.sendImpact(state); } @@ -135,7 +136,11 @@ public class ChaosElementalNPC extends AbstractNPC { if (player == null) { return; } - if (attack.getProjectile().getProjectileId() == 554) { + if (attack.getProjectile().getProjectileId() == 557) { + player.getAudioManager().send(new Audio(350), true); // C. Elemental Discord Impact SFX + } + else if (attack.getProjectile().getProjectileId() == 554) { + player.getAudioManager().send(new Audio(346), true); // C. Elemental Confusion Impact SFX Location loc = getRandomLoc(entity); while (!RegionManager.isTeleportPermitted(loc) || RegionManager.getObject(loc) != null) { loc = getRandomLoc(entity); @@ -145,6 +150,7 @@ public class ChaosElementalNPC extends AbstractNPC { } player.teleport(loc); } else if (attack.getProjectile().getProjectileId() == 551) { + player.getAudioManager().send(new Audio(353), true); // C. Elemental Madness Impact SFX if (player.getInventory().freeSlots() < 1 || player.getEquipment().itemCount() < 1) { return; } diff --git a/Server/src/main/java/core/game/node/entity/npc/drop/CELEMinorTable.java b/Server/src/main/java/core/game/node/entity/npc/drop/CELEMinorTable.java new file mode 100644 index 000000000..68b5bf4ca --- /dev/null +++ b/Server/src/main/java/core/game/node/entity/npc/drop/CELEMinorTable.java @@ -0,0 +1,94 @@ +package core.game.node.entity.npc.drop; + +import rs09.ServerConstants; +import core.game.node.item.Item; +import core.game.node.item.WeightedChanceItem; +import rs09.game.system.SystemLogger; +import core.tools.RandomFunction; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the Chaos Elemental's minor drop table. It is supposed to roll this table alongside its standard major drops on the main table. + * @author Crash + */ +public final class CELEMinorTable { + + /** + * The item id of the item representing the C. Ele minor drop table slot in a drop + * table. + */ + public static final int SLOT_ITEM_ID = 799; // Crash: Item ID 799 is currently a null, blank paper note object. Unsure if used for cutscene/cutscene items, but hijacking this as C.Ele's item container as it'll never be dropped or obtained in normal gameplay. + + /** + * The rare drop table. + */ + private static final List TABLE = new ArrayList<>(20); + + + /** + * Initialize needed objects for xml reading/writing + */ + static DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + static DocumentBuilder builder; + + static { + try { + builder = factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } + } + + public CELEMinorTable() throws ParserConfigurationException {} + + /** + * Initializes the C. Ele minor table. + */ + public static void init(){ + if(ServerConstants.CELEDT_DATA_PATH != null && !new File(ServerConstants.CELEDT_DATA_PATH).exists()){ + SystemLogger.logErr("Can't locate CELEDT file at " + ServerConstants.CELEDT_DATA_PATH); + return; + } + parse(ServerConstants.CELEDT_DATA_PATH); + } + + /** + * Parses the xml file for the CELEDT. + * @param file the .xml file containing the CELEDT. + */ + public static void parse(String file){ + try { + Document doc = builder.parse(file); + + NodeList itemNodes = doc.getElementsByTagName("item"); + for(int i = 0; i < itemNodes.getLength(); i++){ + Node itemNode = itemNodes.item(i); + if(itemNode.getNodeType() == Node.ELEMENT_NODE){ + Element item = (Element) itemNode; + int itemId = Integer.parseInt(item.getAttribute("id")); + int minAmt = Integer.parseInt(item.getAttribute("minAmt")); + int maxAmt = Integer.parseInt(item.getAttribute("maxAmt")); + int weight = Integer.parseInt(item.getAttribute("weight")); + + TABLE.add(new WeightedChanceItem(itemId,minAmt,maxAmt,weight)); + } + } + } catch (Exception e){ + e.printStackTrace(); + } + } + + public static Item retrieve(){ + return RandomFunction.rollWeightedChanceTable(TABLE); + } +} \ No newline at end of file diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/ArcticBearNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/ArcticBearNPC.java index 92914caaf..e65013e9d 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/ArcticBearNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/ArcticBearNPC.java @@ -1,5 +1,7 @@ package core.game.node.entity.npc.familiar; +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; import core.game.node.entity.Entity; @@ -31,6 +33,7 @@ public class ArcticBearNPC extends Familiar { */ public ArcticBearNPC(Player owner, int id) { super(owner, id, 2800, 12057, 6, WeaponInterface.STYLE_CONTROLLED); + boosts.add(new SkillBonus(Skills.HUNTER, 7)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/ForgeRegentNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/ForgeRegentNPC.java index 7b64dc9d4..e3ed62b83 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/ForgeRegentNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/ForgeRegentNPC.java @@ -16,6 +16,7 @@ import core.game.world.update.flag.player.FaceLocationFlag; import core.plugin.Initializable; import core.plugin.Plugin; import rs09.plugin.PluginManager; +import core.game.node.entity.skill.SkillBonus; import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.firemaking.FireMakingPulse; import core.game.node.entity.skill.firemaking.Log; @@ -53,6 +54,7 @@ public class ForgeRegentNPC extends Familiar { */ public ForgeRegentNPC(Player owner, int id) { super(owner, id, 4500, 12782, 6, WeaponInterface.STYLE_RANGE_ACCURATE); + boosts.add(new SkillBonus(Skills.FIREMAKING, 4)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/LavaTitanNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/LavaTitanNPC.java index e9122866d..11c059e26 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/LavaTitanNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/LavaTitanNPC.java @@ -30,6 +30,7 @@ public class LavaTitanNPC extends Familiar { public LavaTitanNPC(Player owner, int id) { super(owner, id, 6100, 12788, 4, WeaponInterface.STYLE_AGGRESSIVE); boosts.add(new SkillBonus(Skills.MINING, 10)); + boosts.add(new SkillBonus(Skills.FIREMAKING, 10)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/MagpieNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/MagpieNPC.java index 4aed1733b..86d2a9794 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/MagpieNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/MagpieNPC.java @@ -1,5 +1,6 @@ package core.game.node.entity.npc.familiar; +import core.game.node.entity.skill.SkillBonus; import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.crafting.gem.Gems; import core.game.node.entity.skill.summoning.familiar.Familiar; @@ -38,6 +39,7 @@ public class MagpieNPC extends Forager { */ public MagpieNPC(Player owner, int id) { super(owner, id, 3400, 12041, 3, ITEMS); + boosts.add(new SkillBonus(Skills.THIEVING, 3)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/PyreLordNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/PyreLordNPC.java index da1335864..7f7f12db8 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/PyreLordNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/PyreLordNPC.java @@ -2,6 +2,7 @@ package core.game.node.entity.npc.familiar; import core.game.node.entity.player.link.diary.DiaryType; import core.plugin.Initializable; +import core.game.node.entity.skill.SkillBonus; import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting; import core.game.node.entity.skill.firemaking.FireMakingPulse; @@ -53,6 +54,7 @@ public class PyreLordNPC extends Familiar { */ public PyreLordNPC(Player owner, int id) { super(owner, id, 3200, 12816, 6, WeaponInterface.STYLE_AGGRESSIVE); + boosts.add(new SkillBonus(Skills.FIREMAKING, 3)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritGraahkNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritGraahkNPC.java index 599996f1f..3a642dde6 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritGraahkNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritGraahkNPC.java @@ -1,5 +1,7 @@ package core.game.node.entity.npc.familiar; +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; import core.game.node.entity.combat.equipment.WeaponInterface; @@ -27,6 +29,7 @@ public class SpiritGraahkNPC extends Familiar { */ public SpiritGraahkNPC(Player owner, int id) { super(owner, id, 4900, 12810, 3, WeaponInterface.STYLE_AGGRESSIVE); + boosts.add(new SkillBonus(Skills.HUNTER, 5)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritKyattNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritKyattNPC.java index 897ea43ca..f4b6097a2 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritKyattNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritKyattNPC.java @@ -1,5 +1,7 @@ package core.game.node.entity.npc.familiar; +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; import core.game.node.entity.combat.equipment.WeaponInterface; @@ -27,6 +29,7 @@ public class SpiritKyattNPC extends Familiar { */ public SpiritKyattNPC(Player owner, int id) { super(owner, id, 4900, 12812, 3, WeaponInterface.STYLE_ACCURATE); + boosts.add(new SkillBonus(Skills.HUNTER, 5)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.java index acb630e72..d4382db5c 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.java @@ -1,6 +1,7 @@ package core.game.node.entity.npc.familiar; import core.plugin.Initializable; +import core.game.node.entity.skill.SkillBonus; import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; @@ -31,6 +32,7 @@ public class SpiritLarupiaNPC extends Familiar { */ public SpiritLarupiaNPC(Player owner, int id) { super(owner, id, 4900, 12784, 6, WeaponInterface.STYLE_CONTROLLED); + boosts.add(new SkillBonus(Skills.HUNTER, 5)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java index 255cd6c62..90f0000b4 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java @@ -2,6 +2,7 @@ package core.game.node.entity.npc.familiar; import core.cache.def.impl.NPCDefinition; import core.plugin.Initializable; +import core.game.node.entity.skill.SkillBonus; import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; @@ -97,6 +98,7 @@ public final class VoidFamiliarNPC implements Plugin { */ public VoidRavagerNPC(Player owner, int id) { super(owner, id, 2700, 12818, 3, WeaponInterface.STYLE_AGGRESSIVE, ITEMS); + boosts.add(new SkillBonus(Skills.MINING, 1)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/npc/familiar/WolpertingerNPC.java b/Server/src/main/java/core/game/node/entity/npc/familiar/WolpertingerNPC.java index 4bee97387..a69839d66 100644 --- a/Server/src/main/java/core/game/node/entity/npc/familiar/WolpertingerNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/familiar/WolpertingerNPC.java @@ -1,6 +1,7 @@ package core.game.node.entity.npc.familiar; import core.plugin.Initializable; +import core.game.node.entity.skill.SkillBonus; import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; @@ -30,6 +31,7 @@ public class WolpertingerNPC extends Familiar { */ public WolpertingerNPC(Player owner, int id) { super(owner, id, 6200, 12089, 1, WeaponInterface.STYLE_CAST); + boosts.add(new SkillBonus(Skills.HUNTER, 5)); } @Override diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/BuildHotspot.java b/Server/src/main/java/core/game/node/entity/skill/construction/BuildHotspot.java index b3cefa033..828bd5f6f 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/BuildHotspot.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/BuildHotspot.java @@ -16,7 +16,7 @@ public enum BuildHotspot { /** * Low level garden hotspots. */ - CENTREPIECE_1(15361, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.PORTAL, Decoration.ROCK, Decoration.POND, Decoration.IMP_STATUE, Decoration.DUNGEON_ENTRANCE), + CENTREPIECE_1(15361, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.PORTAL, Decoration.ROCK, Decoration.POND, Decoration.IMP_STATUE, Decoration.SMALL_OBELISK, Decoration.DUNGEON_ENTRANCE), BIG_TREE_1(15362, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.BIG_DEAD_TREE, Decoration.BIG_TREE, Decoration.BIG_OAK_TREE, Decoration.BIG_WILLOW_TREE, Decoration.BIG_MAPLE_TREE, Decoration.BIG_YEW_TREE, Decoration.BIG_MAGIC_TREE), TREE_1(15363, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.DEAD_TREE, Decoration.TREE, Decoration.OAK_TREE, Decoration.WILLOW_TREE, Decoration.MAPLE_TREE, Decoration.YEW_TREE, Decoration.MAGIC_TREE), BIG_PLANT_1(15364, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.FERN, Decoration.BUSH, Decoration.TALL_PLANT), diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/BuildingUtils.java b/Server/src/main/java/core/game/node/entity/skill/construction/BuildingUtils.java index 5399e0bbf..9a9dd5842 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/BuildingUtils.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/BuildingUtils.java @@ -85,21 +85,21 @@ public final class BuildingUtils { int c261Value = 0; - for (int i = 0; i < 7; i++) { - int itemsStringOffset = 97 + (i * 5); + for (int menuIndex = 0; menuIndex < 7; menuIndex++) { + int itemsStringOffset = 97 + (menuIndex * 5); //97 + - if (i >= hotspot.getDecorations().length || (hotspot.getDecorations()[i] != null && hotspot.getDecorations()[i].isInvisibleNode())) { + if (menuIndex >= hotspot.getDecorations().length || (hotspot.getDecorations()[menuIndex] != null && hotspot.getDecorations()[menuIndex].isInvisibleNode())) { for (int j = 0; j < 5; j++) { player.getPacketDispatch().sendString("", 396, itemsStringOffset + j); } - player.getPacketDispatch().sendString("", 396, 140 + i); - c261Value += (1 << (i + 1)); + player.getPacketDispatch().sendString("", 396, 140 + menuIndex); + c261Value += (1 << (menuIndex + 1)); continue; } - Decoration decoration = hotspot.getDecorations()[i]; - items[BUILD_INDEXES[i]] = new Item(decoration.getInterfaceItem()); + Decoration decoration = hotspot.getDecorations()[menuIndex]; + items[BUILD_INDEXES[menuIndex]] = new Item(decoration.getInterfaceItem()); player.getPacketDispatch().sendString(ItemDefinition.forId(decoration.getInterfaceItem()).getName(), 396, itemsStringOffset); boolean hasRequirements = player.getSkills().getLevel(Skills.CONSTRUCTION) >= decoration.getLevel(); for (int j = 0; j < 4; j++) { @@ -127,14 +127,16 @@ public final class BuildingUtils { continue; }*/ player.getPacketDispatch().sendString(s, 396, (itemsStringOffset + 1) + j); - if (hasRequirements) - c261Value += (1 << (i + 1)); } } - player.getConfigManager().set(1485 + i, hasRequirements || player.isStaff() ? 1 : 0); - player.getPacketDispatch().sendString("Lvl " + decoration.getLevel(), 396, 140 + i); + if (hasRequirements) { + c261Value += (1 << (menuIndex + 1)); + } + player.getConfigManager().set(1485 + menuIndex, hasRequirements || player.isStaff() ? 1 : 0); + player.getPacketDispatch().sendString("Level " + decoration.getLevel(), 396, 140 + menuIndex); //player.getPacketDispatch().sendItemZoomOnInterface(items[i].protocol(), 50000, 396, 49 + i); } + System.out.println(c261Value); player.getConfigManager().set(261, c261Value); PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 396, 132, 8, items, false)); } diff --git a/Server/src/main/java/core/game/node/entity/skill/construction/Decoration.java b/Server/src/main/java/core/game/node/entity/skill/construction/Decoration.java index 792e10bd0..da693a1bb 100644 --- a/Server/src/main/java/core/game/node/entity/skill/construction/Decoration.java +++ b/Server/src/main/java/core/game/node/entity/skill/construction/Decoration.java @@ -21,6 +21,7 @@ public enum Decoration { ROCK(13406, 8169, 5, 100.0, new Item(3420, 5)), POND(13407, 8170, 10, 100.0, new Item(1761, 10)), IMP_STATUE(13408, 8171, 15, 150.0, new Item(3420, 5), new Item(1761, 5)), + SMALL_OBELISK(42004, 14657, 41, 676, new Item(8786, 1), new Item(12183, 1000), new Item(12160, 10), new Item(12163, 10)), DUNGEON_ENTRANCE(13409, 8172, 70, 500.0, new Item(8786)), diff --git a/Server/src/main/java/core/game/node/entity/skill/fishing/FishingOption.java b/Server/src/main/java/core/game/node/entity/skill/fishing/FishingOption.java index ce7d9b51a..d3897f6a7 100644 --- a/Server/src/main/java/core/game/node/entity/skill/fishing/FishingOption.java +++ b/Server/src/main/java/core/game/node/entity/skill/fishing/FishingOption.java @@ -20,7 +20,7 @@ public enum FishingOption { CRAYFISH_CAGE(new Item(13431), 1, Animation.create(619), null, "cage", Fish.CRAYFISH), SMALL_NET(new Item(303), 1, Animation.create(621), null, "net", Fish.SHRIMP, Fish.ANCHOVIE), - BAIT(new Item(307), 5, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.SARDINE, Fish.HERRING), + BAIT(new Item(307), 5, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.SARDINE, Fish.HERRING), LURE(new Item(309), 20, new Animation(622), new Item[]{new Item(Items.FEATHER_314), new Item(Items.STRIPY_FEATHER_10087)}, "lure", Fish.TROUT, Fish.SALMON, Fish.RAINBOW_FISH), L_BAIT(new Item(307), 25, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.PIKE), CAGE(new Item(301), 40, Animation.create(619), null, "cage", Fish.LOBSTER), @@ -29,10 +29,13 @@ public enum FishingOption { BIG_NET(new Item(305), 16, Animation.create(620), null, "net", Fish.MACKEREL, Fish.COD, Fish.BASS, Fish.SEAWEED), N_HARPOON(new Item(311), 76, Animation.create(618), null, "harpoon", Fish.SHARK), H_NET(new Item(303), 62, Animation.create(621), null, "net", Fish.MONKFISH), + MORTMYRE_ROD(new Item(307), 5, Animation.create(622), new Item[]{new Item(313)},"bait", Fish.SLIMY_EEL), + LUMBDSWAMP_ROD(new Item(307), 5, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.SLIMY_EEL, Fish.FROG_SPAWN), KBWANJI_NET(new Item(Items.SMALL_FISHING_NET_303), 5, Animation.create(621), null, "net", Fish.KARAMBWANJI), - KARAMBWAN_VES(new Item(Items.KARAMBWAN_VESSEL_3157), 65, Animation.create(1193), new Item[]{new Item(Items.RAW_KARAMBWANJI_3150)}, "fish", Fish.KARAMBWAN); + KARAMBWAN_VES(new Item(Items.KARAMBWAN_VESSEL_3157), 65, Animation.create(1193), new Item[]{new Item(Items.RAW_KARAMBWANJI_3150)}, "fish", Fish.KARAMBWAN), + OILY_FISHING_ROD(new Item(Items.OILY_FISHING_ROD_1585), 53, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.LAVA_EEL); - public static HashMap nameMap = new HashMap<>(); + public static final HashMap nameMap = new HashMap<>(); static{ for(FishingOption option : FishingOption.values()){ nameMap.putIfAbsent(option.name,option); @@ -79,18 +82,13 @@ public enum FishingOption { * @param animation The animation. * @param fish The fish to catch. */ - private FishingOption(Item tool, int level, Animation animation, Item[] bait, String name, Fish... fish) { + FishingOption(Item tool, int level, Animation animation, Item[] bait, String name, Fish... fish) { this.tool = tool; this.level = level; this.animation = animation; this.bait = bait; this.name = name; - Arrays.sort(fish, new Comparator() { - @Override - public int compare(Fish x, Fish y) { - return y.getLevel() - x.getLevel(); - } - }); + Arrays.sort(fish, (x, y) -> y.getLevel() - x.getLevel()); this.fish = fish; } diff --git a/Server/src/main/java/core/game/node/entity/skill/fishing/FishingSpot.java b/Server/src/main/java/core/game/node/entity/skill/fishing/FishingSpot.java index 7bf83f6ca..a5c20788e 100644 --- a/Server/src/main/java/core/game/node/entity/skill/fishing/FishingSpot.java +++ b/Server/src/main/java/core/game/node/entity/skill/fishing/FishingSpot.java @@ -8,25 +8,25 @@ import java.util.HashMap; */ public enum FishingSpot { - NET_BAIT(new int[] { 952, 316, 319, 320, 323, 325, 326, 327, 330, 332, 404, 1331, 2067, 2068, 2724, 4908, 5748, 5749, 7045 }, FishingOption.SMALL_NET, FishingOption.BAIT), + NET_BAIT(new int[] { 952, 316, 319, 320, 323, 325, 326, 327, 330, 332, 404, 1331, 2724, 4908, 7045 }, FishingOption.SMALL_NET, FishingOption.BAIT), LURE_BAIT(new int[] { 309, 310, 311, 314, 315, 317, 318, 328, 329, 331, 403, 927, 1189, 1190, 3019 }, FishingOption.LURE, FishingOption.L_BAIT), CAGE_HARPOON(new int[] { 312, 321, 324, 333, 405, 1332, 1399, 3804, 5470, 7046}, FishingOption.CAGE, FishingOption.HARPOON), NET_HARPOON(new int[] { 313, 322, 334, 406, 1191, 1333, 1405, 1406, 3574, 3575, 5471, 7044 }, FishingOption.BIG_NET, FishingOption.N_HARPOON), HARPOON_NET(new int[] { 3848, 3849 }, FishingOption.HARPOON, FishingOption.H_NET, FishingOption.BARB_HARPOON), + SPOT_MORTMYRE(new int[] {5748, 5749}, FishingOption.MORTMYRE_ROD), + SPOT_LUMDSAWMP(new int[] {2067, 2068}, FishingOption.LUMBDSWAMP_ROD), SPOT_KBWANJI(new int[] {1174}, FishingOption.KBWANJI_NET), - SPOT_KARAMBWAN(new int[] {1177}, FishingOption.KARAMBWAN_VES); + SPOT_KARAMBWAN(new int[] {1177}, FishingOption.KARAMBWAN_VES), + BAIT_EELS(new int[] {800}, FishingOption.OILY_FISHING_ROD); public static HashMap spotMap = new HashMap<>(); static{ FishingSpot[] spots = values(); - int spotsLength = spots.length; - for (int x = 0; x < spotsLength; x++) { - FishingSpot spot = spots[x]; + for (FishingSpot spot : spots) { int[] spotIds = spot.ids; - int spotIdsLength = spotIds.length; - for (int y = 0; y < spotIdsLength; y++) { - spotMap.putIfAbsent(spotIds[y],spot); + for (int spotId : spotIds) { + spotMap.putIfAbsent(spotId, spot); } } } @@ -50,7 +50,7 @@ public enum FishingSpot { * Constructs a new {@code FishingSpot} {@code Object}. * @param ids The NPC ids. */ - private FishingSpot(int[] ids, FishingOption... options) { + FishingSpot(int[] ids, FishingOption... options) { this.ids = ids; this.options = options; } diff --git a/Server/src/main/java/core/game/node/entity/skill/fletching/items/bow/StringPulse.java b/Server/src/main/java/core/game/node/entity/skill/fletching/items/bow/StringPulse.java index bc1b858e0..02cf1c051 100644 --- a/Server/src/main/java/core/game/node/entity/skill/fletching/items/bow/StringPulse.java +++ b/Server/src/main/java/core/game/node/entity/skill/fletching/items/bow/StringPulse.java @@ -40,7 +40,7 @@ public class StringPulse extends SkillPulse { @Override public boolean checkRequirements() { if (getDelay() == 1) { - setDelay(bow.string == 1777 ? 9 : 7); + setDelay(bow.string == 1777 ? 2 : 1); } if (player.getSkills().getLevel(Skills.FLETCHING) < bow.level) { player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + bow.level + " to string this bow."); diff --git a/Server/src/main/java/core/game/node/entity/skill/herblore/PotionDecantingPlugin.java b/Server/src/main/java/core/game/node/entity/skill/herblore/PotionDecantingPlugin.java index 26b1ee742..76d2b9e5e 100644 --- a/Server/src/main/java/core/game/node/entity/skill/herblore/PotionDecantingPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/herblore/PotionDecantingPlugin.java @@ -180,6 +180,11 @@ public final class PotionDecantingPlugin extends UseWithHandler { if (flagged(itemDose, otherDose)) { return false; } + + if (item.getId() == item.getNoteChange() || other.getId() == item.getNoteChange()) { + return false; + } + final int[] newDoses = getDoses(itemDose, otherDose); if (itemDose == 4 && otherDose == 0 || otherDose == 4 && itemDose == 0) { player.getInventory().replace(getItem(item.getName().contains("Vial") ? otherName : itemName, newDoses[1]), item.getSlot()); diff --git a/Server/src/main/java/core/game/node/entity/skill/herblore/UnfinishedPotion.java b/Server/src/main/java/core/game/node/entity/skill/herblore/UnfinishedPotion.java index 7336a05aa..3fddde555 100644 --- a/Server/src/main/java/core/game/node/entity/skill/herblore/UnfinishedPotion.java +++ b/Server/src/main/java/core/game/node/entity/skill/herblore/UnfinishedPotion.java @@ -7,7 +7,25 @@ import core.game.node.item.Item; * @author 'Vexia */ public enum UnfinishedPotion { - GUAM(Herbs.GUAM.getProduct(), 3, new Item(91)), MARRENTILL(Herbs.MARRENTILL.getProduct(), 5, new Item(93)), TARROMIN(Herbs.TARROMIN.getProduct(), 12, new Item(95)), HARRALANDER(Herbs.HARRALANDER.getProduct(), 22, new Item(97)), RANARR(Herbs.RANARR.getProduct(), 30, new Item(99)), TOADFLAX(Herbs.TOADFLAX.getProduct(), 34, new Item(3002)), SPIRIT_WEED(Herbs.SPIRIT_WEED.getProduct(), 40, new Item(12181)), IRIT(Herbs.IRIT.getProduct(), 45, new Item(101)), AVANTOE(Herbs.AVANTOE.getProduct(), 50, new Item(103)), KWUARM(Herbs.KWUARM.getProduct(), 55, new Item(105)), SNAPDRAGON(Herbs.SNAPDRAGON.getProduct(), 63, new Item(3004)), CADANTINE(Herbs.CADANTINE.getProduct(), 66, new Item(107)), LANTADYME(Herbs.LANTADYME.getProduct(), 69, new Item(2483)), DWARF_WEED(Herbs.DWARF_WEED.getProduct(), 72, new Item(109)), TORSTOL(Herbs.TORSTOL.getProduct(), 75, new Item(111)), STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(6016), 73, new Item(5936)), SUPER_STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(2398), 82, new Item(5939)), STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.TOADFLAX.getProduct(), 68, new Item(5942)), SUPER_STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.IRIT.getProduct(), 79, new Item(5951)); + GUAM(Herbs.GUAM.getProduct(), 3, new Item(91)), + MARRENTILL(Herbs.MARRENTILL.getProduct(), 5, new Item(93)), + TARROMIN(Herbs.TARROMIN.getProduct(), 12, new Item(95)), + HARRALANDER(Herbs.HARRALANDER.getProduct(), 22, new Item(97)), + RANARR(Herbs.RANARR.getProduct(), 30, new Item(99)), + TOADFLAX(Herbs.TOADFLAX.getProduct(), 34, new Item(3002)), + SPIRIT_WEED(Herbs.SPIRIT_WEED.getProduct(), 40, new Item(12181)), + IRIT(Herbs.IRIT.getProduct(), 45, new Item(101)), + AVANTOE(Herbs.AVANTOE.getProduct(), 50, new Item(103)), + KWUARM(Herbs.KWUARM.getProduct(), 55, new Item(105)), + SNAPDRAGON(Herbs.SNAPDRAGON.getProduct(), 63, new Item(3004)), + CADANTINE(Herbs.CADANTINE.getProduct(), 66, new Item(107)), + LANTADYME(Herbs.LANTADYME.getProduct(), 69, new Item(2483)), + DWARF_WEED(Herbs.DWARF_WEED.getProduct(), 72, new Item(109)), + TORSTOL(Herbs.TORSTOL.getProduct(), 75, new Item(111)), + STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(6016), 73, new Item(5936)), + SUPER_STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(2398), 82, new Item(5939)), + STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.TOADFLAX.getProduct(), 68, new Item(5942)), + SUPER_STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.IRIT.getProduct(), 79, new Item(5951)); /** * Represents the base item. diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.java b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.java index d896511f3..ad62afca9 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.java @@ -16,6 +16,7 @@ import core.game.world.map.Location; import core.game.world.map.zone.MapZone; import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; import core.game.world.update.flag.context.Animation; import core.plugin.Plugin; import core.tools.RandomFunction; @@ -31,7 +32,7 @@ public final class FremennikDungeon extends MapZone implements Plugin { * Constructs a new {@code FremennikDungeon} {@code Object}. */ public FremennikDungeon() { - super("fremennik", true); + super("fremennik", true, ZoneRestriction.CANNON); } @Override diff --git a/Server/src/main/java/core/game/world/map/zone/impl/WildernessZone.java b/Server/src/main/java/core/game/world/map/zone/impl/WildernessZone.java index 7ea125afb..38336d447 100644 --- a/Server/src/main/java/core/game/world/map/zone/impl/WildernessZone.java +++ b/Server/src/main/java/core/game/world/map/zone/impl/WildernessZone.java @@ -256,8 +256,8 @@ public final class WildernessZone extends MapZone { p.getAppearance().sync(); } else if (e instanceof NPC) { NPC n = (NPC) e; - if (n.getDefinition().hasAttackOption()) { - n.setAggressive(true); + if (n.getDefinition().hasAttackOption() && n.isAggressive()) { + //n.setAggressive(true); n.setAggressiveHandler(new AggressiveHandler(n, AggressiveBehavior.WILDERNESS)); } } diff --git a/Server/src/main/kotlin/api/ApiExtensions.kt b/Server/src/main/kotlin/api/ApiExtensions.kt new file mode 100644 index 000000000..e0c1537b8 --- /dev/null +++ b/Server/src/main/kotlin/api/ApiExtensions.kt @@ -0,0 +1,24 @@ +package api + +import core.game.node.item.Item + +fun IntRange.toIntArray(): IntArray { + if (last < first) + return IntArray(0) + + val result = IntArray(last - first + 1) + var index = 0 + for (element in this) + result[index++] = element + return result +} + +fun Int.asItem() : Item { + return Item(this) +} + +fun Collection.toIntArray() : IntArray { + val list = ArrayList() + this.forEach { arr -> arr.forEach { list.add(it) } } + return list.toIntArray() +} \ No newline at end of file diff --git a/Server/src/main/kotlin/api/ContentAPI.kt b/Server/src/main/kotlin/api/ContentAPI.kt index 308947091..08a970a6c 100644 --- a/Server/src/main/kotlin/api/ContentAPI.kt +++ b/Server/src/main/kotlin/api/ContentAPI.kt @@ -3,6 +3,8 @@ package api import core.cache.def.impl.ItemDefinition import core.cache.def.impl.SceneryDefinition import core.game.component.Component +import core.game.container.impl.EquipmentContainer +import core.game.container.impl.InventoryListener import core.game.content.dialogue.FacialExpression import core.game.content.global.action.SpecialLadders import core.game.node.Node @@ -19,6 +21,7 @@ import core.game.node.entity.player.link.TeleportManager import core.game.node.entity.player.link.audio.Audio import core.game.node.entity.player.link.emote.Emotes import core.game.node.entity.player.link.quest.QuestRepository +import core.game.node.entity.skill.Skills import core.game.node.entity.skill.gather.SkillingTool import core.game.node.item.GroundItem import core.game.node.item.GroundItemManager @@ -35,6 +38,7 @@ import core.game.world.map.zone.ZoneBuilder import core.game.world.update.flag.chunk.AnimateObjectUpdateFlag import core.game.world.update.flag.context.Animation import core.game.world.update.flag.context.Graphics +import core.plugin.Plugin import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.SkillDialogueHandler import rs09.game.content.global.GlobalKillCounter; @@ -146,6 +150,18 @@ fun removeItem(player: Player, item: T, container: Container = Container.INV } } +/** + * Add an item to a player's inventory + * @param player the player whose inventory to add an item to + * @param id the ID of the item to add + * @param amount the amount of the item to add, defaults to 1 + * @return true if the item exists in the given amount in the player's inventory + */ + +fun addItem(player: Player, id: Int, amount: Int = 1): Boolean{ + return addItem(player, id, amount, Container.INVENTORY) +} + /** * Add an item to the given player's given container * @param player the player whose container to modify @@ -1345,3 +1361,56 @@ fun announceIfRare(player: Player, item: Item) { GlobalKillCounter.incrementRareDrop(player, item); } } + +/** + * Returns a Mutable List of player skills that are at 99, returns false if player has no 99s + * @param player the player + */ + +fun getMasteredSkills(player: Player): MutableList { + val SKILL_LIST = Skills.SKILL_NAME + val hasMastered = player.getSkills().masteredSkills > 0 + val MASTERED_SKILLS = mutableListOf() + + if(hasMastered){ + SKILL_LIST.forEach { + when(player.getSkills().getLevel(Skills.getSkillByName(it))){ + 99 -> MASTERED_SKILLS.add(it) + } + } + } + return MASTERED_SKILLS +} + +/** + * Dumps a container. + * @param player the player + * @param inventory the player's inventory. + * @param boolean true to send message stating why it can't bank, false for no message + * @author ceik + * @author James Triantafylos + */ +fun dumpContainer(player: Player, inventory: core.game.container.Container) { + val bank = player.bank + for (item: Item in inventory.toArray().filterNotNull()) { + if (!bank.hasSpaceFor(item)) { + player.packetDispatch.sendMessage("You have no more space in your bank.") + return + } + if (!bank.canAdd(item)) { + player.packetDispatch.sendMessage("A magical force prevents you from banking your " + item.name + ".") + return + } else { + if (inventory is EquipmentContainer) { + val plugin = item.definition.handlers["equipment"] + if (plugin != null && plugin is Plugin<*>) { + plugin.fireEvent("unequip", player, item) + } + } + inventory.remove(item) + bank.add(if (item.definition.isUnnoted) item else Item(item.noteChange, item.amount)) + } + } + inventory.update() + bank.update() +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/ServerConstants.kt b/Server/src/main/kotlin/rs09/ServerConstants.kt index e474850f2..82f13e538 100644 --- a/Server/src/main/kotlin/rs09/ServerConstants.kt +++ b/Server/src/main/kotlin/rs09/ServerConstants.kt @@ -3,9 +3,7 @@ package rs09 import core.game.system.SystemShutdownHook import core.game.world.map.Location import core.tools.mysql.Database -import org.json.simple.JSONObject import rs09.tools.secondsToTicks -import java.io.File import java.math.BigInteger /** @@ -62,6 +60,9 @@ class ServerConstants { @JvmField var BOT_DATA_PATH: String? = null + @JvmField + var CELEDT_DATA_PATH: String? = null + //the max number of players. @JvmField var MAX_PLAYERS = 2000 @@ -114,50 +115,59 @@ class ServerConstants { //location names for the ::to command. val TELEPORT_DESTINATIONS = arrayOf( - arrayOf(Location.create(2974, 4383, 2), "corp", "corporal", "corporeal"), - arrayOf(Location.create(2659, 2649, 0), "pc", "pest control", "pest"), - arrayOf(Location.create(3293, 3184, 0), "al kharid", "alkharid", "kharid"), - arrayOf(Location.create(3222, 3217, 0), "lumbridge", "lumby"), - arrayOf(Location.create(3110, 3168, 0), "wizard tower", "wizards tower", "tower", "wizards"), - arrayOf(Location.create(3083, 3249, 0), "draynor", "draynor village"), - arrayOf(Location.create(3019, 3244, 0), "port sarim", "sarim"), - arrayOf(Location.create(2956, 3209, 0), "rimmington"), - arrayOf(Location.create(2965, 3380, 0), "fally", "falador"), - arrayOf(Location.create(2895, 3436, 0), "taverley"), - arrayOf(Location.create(3080, 3423, 0), "barbarian village", "barb"), - arrayOf(Location.create(3213, 3428, 0), "varrock"), - arrayOf(Location.create(3164, 3485, 0), "grand exchange", "ge"), - arrayOf(Location.create(2917, 3175, 0), "karamja"), - arrayOf(Location.create(2450, 5165, 0), "tzhaar"), - arrayOf(Location.create(2795, 3177, 0), "brimhaven"), - arrayOf(Location.create(2849, 2961, 0), "shilo village", "shilo"), - arrayOf(Location.create(2605, 3093, 0), "yanille"), - arrayOf(Location.create(2663, 3305, 0), "ardougne", "ardy"), - arrayOf(Location.create(2450, 3422, 0), "gnome stronghold", "gnome"), - arrayOf(Location.create(2730, 3485, 0), "camelot", "cammy", "seers"), - arrayOf(Location.create(2805, 3435, 0), "catherby"), - arrayOf(Location.create(2659, 3657, 0), "rellekka"), - arrayOf(Location.create(2890, 3676, 0), "trollheim"), - arrayOf(Location.create(2914, 3746, 0), "godwars", "gwd", "god wars"), - arrayOf(Location.create(3180, 3684, 0), "bounty hunter", "bh"), - arrayOf(Location.create(3272, 3687, 0), "clan wars", "clw"), - arrayOf(Location.create(3090, 3957, 0), "mage arena", "mage", "magearena", "arena"), - arrayOf(Location.create(3069, 10257, 0), "king black dragon", "kbd"), - arrayOf(Location.create(3359, 3416, 0), "digsite"), - arrayOf(Location.create(3488, 3489, 0), "canifis"), - arrayOf(Location.create(3428, 3526, 0), "slayer tower", "slayer"), - arrayOf(Location.create(3502, 9483, 2), "kalphite queen", "kq", "kalphite hive", "kalphite"), - arrayOf(Location.create(3233, 2913, 0), "pyramid"), - arrayOf(Location.create(3419, 2917, 0), "nardah"), - arrayOf(Location.create(3482, 3090, 0), "uzer"), - arrayOf(Location.create(3358, 2970, 0), "pollnivneach", "poln"), - arrayOf(Location.create(3305, 2788, 0), "sophanem"), - arrayOf(Location.create(2898, 3544, 0), "burthorpe", "burthorp"), - arrayOf(Location.create(3088, 3491, 0), "edge", "edgeville"), - arrayOf(Location.create(3169, 3034, 0), "bedabin"), - arrayOf(Location.create(3565, 3289, 0), "barrows"), - arrayOf(Location.create(3016, 3513, 0), "bkf", "black knights fortress"), - arrayOf(Location.create(3052, 3481, 0), "monastery") + arrayOf(Location.create(2974, 4383, 2), "corp", "corporal", "corporeal"), + arrayOf(Location.create(2659, 2649, 0), "pc", "pest control", "pest"), + arrayOf(Location.create(3293, 3184, 0), "al kharid", "alkharid", "kharid"), + arrayOf(Location.create(3222, 3217, 0), "lumbridge", "lumby"), + arrayOf(Location.create(3110, 3168, 0), "wizard tower", "wizards tower", "tower", "wizards"), + arrayOf(Location.create(3083, 3249, 0), "draynor", "draynor village"), + arrayOf(Location.create(3019, 3244, 0), "port sarim", "sarim"), + arrayOf(Location.create(2956, 3209, 0), "rimmington"), + arrayOf(Location.create(2965, 3380, 0), "fally", "falador"), + arrayOf(Location.create(2895, 3436, 0), "taverley"), + arrayOf(Location.create(3080, 3423, 0), "barbarian village", "barb"), + arrayOf(Location.create(3213, 3428, 0), "varrock"), + arrayOf(Location.create(3164, 3485, 0), "grand exchange", "ge"), + arrayOf(Location.create(2917, 3175, 0), "karamja"), + arrayOf(Location.create(2450, 5165, 0), "tzhaar"), + arrayOf(Location.create(2795, 3177, 0), "brimhaven"), + arrayOf(Location.create(2849, 2961, 0), "shilo village", "shilo"), + arrayOf(Location.create(2605, 3093, 0), "yanille"), + arrayOf(Location.create(2663, 3305, 0), "ardougne", "ardy"), + arrayOf(Location.create(2450, 3422, 0), "gnome stronghold", "gnome"), + arrayOf(Location.create(2730, 3485, 0), "camelot", "cammy", "seers"), + arrayOf(Location.create(2805, 3435, 0), "catherby"), + arrayOf(Location.create(2659, 3657, 0), "rellekka"), + arrayOf(Location.create(2890, 3676, 0), "trollheim"), + arrayOf(Location.create(2914, 3746, 0), "godwars", "gwd", "god wars"), + arrayOf(Location.create(3180, 3684, 0), "bounty hunter", "bh"), + arrayOf(Location.create(3272, 3687, 0), "clan wars", "clw"), + arrayOf(Location.create(3090, 3957, 0), "mage arena", "mage", "magearena", "arena"), + arrayOf(Location.create(3069, 10257, 0), "king black dragon", "kbd"), + arrayOf(Location.create(3359, 3416, 0), "digsite"), + arrayOf(Location.create(3488, 3489, 0), "canifis"), + arrayOf(Location.create(3428, 3526, 0), "slayer tower", "slayer"), + arrayOf(Location.create(3502, 9483, 2), "kalphite queen", "kq", "kalphite hive", "kalphite"), + arrayOf(Location.create(3233, 2913, 0), "pyramid"), + arrayOf(Location.create(3419, 2917, 0), "nardah"), + arrayOf(Location.create(3482, 3090, 0), "uzer"), + arrayOf(Location.create(3358, 2970, 0), "pollnivneach", "poln"), + arrayOf(Location.create(3305, 2788, 0), "sophanem"), + arrayOf(Location.create(2898, 3544, 0), "burthorpe", "burthorp"), + arrayOf(Location.create(3088, 3491, 0), "edge", "edgeville"), + arrayOf(Location.create(3169, 3034, 0), "bedabin"), + arrayOf(Location.create(3565, 3289, 0), "barrows"), + arrayOf(Location.create(3016, 3513, 0), "bkf", "black knights fortress"), + arrayOf(Location.create(3052, 3481, 0), "monastery"), + arrayOf(Location.create(1945, 4959, 0), "blast furnace", "blast"), + arrayOf(Location.create(2408, 4449, 0), "zanaris"), + arrayOf(Location.create(3656, 3517, 0), "ectofuntus", "ecto"), + arrayOf(Location.create(2408, 4449, 0), "tower of life lower"), + arrayOf(Location.create(2894, 4756, 0), "test area"), + arrayOf(Location.create(2722, 4886, 0), "quest the golem 1"), + arrayOf(Location.create(2704, 5349, 0), "dorgeshuun", "dorg"), + arrayOf(Location.create(2711, 10132, 0), "brine rats"), + arrayOf(Location.create(2328, 3677, 0), "piscatoris") ) @JvmField diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/Adventurer.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/Adventurer.kt index 5930596a4..ad4bd2458 100644 --- a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/Adventurer.kt +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/Adventurer.kt @@ -428,6 +428,9 @@ class Adventurer(val style: CombatStyle): Script() { var lineAlt = "" when { + //Celebrates Halloween! + dateCode == 1031 -> lineAlt = dialogue.getLines("halloween").rand() + //Celebrates lead up to Christmas! until in 2..23 -> lineAlt = dialogue.getLines("approaching_christmas").rand() diff --git a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt index c4c79717e..20f6eb126 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt @@ -5,6 +5,7 @@ import core.game.world.map.zone.ZoneRestriction import core.tools.RandomFunction import rs09.game.system.SystemLogger import rs09.game.world.GameWorld +import kotlin.random.Random private const val AVG_DELAY_TICKS = 6000 // 60 minutes private const val MIN_DELAY_TICKS = AVG_DELAY_TICKS / 2 @@ -12,6 +13,7 @@ private const val MAX_DELAY_TICKS = MIN_DELAY_TICKS + AVG_DELAY_TICKS // window class RandomEventManager(val player: Player) { var event: RandomEventNPC? = null var nextSpawn = 0 + val skills = arrayOf("WoodcuttingSkillPulse","FishingPulse","MiningSkillPulse","BoneBuryingOptionPlugin") fun tick() { if (player.isArtificial) return @@ -23,7 +25,26 @@ class RandomEventManager(val player: Player) { nextSpawn = GameWorld.ticks + 3000 return } - val ame = RandomEvents.values().random() + val currentAction = player.pulseManager.current.toString() + var ame = RandomEvents.values().random() + if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){ + ame = RandomEvents.TREE_SPIRIT + } + else if(currentAction.contains("FishingPulse") && Random.nextBoolean()){ + ame = RandomEvents.RIVER_TROLL + } + else if(currentAction.contains("MiningSkillPulse") && Random.nextBoolean()){ + ame = RandomEvents.ROCK_GOLEM + } + else if(currentAction.contains("BoneBuryingOptionPlugin") && Random.nextBoolean()){ + ame = RandomEvents.SHADE + } + else { + ame = RandomEvents.values().random() + while(ame.type == "skill"){ + ame = RandomEvents.values().random() + } + } event = ame.npc.create(player,ame.loot,ame.type) if (event!!.spawnLocation == null) { nextSpawn = GameWorld.ticks + 3000 diff --git a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt index 9719b05ba..5672409c6 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt @@ -1,18 +1,16 @@ package rs09.game.content.ame -import api.* +import api.poofClear import core.game.interaction.MovementPulse import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player import core.game.node.item.Item -import core.game.system.task.Pulse import core.game.world.map.Location import core.game.world.map.RegionManager import core.game.world.map.path.Pathfinder import core.game.world.update.flag.context.Graphics import rs09.game.content.ame.events.MysteriousOldManNPC import rs09.game.content.global.WeightBasedTable -import rs09.game.world.GameWorld.Pulser import rs09.tools.secondsToTicks import kotlin.random.Random import kotlin.reflect.full.createInstance @@ -23,66 +21,78 @@ abstract class RandomEventNPC(id: Int) : NPC(id) { var spawnLocation: Location? = null val SMOKE_GRAPHICS = Graphics(86) var initialized = false - var ticksLeft = secondsToTicks(600) + var finalized = false + var timerPaused = false + var ticksLeft = secondsToTicks(180) - open fun create(player: Player, loot: WeightBasedTable? = null, type: String = ""): RandomEventNPC{ + open fun create(player: Player, loot: WeightBasedTable? = null, type: String = ""): RandomEventNPC { val event = this::class.createInstance() - if(event is MysteriousOldManNPC) event.type = type + if (event is MysteriousOldManNPC) event.type = type event.loot = loot event.player = player - event.spawnLocation = RegionManager.getSpawnLocation(player,this) + event.spawnLocation = RegionManager.getSpawnLocation(player, this) return event } - open fun terminate(){ + open fun terminate() { + finalized = true + pulseManager.clear("amemovement") player.antiMacroHandler.event = null - if(initialized){ + if (initialized) { poofClear(this) } } - open fun follow(){ - pulseManager.run(object : MovementPulse(this,player, Pathfinder.DUMB){ + open fun follow() { + pulseManager.run((object : MovementPulse(this, player, Pathfinder.DUMB) { override fun pulse(): Boolean { face(player) return false } - }) + }), "amemovement") } override fun tick() { super.tick() - ticksLeft-- - if(!pulseManager.hasPulseRunning()) follow() - if(!player.isActive || !player.location.withinDistance(location,10)){ + if (!player.getAttribute("random:pause", false)) { + ticksLeft-- + } + + if (!pulseManager.hasPulseRunning() && !finalized) { + follow() + } + if (!player.isActive || !player.location.withinDistance(location, 10)) { terminate() } - if(ticksLeft <= 0){ + if (ticksLeft <= 0 && initialized) { onTimeUp() + initialized = false } } override fun init() { initialized = true + finalized = false + timerPaused = false spawnLocation ?: terminate() location = spawnLocation super.init() } - open fun onTimeUp(){ + open fun onTimeUp() { noteAndTeleport() terminate() } - fun noteAndTeleport(){ - for(item in player.inventory.toArray()){ - if(item == null) continue - if(item.noteChange != item.id){ + fun noteAndTeleport() { + for (item in player.inventory.toArray()) { + if (item == null) continue + if (item.noteChange != item.id) { player.inventory.remove(item) - player.inventory.add(Item(item.noteChange,item.amount)) + player.inventory.add(Item(item.noteChange, item.amount)) } } - if(Random.nextBoolean()){ + if (Random.nextBoolean()) { player.properties.teleportLocation = Location.create(3197, 3223, 0) } else { player.properties.teleportLocation = Location.create(3212, 9620, 0) diff --git a/Server/src/main/kotlin/rs09/game/content/ame/RandomEvents.kt b/Server/src/main/kotlin/rs09/game/content/ame/RandomEvents.kt index 4fc187e56..5bd7ba726 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/RandomEvents.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/RandomEvents.kt @@ -5,8 +5,14 @@ import rs09.game.content.ame.events.MysteriousOldManNPC import rs09.game.content.ame.events.certer.CerterNPC import rs09.game.content.ame.events.drilldemon.SeargentDamienNPC import rs09.game.content.ame.events.evilchicken.EvilChickenNPC -import rs09.game.content.ame.events.sandwichlady.SandwichLadyRENPC import rs09.game.content.ame.events.genie.GenieNPC +import rs09.game.content.ame.events.rivertroll.RiverTrollRENPC +import rs09.game.content.ame.events.rockgolem.RockGolemRENPC +import rs09.game.content.ame.events.sandwichlady.SandwichLadyRENPC +import rs09.game.content.ame.events.shade.ShadeRENPC +import rs09.game.content.ame.events.treespirit.TreeSpiritRENPC +import rs09.game.content.ame.events.zombie.ZombieRENPC + import rs09.game.content.global.WeightBasedTable import rs09.game.content.global.WeightedItem @@ -14,25 +20,30 @@ enum class RandomEvents(val npc: RandomEventNPC, val loot: WeightBasedTable? = n SANDWICH_LADY(SandwichLadyRENPC()), GENIE(GenieNPC()), CERTER(CerterNPC(),WeightBasedTable.create( - WeightedItem(Items.COINS_995,1,100,2.0), - WeightedItem(Items.SPINACH_ROLL_1969,1,1,2.0), - WeightedItem(Items.KEBAB_1971,1,1,2.0), - WeightedItem(Items.UNCUT_SAPPHIRE_1623,1,1,0.5), - WeightedItem(Items.SAPPHIRE_1607,1,1,0.5), - WeightedItem(Items.UNCUT_EMERALD_1621,1,1,0.25), - WeightedItem(Items.EMERALD_1605,1,1,0.25), - WeightedItem(Items.UNCUT_RUBY_1619,1,1,0.15), - WeightedItem(Items.RUBY_1603,1,1,0.15), - WeightedItem(Items.DIAMOND_1601,1,1,0.1), - WeightedItem(Items.UNCUT_DIAMOND_1617,1,1,0.1), - WeightedItem(Items.COSMIC_TALISMAN_1454,1,1,0.15), - WeightedItem(Items.NATURE_TALISMAN_1462,1,1,0.15), - WeightedItem(Items.TOOTH_HALF_OF_A_KEY_985,1,1,1.0), - WeightedItem(Items.LOOP_HALF_OF_A_KEY_987,1,1,1.0) + WeightedItem(Items.UNCUT_SAPPHIRE_1623,1,1,3.4), + WeightedItem(Items.KEBAB_1971,1,1,1.7), + WeightedItem(Items.UNCUT_EMERALD_1621,1,1,1.7), + WeightedItem(Items.SPINACH_ROLL_1969,1,1,1.5), + WeightedItem(Items.COINS_995,80,80,1.1), + WeightedItem(Items.COINS_995,160,160,1.1), + WeightedItem(Items.COINS_995,320,320,1.1), + WeightedItem(Items.COINS_995,480,480,1.1), + WeightedItem(Items.COINS_995,640,640,1.1), + WeightedItem(Items.UNCUT_RUBY_1619,1,1,0.86), + WeightedItem(Items.COINS_995,240,240,0.65), + WeightedItem(Items.COSMIC_TALISMAN_1454,1,1,0.43), + WeightedItem(Items.UNCUT_DIAMOND_1617,1,1,0.22), + WeightedItem(Items.TOOTH_HALF_OF_A_KEY_985,1,1,0.1), + WeightedItem(Items.LOOP_HALF_OF_A_KEY_987,1,1,0.1) )), DRILL_DEMON(SeargentDamienNPC()), EVIL_CHICKEN(EvilChickenNPC()), - SURPRISE_EXAM(MysteriousOldManNPC(),"sexam"); + SURPRISE_EXAM(MysteriousOldManNPC(),"sexam"), + TREE_SPIRIT(TreeSpiritRENPC(),"skill"), + RIVER_TROLL(RiverTrollRENPC(),"skill"), + ROCK_GOLEM(RockGolemRENPC(),"skill"), + SHADE(ShadeRENPC(),"skill"), + ZOMBIE(ZombieRENPC(),"skill"); var type: String = "" private set @@ -45,4 +56,5 @@ enum class RandomEvents(val npc: RandomEventNPC, val loot: WeightBasedTable? = n @JvmField val randomIDs = values().map { it.npc.id }.toList() } + } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt index cc6dc2251..90f5091ec 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt @@ -1,33 +1,58 @@ package rs09.game.content.ame.events.certer -import api.* +import api.addItemOrDrop import core.game.component.Component -import core.game.node.item.GroundItemManager +import core.game.node.entity.player.link.emote.Emotes import rs09.game.content.dialogue.DialogueFile import rs09.tools.END_DIALOGUE class CerterDialogue(val initial: Boolean) : DialogueFile() { val CERTER_INTERFACE = 184 override fun handle(componentID: Int, buttonID: Int) { - if(initial){ - when(stage){ - 0 -> npc("Ah, hello, ${player!!.username.capitalize()}. Could you","please help me identify this?").also { stage++ } + if (initial && !player!!.getAttribute("certer:reward", false)) { + when (stage) { + 0 -> npc("Ah, hello, ${player!!.username.capitalize()}. Could you", "please help me identify this?").also { stage++ } 1 -> { end() player!!.interfaceManager.open(Component(CERTER_INTERFACE)) } } } else { - val isCorrect = player!!.getAttribute("certer:correct",false) - when(stage){ - 0 -> if(!isCorrect) npc("Sorry, I don't think so.").also { stage = END_DIALOGUE; player!!.antiMacroHandler.event?.terminate() } else npc("Oh yes! That's right.").also { stage++ } - 1 -> { - npc("Please, take this as a thanks.") - player!!.antiMacroHandler.event?.loot!!.roll().forEach { addItemOrDrop(player!!, it.id, it.amount) } - player!!.antiMacroHandler.event?.terminate() - stage = END_DIALOGUE + player!!.setAttribute("random:pause", true) + val isCorrect = player!!.getAttribute("certer:correct", false) + val receivedReward = player!!.getAttribute("certer:reward", false) + if (receivedReward == true) { + stage = 1 + } + when (stage) { + 0 -> if (!isCorrect) { + npc("Sorry, I don't think so.").also { + player!!.setAttribute("certer:reward", true) + stage = END_DIALOGUE + player!!.antiMacroHandler.event?.terminate() + } + } else { + npc("Thank you, I hope you like your present. I must be", "leaving now though.").also { + player!!.setAttribute("certer:reward", true) + stage = END_DIALOGUE + player!!.antiMacroHandler.event?.loot!!.roll().forEach { addItemOrDrop(player!!, it.id, it.amount) } + } } } } } + + override fun end() { + super.end() + if (player!!.getAttribute("certer:reward", false)) { + // Remove movement pulse to stop following player + npc!!.pulseManager.clear("amemovement") + // Wave goodbye + npc!!.animate(Emotes.WAVE.animation) + // Terminate the event + player!!.antiMacroHandler.event?.terminate() + } else { + player!!.setAttribute("random:pause", false) + } + } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterEventInterface.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterEventInterface.kt index 3dbadca5b..40f20da83 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterEventInterface.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterEventInterface.kt @@ -1,6 +1,7 @@ package rs09.game.content.ame.events.certer import core.game.node.entity.player.Player +import core.game.node.item.Item import org.rs09.consts.Items import rs09.game.interaction.InterfaceListener @@ -11,51 +12,69 @@ class CerterEventInterface : InterfaceListener() { val OPTION_C_CHILD = 3 val ITEM_CHILD = 7 val items = mapOf( - Items.BLACK_SWORD_1283 to "a sword", - Items.BRONZE_SWORD_1277 to "a sword", - Items.BRONZE_CHAINBODY_1103 to "a platebody", - Items.BLACK_CHAINBODY_1107 to "a platebody", - Items.WOODEN_SHIELD_1171 to "a shield", - Items.BRONZE_KITESHIELD_1189 to "a shield", + /* + * NOTE: We use these "NULL" items to get their model id + zoom values. + * These were the actual items used by this random event before they + * decided to swap over to using model ids instead. + */ + Items.BOWL_1923 to "A bowl.", + Items.NULL_6189 to "A fish.", + Items.NULL_6190 to "A bass.", + Items.NULL_6191 to "A sword.", + Items.NULL_6192 to "A battleaxe.", + Items.NULL_6193 to "A helmet.", + Items.NULL_6194 to "A kiteshield.", + Items.NULL_6195 to "A pair of shears.", + Items.NULL_6196 to "A shovel.", + Items.NULL_6197 to "A ring.", + Items.NULL_6198 to "A necklace." ) - val falseOptions = arrayOf("a ring","a dragon","a cat","a helmet","a pair of boots","a fish","a gun","a staff","a cannon","a dwarf","a bow","an arrow","a chinchompa","a chicken","a feather","a ninja","a bot") + val falseOptions = arrayOf("An axe.", "An arrow.", "A pair of boots.", "A pair of gloves.", "A staff.", "A bow.", "A feather.", "The disenfrachaised youth of 1940's Columbia.") override fun defineListeners() { - on(CERTER_INTERFACE){player, _, _, buttonID, _, _ -> + on(CERTER_INTERFACE) { player, _, _, buttonID, _, _ -> val answer = buttonID - 7 - val correctAnswer = player.getAttribute("certer:correctIndex",0) - player.setAttribute("certer:correct",correctAnswer == answer) + val correctAnswer = player.getAttribute("certer:correctIndex", 0) + player.setAttribute("certer:correct", correctAnswer == answer) player.interfaceManager.close() - player.dialogueInterpreter.open(CerterDialogue(false),player.antiMacroHandler.event?.asNpc()) + player.dialogueInterpreter.open(CerterDialogue(false), player.antiMacroHandler.event?.asNpc()) return@on true } - onOpen(CERTER_INTERFACE){player, _ -> + onOpen(CERTER_INTERFACE) { player, _ -> generateOptions(player) return@onOpen true } + + onClose(CERTER_INTERFACE) { player, _ -> + player.setAttribute("random:pause", false) + return@onClose true + } } fun generateOptions(player: Player) { val correct = items.keys.random() - val indexes = arrayListOf(1,2,3) + val indexes = arrayListOf(1, 2, 3) val correctIndex = indexes.random() + val correctItem = Item(correct).definition + val iFaceModelId = correctItem.interfaceModelId + val iFaceZoom = correctItem.modelZoom indexes.remove(correctIndex) - player.setAttribute("certer:correctIndex",correctIndex) + player.setAttribute("certer:correctIndex", correctIndex) - player.packetDispatch.sendString(items[correct],CERTER_INTERFACE,optionFromIndex(correctIndex)) + player.packetDispatch.sendString(items[correct], CERTER_INTERFACE, optionFromIndex(correctIndex)) val tempOptions = falseOptions.toMutableList() val false1 = tempOptions.random() tempOptions.remove(false1) - var false2 = tempOptions.random() + val false2 = tempOptions.random() - player.packetDispatch.sendString(false1,CERTER_INTERFACE,optionFromIndex(indexes[0])) - player.packetDispatch.sendString(false2,CERTER_INTERFACE,optionFromIndex(indexes[1])) - player.packetDispatch.sendItemOnInterface(correct,1,CERTER_INTERFACE,ITEM_CHILD) + player.packetDispatch.sendString(false1, CERTER_INTERFACE, optionFromIndex(indexes[0])) + player.packetDispatch.sendString(false2, CERTER_INTERFACE, optionFromIndex(indexes[1])) + player.packetDispatch.sendModelOnInterface(iFaceModelId, CERTER_INTERFACE, ITEM_CHILD, iFaceZoom) } - fun optionFromIndex(index: Int): Int{ - return when(index){ + fun optionFromIndex(index: Int): Int { + return when (index) { 1 -> OPTION_A_CHILD 2 -> OPTION_B_CHILD 3 -> OPTION_C_CHILD diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterNPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterNPC.kt index 7af3f4d87..7f4fe4fdc 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterNPC.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterNPC.kt @@ -1,23 +1,49 @@ package rs09.game.content.ame.events.certer import core.game.node.entity.npc.NPC +import core.game.node.entity.player.link.emote.Emotes import core.tools.RandomFunction import org.rs09.consts.NPCs import rs09.game.content.ame.RandomEventNPC import rs09.game.content.global.WeightBasedTable class CerterNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.GILES_2538) { + lateinit var pName: String + lateinit var phrases: Array + override fun tick() { + // Don't speak if we have the interface opened + if (!timerPaused) { + // Over allotted time phrase + if (ticksLeft <= 2) { + player.lock(2) + sendChat(phrases[4]) + + // Say a phrase every 20 ticks starting at 280 ticks + // as to not interfere with the init chat phrase + } else if (ticksLeft <= 280 && ticksLeft % 20 == 0) { + sendChat(phrases[RandomFunction.random(1, 3)]) + } + } super.tick() - if(RandomFunction.random(1,10) == 5) sendChat(player.username.capitalize() + "! I need your assistance.") } override fun talkTo(npc: NPC) { + player.setAttribute("random:pause", true) player.dialogueInterpreter.open(CerterDialogue(true),npc) } override fun init() { super.init() - sendChat(player.username.capitalize() + "! I need your assistance.") + pName = player.username.capitalize() + phrases = arrayOf("Greetings $pName, I need your help.", + "ehem... Hello $pName, please talk to me!", + "Hello, are you there $pName?", + "It's really rude to ignore someone, $pName!", + "No-one ignores me!") + player.setAttribute("random:pause", false) + player.setAttribute("certer:reward", false) + sendChat(phrases[0]) + api.animate(this, Emotes.BOW.animation, true) } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/evilchicken/EvilChickenNPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/evilchicken/EvilChickenNPC.kt index d18cdc3ae..50437de07 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/evilchicken/EvilChickenNPC.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/evilchicken/EvilChickenNPC.kt @@ -1,5 +1,6 @@ package rs09.game.content.ame.events.evilchicken +import api.getWorldTicks import core.game.node.entity.Entity import core.game.node.entity.npc.NPC import core.game.node.item.GroundItemManager @@ -12,15 +13,16 @@ import rs09.game.content.global.WeightBasedTable val ids = 2463..2468 class EvilChickenNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(2463) { + val phrases = arrayOf("Bwuk","Bwuk bwuk bwuk","Flee from me, @name!","Begone, @name!","Bwaaaauuuk bwuk bwuk","MUAHAHAHAHAAA!") override fun talkTo(npc: NPC) {} override fun init() { super.init() val index = (player.properties.combatLevel / 20) - 1 val id = ids.toList()[index] - this.transform(id) this.attack(player) + sendChat(phrases.random().replace("@name",player.name.capitalize())) this.isRespawn = false } @@ -30,6 +32,12 @@ class EvilChickenNPC(override var loot: WeightBasedTable? = null) : RandomEventN } override fun tick() { + if(!player.location.withinDistance(this.location,8)){ + this.terminate() + } + if(getWorldTicks() % 10 == 0){ + sendChat(phrases.random().replace("@name",player.name.capitalize())) + } super.tick() if(!player.viewport.currentPlane.npcs.contains(this)) this.clear() } diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/rivertroll/RiverTrollRENPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/rivertroll/RiverTrollRENPC.kt new file mode 100644 index 000000000..0f5423b3a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/rivertroll/RiverTrollRENPC.kt @@ -0,0 +1,40 @@ +package rs09.game.content.ame.events.rivertroll + +import api.addItemOrDrop +import api.getWorldTicks +import api.produceGroundItem +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import rs09.game.content.ame.RandomEventNPC +import rs09.game.content.global.WeightBasedTable +import rs09.game.content.global.WeightedItem + + +val ids = 391..396 + +class RiverTrollRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(391){ + override fun talkTo(npc: NPC) {} + override fun init() { + super.init() + val index = (player.properties.combatLevel / 20) - 1 + val id = ids.toList()[index] + this.transform(id) + this.attack(player) + sendChat("Fishies be mine, leave dem fishies!") + this.isRespawn = false + } + override fun finalizeDeath(killer: Entity?) { + super.finalizeDeath(killer) + } + override fun tick() { + if(!player.location.withinDistance(this.location,8)){ + this.terminate() + } + super.tick() + if(!player.viewport.currentPlane.npcs.contains(this)) this.clear() + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/rockgolem/RockGolemRENPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/rockgolem/RockGolemRENPC.kt new file mode 100644 index 000000000..bb0bf78fa --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/rockgolem/RockGolemRENPC.kt @@ -0,0 +1,40 @@ +package rs09.game.content.ame.events.rockgolem + +import api.addItemOrDrop +import api.getWorldTicks +import api.produceGroundItem +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import rs09.game.content.ame.RandomEventNPC +import rs09.game.content.global.WeightBasedTable +import rs09.game.content.global.WeightedItem + + +val ids = 413..418 + +class RockGolemRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(413){ + override fun talkTo(npc: NPC) {} + override fun init() { + super.init() + val index = (player.properties.combatLevel / 20) - 1 + val id = ids.toList()[index] + this.transform(id) + this.attack(player) + sendChat("Raarrrgghh! Flee human!") + this.isRespawn = false + } + override fun finalizeDeath(killer: Entity?) { + super.finalizeDeath(killer) + } + override fun tick() { + if(!player.location.withinDistance(this.location,8)){ + this.terminate() + } + super.tick() + if(!player.viewport.currentPlane.npcs.contains(this)) this.clear() + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/shade/ShadeRENPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/shade/ShadeRENPC.kt new file mode 100644 index 000000000..12de174fe --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/shade/ShadeRENPC.kt @@ -0,0 +1,40 @@ +package rs09.game.content.ame.events.shade + +import api.addItemOrDrop +import api.getWorldTicks +import api.produceGroundItem +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import rs09.game.content.ame.RandomEventNPC +import rs09.game.content.global.WeightBasedTable +import rs09.game.content.global.WeightedItem + + +val ids = 425..430 + +class ShadeRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(425){ + override fun talkTo(npc: NPC) {} + override fun init() { + super.init() + val index = (player.properties.combatLevel / 20) - 1 + val id = ids.toList()[index] + this.transform(id) + this.attack(player) + sendChat("Leave this place!") + this.isRespawn = false + } + override fun finalizeDeath(killer: Entity?) { + super.finalizeDeath(killer) + } + override fun tick() { + if(!player.location.withinDistance(this.location,8)){ + this.terminate() + } + super.tick() + if(!player.viewport.currentPlane.npcs.contains(this)) this.clear() + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/treespirit/TreeSpiritRENPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/treespirit/TreeSpiritRENPC.kt new file mode 100644 index 000000000..f36d480ec --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/treespirit/TreeSpiritRENPC.kt @@ -0,0 +1,40 @@ +package rs09.game.content.ame.events.treespirit + +import api.addItemOrDrop +import api.getWorldTicks +import api.produceGroundItem +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import rs09.game.content.ame.RandomEventNPC +import rs09.game.content.global.WeightBasedTable +import rs09.game.content.global.WeightedItem + + +val ids = 438..443 + +class TreeSpiritRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(438){ + override fun talkTo(npc: NPC) {} + override fun init() { + super.init() + val index = (player.properties.combatLevel / 20) - 1 + val id = ids.toList()[index] + this.transform(id) + this.attack(player) + sendChat("Leave these woods and never return!") + this.isRespawn = false + } + override fun finalizeDeath(killer: Entity?) { + super.finalizeDeath(killer) + } + override fun tick() { + if(!player.location.withinDistance(this.location,8)){ + this.terminate() + } + super.tick() + if(!player.viewport.currentPlane.npcs.contains(this)) this.clear() + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/zombie/ZombieRENPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/zombie/ZombieRENPC.kt new file mode 100644 index 000000000..e4511e99d --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/zombie/ZombieRENPC.kt @@ -0,0 +1,40 @@ +package rs09.game.content.ame.events.zombie + +import api.addItemOrDrop +import api.getWorldTicks +import api.produceGroundItem +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.tools.RandomFunction +import org.rs09.consts.Items +import rs09.game.content.ame.RandomEventNPC +import rs09.game.content.global.WeightBasedTable +import rs09.game.content.global.WeightedItem + + +val ids = 419..424 + +class ZombieRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(419){ + override fun talkTo(npc: NPC) {} + override fun init() { + super.init() + val index = (player.properties.combatLevel / 20) - 1 + val id = ids.toList()[index] + this.transform(id) + this.attack(player) + sendChat("Brainsssss!") + this.isRespawn = false + } + override fun finalizeDeath(killer: Entity?) { + super.finalizeDeath(killer) + } + override fun tick() { + if(!player.location.withinDistance(this.location,8)){ + this.terminate() + } + super.tick() + if(!player.viewport.currentPlane.npcs.contains(this)) this.clear() + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/DumpContainer.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/DumpContainer.kt index 66486439b..a8953dc05 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/DumpContainer.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/DumpContainer.kt @@ -1,5 +1,6 @@ package rs09.game.content.dialogue +import api.* import core.game.container.Container import core.game.container.impl.EquipmentContainer import core.game.content.dialogue.DialoguePlugin @@ -32,14 +33,14 @@ class DumpContainer(player: Player? = null) : DialoguePlugin(player) { if (player.inventory.isEmpty) { player.packetDispatch.sendMessage("You have nothing in your inventory to deposit.") } else { - dump(player.inventory) + dumpContainer(player, player.inventory) } } 2 -> { if (player.equipment.isEmpty) { player.packetDispatch.sendMessage("You have no equipment to deposit.") } else { - dump(player.equipment) + dumpContainer(player, player.equipment) } } 3 -> { @@ -55,35 +56,4 @@ class DumpContainer(player: Player? = null) : DialoguePlugin(player) { override fun getIds(): IntArray { return intArrayOf(ID) } - - /** - * Dumps a container. - * @param inventory the player's inventory. - * @author ceik - * @author James Triantafylos - */ - fun dump(inventory: Container) { - val bank = player.bank - for (item: Item in inventory.toArray().filterNotNull()) { - if (!bank.hasSpaceFor(item)) { - player.packetDispatch.sendMessage("You have no more space in your bank.") - return - } - if (!bank.canAdd(item)) { - player.packetDispatch.sendMessage("A magical force prevents you from banking your " + item.name + ".") - } else { - if (inventory is EquipmentContainer) { - val plugin = item.definition.handlers["equipment"] - if (plugin != null && plugin is Plugin<*>) { - plugin.fireEvent("unequip", player, item) - } - } - inventory.remove(item) - bank.add(if (item.definition.isUnnoted) item else Item(item.noteChange, item.amount)) - } - } - inventory.update() - bank.update() - } - } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/GemTraderDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/alkharid/GemTraderDialogue.kt similarity index 96% rename from Server/src/main/kotlin/rs09/game/content/dialogue/GemTraderDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/alkharid/GemTraderDialogue.kt index b5a7c63b3..d0455254f 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/GemTraderDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/alkharid/GemTraderDialogue.kt @@ -1,87 +1,88 @@ -package core.game.content.dialogue - -import core.game.node.entity.npc.NPC -import core.game.node.entity.player.Player -import core.plugin.Initializable - -/** - * Represents the gem trader Dialogue plugin - * @author plex - * @version 2.0 - */ - -@Initializable -class GemTraderDialogue (player: Player? = null): DialoguePlugin(player){ - override fun newInstance(player: Player?): DialoguePlugin { - return GemTraderDialogue(player) - } - - override fun open(vararg args: Any?): Boolean { - npc = (args[0] as NPC).getShownNPC(player) - val qstage = player?.questRepository?.getStage("Family Crest") ?: -1 - if(qstage == 12){ - npc("Good day to you, traveller. ", - "Would you be interested in buying some gems?") - stage = 1 - } - else{ - npc("Good day to you, traveller. ", - "Would you be interested in buying some gems?") - stage = 2 - } - return true - } - - override fun handle(interfaceId: Int, buttonId: Int): Boolean { - when(stage){ - 1 -> options("Yes, please.", "No, thank you.", "I'm in search of a man named Avan Fitzharmon").also{ - stage = 10 - } - - 2 -> options("Yes, please.", "No, thank you.").also{ - stage = 20 - } - - 10 -> when(buttonId){ - 1 -> npc.openShop(player).also { stage = 1000 }; - 2 -> player("No Thank you").also{stage = 1000} - 3 -> npc("Fitzharmon, eh? Hmmm... If I'm not mistaken, ", - "that's the family name of a member ", - "of the Varrockian nobility.").also{stage = 100} - } - - 20 -> when(buttonId){ - 1 -> npc.openShop(player).also { stage = 1000 }; - 2 -> player("No Thank you").also{stage = 1000} - } - - 100 -> npc("You know, I HAVE seen someone of that" , - " persuasion around here recently... " , - "wearing a 'poncey' yellow cape, he was.").also{stage++} - - 101 -> npc("Came in here all la-di-dah, high and mighty,", - "asking for jewellery made from 'perfect gold' - " , - "whatever that is - like 'normal' gold just isn't " , - "good enough for 'little lord fancy pants' there!").also{stage ++} - - 102 -> npc("I told him to head to the desert 'cos " , - "I know there's gold out there, in them there sand dunes. " , - "And if it's not up to his lordship's " , - "high standards of 'gold perfection', then...").also{stage++} - 103 -> npc("Well, maybe we'll all get lucky ", - "and the scorpions will deal with him.").also{ - stage = 1000; - player.questRepository.getQuest("Family Crest").setStage(player, 13) - } - - 1000 -> end() - } - return true - } - - override fun getIds(): IntArray { - return intArrayOf(540) - } - - +package rs09.game.content.dialogue.region.alkharid + +import core.game.content.dialogue.DialoguePlugin +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * Represents the gem trader Dialogue plugin + * @author plex + * @version 2.0 + */ + +@Initializable +class GemTraderDialogue (player: Player? = null): DialoguePlugin(player){ + override fun newInstance(player: Player?): DialoguePlugin { + return GemTraderDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + npc = (args[0] as NPC).getShownNPC(player) + val qstage = player?.questRepository?.getStage("Family Crest") ?: -1 + if(qstage == 12){ + npc("Good day to you, traveller. ", + "Would you be interested in buying some gems?") + stage = 1 + } + else{ + npc("Good day to you, traveller. ", + "Would you be interested in buying some gems?") + stage = 2 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> options("Yes, please.", "No, thank you.", "I'm in search of a man named Avan Fitzharmon").also{ + stage = 10 + } + + 2 -> options("Yes, please.", "No, thank you.").also{ + stage = 20 + } + + 10 -> when(buttonId){ + 1 -> npc.openShop(player).also { stage = 1000 }; + 2 -> player("No Thank you").also{stage = 1000} + 3 -> npc("Fitzharmon, eh? Hmmm... If I'm not mistaken, ", + "that's the family name of a member ", + "of the Varrockian nobility.").also{stage = 100} + } + + 20 -> when(buttonId){ + 1 -> npc.openShop(player).also { stage = 1000 }; + 2 -> player("No Thank you").also{stage = 1000} + } + + 100 -> npc("You know, I HAVE seen someone of that" , + " persuasion around here recently... " , + "wearing a 'poncey' yellow cape, he was.").also{stage++} + + 101 -> npc("Came in here all la-di-dah, high and mighty,", + "asking for jewellery made from 'perfect gold' - " , + "whatever that is - like 'normal' gold just isn't " , + "good enough for 'little lord fancy pants' there!").also{stage ++} + + 102 -> npc("I told him to head to the desert 'cos " , + "I know there's gold out there, in them there sand dunes. " , + "And if it's not up to his lordship's " , + "high standards of 'gold perfection', then...").also{stage++} + 103 -> npc("Well, maybe we'll all get lucky ", + "and the scorpions will deal with him.").also{ + stage = 1000; + player.questRepository.getQuest("Family Crest").setStage(player, 13) + } + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(540) + } + + } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/bananaplantation/BonzaraDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/bananaplantation/BonzaraDialogue.kt new file mode 100644 index 000000000..806dd85da --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/bananaplantation/BonzaraDialogue.kt @@ -0,0 +1,54 @@ +package rs09.game.content.dialogue.region.apeatoll.bananaplantation + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class BonzaraDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npcl(FacialExpression.OLD_DEFAULT,"It looks like you're trying to escape. Would you like some help?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Yes", "No").also { stage++ } + 1 -> when (buttonId) { + 1 -> player(FacialExpression.WORRIED, "I ... uh ... yes.").also { stage = 10 } + 2 -> playerl(FacialExpression.ASKING, "No thank you. Who are you by the way?").also { stage = 20 } + } + + 10 -> npc(FacialExpression.OLD_DEFAULT, "Right you are.").also { stage++ } + 11 -> { + end() + //teleport to ape atoll + } + + 20 -> npcl(FacialExpression.OLD_DEFAULT, "Never mind that child. You should worry more about who you are and the nature of the forces that have driven you here.").also { stage++ } + 21 -> player(FacialExpression.THINKING, "I'll ... keep that in mind, thanks.").also { stage++ } + 22 -> npc(FacialExpression.OLD_DEFAULT, "We WILL meet again, " + player.name + ".").also { stage++ } + 23 -> player(FacialExpression.SUSPICIOUS, "Ok...").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return BonzaraDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.BONZARA_1468) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/dungeon/ZooknockDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/dungeon/ZooknockDialogue.kt new file mode 100644 index 000000000..9fa537a0a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/dungeon/ZooknockDialogue.kt @@ -0,0 +1,145 @@ +package rs09.game.content.dialogue.region.apeatoll.dungeon + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * using temporary variables until quest is actually added + */ + +@Initializable +class ZooknockDialogue(player: Player? = null) : DialoguePlugin(player){ + + + var fr = FacialExpression.FRIENDLY + var neu = FacialExpression.NEUTRAL + var ask = FacialExpression.ASKING + var nor = FacialExpression.OLD_NORMAL + var ntalk1 = FacialExpression.OLD_CALM_TALK1 + var ntalk2 = FacialExpression.OLD_CALM_TALK2 + + var hasSpokenToZook = false + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + if (!hasSpokenToZook) { + player(ask, "Hello?").also { stage = 1 } + } else { + options("What do we need for the monkey amulet?", "What do we need for the monkey talisman?").also { stage = 57 } + } + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> npc(ntalk1, "A human ... here? What business have you on Ape Atoll?").also { stage++ } + 2 -> playerl(neu, "I am on a mission for King Narode Shareen of the Gnomes.").also { stage++ } + 3 -> playerl(neu, "I have been sent to investigate the whereabouts of the 10th squad of his Royal Guard, which went missing during a recent mission to Karamja.").also { stage++ } + 4 -> npc(ntalk1, "Well you've found us - what's left of us, that is.").also { stage++ } + 5 -> npcl(ntalk2, "I am Zooknock, the 10th squad mage. These are Bunkwicker and Waymottin, two of our finest sappers. I assme you will want to know how we got here?").also { stage++ } + 6 -> player(neu, "Of course.").also { stage++ } + 7 -> npcl(ntalk1, "Your story first, human. What possessed you to travel to this forsaken island?").also { stage++ } + 8 -> playerl(neu, "I am currently in the service of your King. I was the human who exposed Glough's warfaring plans and defeated his demon.").also { stage++ } + 9 -> playerl(neu, "As far as I understand, the 10th squad were sent to oversee the decomission of Glough's shipyard in east Karamja.").also { stage++ } + 10 -> playerl(neu, "Rumour has it you were blown off course. The King worried as to your fate, and sent me to investigate.").also { stage++ } + 11 -> npc(ntalk1, "You were sent alone?").also { stage++ } + 12 -> playerl(neu, "No, I have been accompanied by Flight Commander Waydar. We flew south on a special type of glider and landed on a small island to our east.").also { stage++ } + 13 -> npcl(ntalk2, "The so called Crash Island. We left there one of our number, Lumdo, to guard our gliders until our return.").also { stage++ } + 14 -> player(neu, "Yes, we have met. He ferried me across to the atoll.").also { stage++ } + 15 -> npcl(FacialExpression.OLD_ANGRY1, "He did!? He was explicitly ordered to guard the gliders! How did this happen? Who is guarding the gliders now?").also { stage++ } + 16 -> playerl(ntalk1, "Waydar ordered him to leave his post. He is guarding the gliders himself.").also { stage++ } + 17 -> npcl(ntalk2, "Flight Commander Waydar you said? For some reason that name is familiar...").also { stage++ } + 18 -> player(ask, "So why are you here?").also { stage++ } + 19 -> npcl(ntalk2, "The rumours are correct. We were indeed blown off course. Fortunately, we managed to find a small island to steer our gliders towards, else we surely would have drowned.").also { stage++ } + 20 -> playerl(neu, "Then you gathered enough wood to fashion two boats. Your Sergeant and the rest of the 10th squad took the larger boat to this island, leaving Lumdo to guard the gliders and the other boat...").also { stage++ } + 21 -> npc(ntalk1, "Correct. I assume Lumdo told you this?").also { stage++ } + 22 -> player(ask, "Yes. What happened when you landed here?").also { stage++ } + 23 -> npcl(ntalk2, "We split up into several small groups to search the island for potential gnome glider launch sites. Whilst we knew the island to be inhabited, we did not expect its occupants to be quite so ... militant.").also { stage++ } + 24 -> player(FacialExpression.THINKING, "...").also { stage++ } + 25 -> npcl(ntalk1, "Monkeys. Lots of monkeys. They are unlike any other type of monkey we've come across. A far cry from the usual wild variety, these were armed with high quality weaponry and uncanny tactical ability.").also { stage++ } + 26 -> npcl(ntalk2, "We were overwhelmed in numbers. Some of us managed to escape, but the rest were taken captive.").also { stage++ } + 27 -> player(ask, "Who survived?").also { stage++ } + 28 -> npcl(ntalk1, "Myself, the Sergeant, Bunwicker and Waymottin here. Karam, our assassin, probably managed to escape - he usually does.").also { stage++ } + 29 -> player(ask, "And of the rest?").also { stage++ } + 30 -> npcl(ntalk1, "Lumo, Bunkdo and Carado were captured, as I said. We believe they are being held in the jail. We are working on a way to release them. I have sensed there lies a cavern to the north.").also { stage++ } + 31 -> npcl(ntalk2, "We are attempting to tunnel to this northern cavern and then move upwards from there.").also { stage++ } + 32 -> player(ask, "Why don't you just go overground?").also { stage++ } + 33 -> npcl(ntalk2, "We have considered this, but every entrance seems to be excessively guarded.").also { stage++ } + 34 -> player(ask, "I see.").also { stage++ } + 35 -> playerl(ask, "I have spoken to your Sergeant. He believes that the best way to rescue the rest of your squad with the minimum of casualties is to have an insider - a monkey working for us.").also { stage++ } + 36 -> npc(ntalk1, "Aha. He wants me to turn you into a monkey.").also { stage++ } + 37 -> player(ask, "Actually, it was more along the lines of a disguise...").also { stage++ } + 38 -> npcl(ntalk1, "I think you misunderstand, human. Do you know why you were sent here?").also { stage++ } + 39 -> player(ask, "King Narode Shareen asked me to...").also { stage++ } + 40 -> npcl(ntalk1, "Indeed. However, King Narode Shareen is still in contact with Garkor! You were sent here because Garkot specifically asked Narode for you!").also { stage++ } + 41 -> player(ask, "Why wasn't I told?").also { stage++ } + 42 -> npcl(ntalk2, "Before you arrived on this island, that information would have endangered both yourself and the mission.").also { stage++ } + 43 -> player(ask, "But why a human? Why me?").also { stage++ } + 44 -> npcl(ntalk1, "Garkor had long decided that we need a monkey insider. I have the necessary magic to perform the shapeshifting spell, but we needed a human to transform.").also { stage++ } + 45 -> player(ask, "Why don't you just transform a gnome?").also { stage++ } + 46 -> npcl(ntalk2, "It has been tried in the past, but the results were far from ... satisfactory. Although we, like you, are related to the monkeys, the link is too weak for a successful transformation.").also { stage++ } + 47 -> npc(ntalk1, "That is why we need you.").also { stage++ } + 48 -> player(ask, "Right. What do I have to do?").also { stage++ } + 49 -> npcl(ntalk1, "There will be two aspects to your transformation. We must first arrange it so that you are able to understand and communicate with the monkeys.").also { stage++ } + 50 -> npcl(ntalk2, "We must also transform your body so that you may pass amongst them unnoticed.").also { stage++ } + 51 -> npcl(ntalk1, "So that the effects of my spells are not permanent, I will invest their power into magical items which you must find. You can then use them at your will.").also { stage++ } + 52 -> player(ask, "What kind of items?").also { stage++ } + 53 -> npcl(ntalk2, "For the spells to take full effect, they will have to be in some way related to the monkeys.").also { stage++ } + 54 -> npcl(ntalk1, "I suggest that I invest the ability to communicate with the monkeys in an authentic monkey amulet.").also { stage++ } + 55 -> { + hasSpokenToZook = true + npcl(ntalk1, "Similarily, the transformation spell should be stored in a monkey talisman of some kind.").also { stage++ } + } + 56 -> options("What do we need for the monkey amulet?", "What do we need for the monkey talisman?").also { stage++ } + 57 -> when (buttonId) { + 1 -> player(ask, "What do we need for the monkey amulet?").also { stage = 60 } + 2 -> player(ask, "What do we need for the monkey talisman?").also { stage = 100 } + } + + 60 -> npcl(ntalk1, "We need a gold bar, a monkey amulet mould and something to do monkey speech.").also { stage++ } + 61 -> options("Where do I find the gold bar?", "Where do I find a monkey amulet mould?", "Where do I find something to do with monkey speech?", "I'll be back later.").also { stage++ } + 62 -> when (buttonId) { + 1 -> player(ask, "Where do I find the gold bar?").also { stage = 70 } + 2 -> player(ask, "Where do I find a monkey amulet mould?").also { stage = 80 } + 3 -> player(ask, "Where do I find something to do with monkey speech?").also { stage = 90 } + 4 -> player(neu, "I'll be back later.").also { stage = 99 } + } + + 70 -> npcl(ntalk1, "I am not sure. You look wealthy enough to know the answer to that question anyway.").also { stage = 61 } + 80 -> npcl(ntalk1, "They ought to be for sale in the village, but be careful: you probably will not be able to walk straight in and buy one.").also { stage = 61 } + 90 -> npc(ntalk2, "I don't know. I'm sure you'll think of something.").also { stage = 61 } + + 100 -> npcl(nor, "We need some kind of monkey remains as well as an authentic magical monkey talisman.").also { stage++ } + 101 -> options("Where do I find monkey remains?", "Where do I find a magical monkey talisman?", "I'll be back later.").also { stage++ } + 102 -> when (buttonId) { + 1 -> player(ask, "Where do I find monkey remains?").also { stage = 110 } + 2 -> player(ask, "Where do I find a magical monkey talisman?").also { stage = 120 } + 3 -> player(neu, "I'll be back later.").also { stage = 99 } + } + + 110 -> npcl(nor, "I'll leave that to your better judgement... However, bear in mind the type of remain might affect the type of monkey you become...").also { stage++ } + 111 -> player(ask, "What if I need to be another type of monkey?").also { stage++ } + 112 -> npcl(ntalk1, "Then bring me different monkey remains and another talisman.").also { stage = 101} + + 120 -> npcl(ntalk2, "There ought to be something in the village. I cannot be sure, as I have not spent much time there.").also { stage = 101 } + + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ZooknockDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ZOOKNOCK_1425) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/dungeon/ZooknockDialogueFile.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/dungeon/ZooknockDialogueFile.kt new file mode 100644 index 000000000..05e180fe2 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/dungeon/ZooknockDialogueFile.kt @@ -0,0 +1,94 @@ +package rs09.game.content.dialogue.region.examcentre + +import api.addItemOrDrop +import api.sendDoubleItemDialogue +import api.sendItemDialogue +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import org.rs09.consts.Items +import org.rs09.consts.NPCs +import rs09.game.content.dialogue.DialogueFile +import rs09.game.interaction.item.withnpc.ZooknockListener + +/** + * @author qmqz + * todo will need to check quest stages for what's been handed over and whatnot + */ + +class ZooknockDialogueFile(val it: Int) : DialogueFile() { + + var i = ZooknockListener() + var n = NPC(i.zooknock) + var itemUsed = it + var hasGivenGoldBar = false + var hasGivenDentures = false + var hasGivenMould = false + + override fun handle(interfaceId: Int, buttonId: Int) { + npc = n + + when (stage) { + 0 -> when (itemUsed) { + i.goldBar -> { + if (!hasGivenGoldBar) { + player(FacialExpression.ASKING, "What do you think of this?").also { stage = 10 } + hasGivenGoldBar = true + } + } + + i.monkeyAmuletMould -> { + if (!hasGivenMould) { + player(FacialExpression.ASKING, "What do you think of this?").also { stage = 20 } + hasGivenMould = true + } + } + + i.monkeyDentures -> { + if (!hasGivenDentures) { + player(FacialExpression.ASKING, "What do you think of this?").also { stage = 30 } + } + } + } + + 10 -> sendItemDialogue(player!!, Items.GOLD_BAR_2357, "You hand Zooknock the gold bar.").also { stage++ } + 11 -> npc(FacialExpression.OLD_CALM_TALK1, "Nicely done.").also { stage++ } + 12 -> { + if (!hasGivenDentures && !hasGivenMould && hasGivenGoldBar) { + npcl(FacialExpression.OLD_CALM_TALK1, "We still need the monkey amulet mould and something to do with monkey speech.").also { stage = 99 } + } + } + + 20 -> sendItemDialogue(player!!, Items.MAMULET_MOULD_4020, "You hand Zooknock the monkey amulet mould.").also { stage++ } + 21 -> npc(FacialExpression.OLD_CALM_TALK1, "Good work.").also { stage++ } + 22 -> { + if (!hasGivenDentures && hasGivenMould && hasGivenGoldBar) { + npcl(FacialExpression.OLD_CALM_TALK1, "We still need something to do with monkey speech.").also { stage = 99 } + } + } + + 30 -> sendItemDialogue(player!!, Items.MSPEAK_AMULET_4021, "You hand Zooknock the magical monkey dentures.").also { stage++ } + 31 -> npc(FacialExpression.OLD_CALM_TALK1, "Good work.").also { stage++ } + 32 -> { + if (hasGivenDentures && hasGivenMould && hasGivenGoldBar) { + npcl(FacialExpression.OLD_CALM_TALK1, "Now listen closely, human. I will cast a spell to enchant this gold bar with the power contained in these monkey dentures.").also { stage = 40 } + } + } + + 40 -> npcl(FacialExpression.OLD_CALM_TALK1, "You must then smith the gold using the monkey amulet mould. However, unless you do this in a place of religious significance to the monkeys, the spirits").also { stage++ } + 41 -> npcl(FacialExpression.OLD_CALM_TALK2, "contained within will likely depart.").also { stage++ } + 42 -> playerl(FacialExpression.FRIENDLY, "Where do I find a place of religious significance to monkeys?").also { stage++ } + 43 -> npcl(FacialExpression.OLD_CALM_TALK1, "Somewhere in the village. It out to be obvious. Now give me a moment.").also { stage++ } + 44 -> { + //zooknock does animation, bla bla bla, waits a few seconds, opens up new next dialog + } + 45 -> { + addItemOrDrop(player!!, Items.ENCHANTED_BAR_4007, 1) + addItemOrDrop(player!!, Items.MAMULET_MOULD_4020, 1) + sendDoubleItemDialogue(player!!, Items.ENCHANTED_BAR_4007, Items.MAMULET_MOULD_4020, "Zooknock hands you back the gold bar and the monkey amulet mould.").also { stage++ } + } + + + 99 -> end() + } + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/AberabDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/AberabDialogue.kt similarity index 86% rename from Server/src/main/kotlin/rs09/game/content/dialogue/AberabDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/AberabDialogue.kt index 5e6f42c9b..593b63ac2 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/AberabDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/AberabDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.apeatoll.marim import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression @@ -16,7 +16,7 @@ class AberabDialogue(player: Player? = null) : DialoguePlugin(player){ override fun open(vararg args: Any?): Boolean { npc = args[0] as NPC - npc(FacialExpression.CHILD_SUSPICIOUS,"Grr ... Get out of my way...") + npc(FacialExpression.OLD_ANGRY1,"Grr ... Get out of my way...") stage = 99 return true } diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/DagaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/DagaDialogue.kt new file mode 100644 index 000000000..981c9fe59 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/DagaDialogue.kt @@ -0,0 +1,64 @@ +package rs09.game.content.dialogue.region.apeatoll.marim + +import api.addItemOrDrop +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Does not include treasure trails dialogue + */ + +@Initializable +class DagaDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DEFAULT,"Would you like to buy or sell some scimitars?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Yes, please.", "No, thanks.", "Do you have any Dragon Scimitars in stock?").also { stage++ } + + 1 -> when (buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Yes, please.").also { stage = 10 } + 2 -> player(FacialExpression.FRIENDLY, "No, thanks.").also { stage = 99 } + 3 -> player(FacialExpression.HALF_ASKING, "Do you have any Dragon Scimitars in stock?").also { stage = 30 } + } + + 10 -> end().also { npc.openShop(player) } + + 30 -> npcl(FacialExpression.OLD_DEFAULT, "It just so happens I recently got a fresh delivery, do you want to buy one?").also { stage++ } + 31 -> options("Yes, please.", "No, thanks.").also { stage++ } + + 32 -> when (buttonId) { + 1 -> if (player.inventory.contains(Items.COINS_995, 100000)) { + player.inventory.remove(Item(995,100000)) + addItemOrDrop(player, Items.DRAGON_SCIMITAR_4587, 1) + } else { + npcl(FacialExpression.OLD_NORMAL, "Sorry but you don't have enough to buy one, at the moment it costs 100,000 gold coins.").also { stage = 99 } + } + 2 -> player(FacialExpression.FRIENDLY, "No thanks.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DagaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.DAGA_1434) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/ElderGuardDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/ElderGuardDialogue.kt new file mode 100644 index 000000000..a33c1e8e8 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/ElderGuardDialogue.kt @@ -0,0 +1,63 @@ +package rs09.game.content.dialogue.region.apeatoll.marim + +import api.toIntArray +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class ElderGuardDialogue(player: Player? = null) : DialoguePlugin(player){ + + val ids = 4025..4031 + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + //todo check player pos, if outside, player needs to be unable from entering without speaking, but currently player can clip through monke + var outside = true + //todo check if monke is in the corner + var cornerGuard = false + + if (player.equipment.containsAtLeastOneItem(ids.toIntArray())) { + if (outside) { + npc(FacialExpression.OLD_ANGRY1, "Grrr ... What do you want?").also { stage = 10 } + } else if(cornerGuard){ + npc(FacialExpression.OLD_ANGRY1, "Grrr ... What do you want?").also { stage = 20 } + } else { + npc(FacialExpression.OLD_ANGRY1, "Move!").also { stage = 99 } + } + } else { + //todo monke is gonna knock you out if you don't have a monkey gree gree thang, chicken wang + } + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 10 -> playerl(FacialExpression.ASKING, "I must speak with Awowogei on a subject of great import.").also { stage ++ } + 11 -> npc(FacialExpression.OLD_NORMAL, "As you wish.").also { stage = 99 } + + 20 -> player(FacialExpression.ASKING, "I would like to leave now.").also { stage ++ } + 21 -> npc(FacialExpression.OLD_NORMAL, "As you wish.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ElderGuardDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ELDER_GUARD_1461, NPCs.ELDER_GUARD_1462) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/MuruwoiDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/MuruwoiDialogue.kt new file mode 100644 index 000000000..9eb5f376b --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/apeatoll/marim/MuruwoiDialogue.kt @@ -0,0 +1,39 @@ +package rs09.game.content.dialogue.region.apeatoll.marim + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * quest dialogue is missing on rs3 and osrs, someone will need to youtube it + */ + +@Initializable +class MuruwoiDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_ANGRY1,"Grr ... Get out of my way...") + stage = 99 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return MuruwoiDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.MURUWOI_1450) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/ardougne/ChadwellDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ardougne/ChadwellDialogue.kt new file mode 100644 index 000000000..2b9c05bdc --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ardougne/ChadwellDialogue.kt @@ -0,0 +1,47 @@ +package rs09.game.content.dialogue.region.ardougne + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class ChadwellDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Good day. What can I get you?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Let's see what you've got.", "Nothing thanks.").also { stage++ } + 1 -> when (buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Let's see what you've got.").also { stage = 5 } + 2 -> player(FacialExpression.FRIENDLY, "Nothing thanks.").also { stage = 10 } + } + + 5 -> end().also { npc.openShop(player) } + + 10 -> npc(FacialExpression.FRIENDLY, "Okay then.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ChadwellDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.CHADWELL_971) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/ardougne/MonkeyChildThingZooDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ardougne/MonkeyChildThingZooDialogue.kt new file mode 100644 index 000000000..6cf706f4a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ardougne/MonkeyChildThingZooDialogue.kt @@ -0,0 +1,71 @@ +package rs09.game.content.dialogue.region.ardougne + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class MonkeyChildThingZooDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"").also { stage = 0 } + if (!player.equipment.contains(Items.MSPEAK_AMULET_4021, 1)) { + npc(FacialExpression.OLD_LAUGH1, "Eeekeek ookeek!").also { stage = 99 } + } else { + var a = 1..5 + when(a.random()) { + 1 -> npc(FacialExpression.OLD_LAUGH1, "Arr!").also { stage = 10 } + 2 -> npcl(FacialExpression.OLD_LAUGH1, "Let me go, can't ye hear them? Howlin' in the dark...").also { stage = 20 } + 3 -> npcl(FacialExpression.OLD_DEFAULT, "I'm not goin' back in that brewery, not fer all the Bitternuts I can carry!").also { stage = 99 } + 4 -> npc(FacialExpression.OLD_DEFAULT, "Are ye here for...the stuff?").also { stage = 30 } + 5 -> npc(FacialExpression.OLD_DISTRESSED, "Arr! Yer messin with me monkey plunder!").also { stage = 40 } + } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + + 10 -> player(FacialExpression.JOLLY, "Arr!").also { stage++ } + 11 -> npc(FacialExpression.OLD_LAUGH1, "Arr!").also { stage++ } + 12 -> player(FacialExpression.JOLLY, "Arr!").also { stage++ } + 13 -> npc(FacialExpression.OLD_LAUGH1, "Arr!").also { stage++ } + 14 -> player(FacialExpression.JOLLY, "Arr!").also { stage++ } + 15 -> npc(FacialExpression.OLD_LAUGH1, "Arr!").also { stage++ } + 16 -> player(FacialExpression.JOLLY, "Arr!").also { stage++ } + 17 -> npc(FacialExpression.OLD_LAUGH1, "Bored now...").also { stage = 99 } + + 20 -> player(FacialExpression.ASKING, "What do you mean?").also { stage++ } + 21 -> npc(FacialExpression.OLD_DISTRESSED, "I'm not hangin' around te be killed!").also { stage++ } + 22 -> npc(FacialExpression.OLD_DISTRESSED, "The Horrors, the Horrors!").also { stage = 99 } + + 30 -> player(FacialExpression.ASKING, "What?").also { stage++ } + 31 -> npc(FacialExpression.OLD_DEFAULT, "You know...the 'special' bananas?").also { stage++ } + 32 -> player(FacialExpression.ASKING, "No... why do you ask?").also { stage++ } + 33 -> npc(FacialExpression.OLD_SAD, "No reason. Have a nice day.").also { stage = 99 } + + 40 -> player(FacialExpression.ASKING, "What?").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return MonkeyChildThingZooDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.MONKEY_4363) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/ardougne/ZookeeperDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ardougne/ZookeeperDialogue.kt new file mode 100644 index 000000000..b49a1c657 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ardougne/ZookeeperDialogue.kt @@ -0,0 +1,82 @@ +package rs09.game.content.dialogue.region.ardougne + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Does not include treasure trails dialogue + */ + +@Initializable +class ZookeeperDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hi!").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + npc(FacialExpression.FRIENDLY, "Welcome to the Ardougne Zoo! How can I help you?").also { stage++ } + } + 1 -> { + options("Do you have any quests for me?", "Where did you get the animals from?").also { stage++ } + } + + 2 -> when (buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Do you have any quests for me?").also { stage = 10 } + 2 -> player(FacialExpression.FRIENDLY, "Where did you get the animals from?").also { stage = 20 } + } + + 10 -> { + npc(FacialExpression.FRIENDLY, "Not at the moment.", + "The explorers that come back from far away lands tell", + "such amazing tales. Make sure you keep eyes and ears", + "open as you may find new places to explore!").also { stage++ } + } + + 11 -> { + player(FacialExpression.FRIENDLY, "Ooh, I will!").also { stage = 99 } + } + + 20 -> { + npc(FacialExpression.FRIENDLY, "We get them from all over the place!", + "The most exotic creatures have been brought", + "back by explorers and sold to us.").also { stage++ } + } + + 21 -> { + player(FacialExpression.HALF_ASKING, "Where on Gielinor did you get that scary", + "looking Cyclops?!").also { stage++ } + } + + 22 -> { + npc(FacialExpression.LAUGH, "Yes he is scary looking!").also { stage++ } + } + + 23 -> { + npc(FacialExpression.FRIENDLY, "He's from a very far away land, we couldn't", + "find out more as the explorer who brought", + "him back died shortly afterwards!").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ZookeeperDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ZOO_KEEPER_28) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/CaptainCainDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/barbarianassault/CaptainCainDialogue.kt similarity index 97% rename from Server/src/main/kotlin/rs09/game/content/dialogue/CaptainCainDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/barbarianassault/CaptainCainDialogue.kt index 2d3e4ca82..469e9a2d5 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/CaptainCainDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/barbarianassault/CaptainCainDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.barbarianassault import api.* import core.game.content.dialogue.DialoguePlugin diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/AgilityBossDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/canifis/AgilityBossDialogue.kt similarity index 97% rename from Server/src/main/kotlin/rs09/game/content/dialogue/AgilityBossDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/canifis/AgilityBossDialogue.kt index 0b62b2825..f0c49f279 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/AgilityBossDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/canifis/AgilityBossDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.canifis import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/digsite/ElissaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/digsite/ElissaDialogue.kt new file mode 100644 index 000000000..d7fb3e740 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/digsite/ElissaDialogue.kt @@ -0,0 +1,101 @@ +package rs09.game.content.dialogue.region.digsite + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class ElissaDialogue(player: Player? = null) : DialoguePlugin(player){ + + var fr = FacialExpression.FRIENDLY + var ask = FacialExpression.ASKING + var ann = FacialExpression.ANNOYED + var neu = FacialExpression.ANNOYED + var ama = FacialExpression.AMAZED + var qb = 2 + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Hello there.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + //three quest branches + //normal dialogue + 0 -> (options("What do you do here?", "What is this place?")).also { stage++ } + 1 -> { + when(qb) { + 1 -> player(ask, "What do you do here?").also { stage = 10 } + 2 -> player(ask, "What is this place?").also { stage = 20 } + } + } + + 10 -> npcl(fr, "I am helping with the dig. I am an expert on Third Age architecture.").also { stage = 99 } + 20 -> npcl(ann, "In the Third Age, this was a great city, which would have put Varrock to shame!").also { stage++ } + 21 -> options("I don't know, Varrock is pretty impressive.", "What happened to the city?").also { stage++ } + 22 -> when(buttonId) { + 1 -> player(fr, "I don't know, Varrock is pretty impressive.").also { stage = 30 } + 2 -> player(ask, "What happened to the city?").also { stage = 40 } + } + + 30 -> npcl(ann, "Hmph. I don't think it will look this good when it's been buried in the ground for three thousand years!").also { stage = 99 } + 40 -> npc(neu, "No one knows for sure.").also { stage++ } + 41 -> npcl(neu, "But the The Third Age was a time of destruction, when the gods were violently at war. Many great civilizations were destroyed then.").also { stage = 99 } + + //the golem quest dialogue first time talking + 50 -> (options("What do you do here?", "What is this place?", "I found a letter in the desert with your name on.")).also { stage++ } + 51 -> when (buttonId) { + 1 -> player(ask, "What do you do here?").also { stage = 10 } + 2 -> player(ask, "What is this place?").also { stage = 20 } + 3 -> playerl(fr, "I found a letter in the desert with your name on.").also { stage = 60 } + } + 60 -> npc(ama, "Ah, so you've found the ruins of Uzer.").also { stage++ } + 61 -> npcl(ama, "I wrote that letter to my late husband when he was exploring there.").also { stage++ } + 62 -> npcl(ama, "That was a great city as well, but the museum could only fund one excavation and this one was closer to home.").also { stage++ } + 63 -> npcl(ama, "If you're interested in his expedition, the notes he made are in the library in the Exam Centre.").also { stage = 99 } + + //talking to her again after the initial golem quest dialogue + 70 -> (options("What do you do here?", "What is this place?", "Where did you say the notes were?")).also { stage++ } + 71 -> when (buttonId) { + 1 -> player(ask, "What do you do here?").also { stage = 10 } + 2 -> player(ask, "What is this place?").also { stage = 20 } + 3 -> playerl(fr, "Where did you say the notes were?").also { stage = 80 } + } + + 80 -> npc(fr, "They're on a bookcase in the Exam Centre.").also { stage = 99 } + + //after reading varmen's notes + 90 -> (options("What do you do here?", "What is this place?", "Where is the statuette that Varmen took back from Uzer?")).also { stage++ } + 91 -> when (buttonId) { + 1 -> player(ask, "What do you do here?").also { stage = 10 } + 2 -> player(ask, "What is this place?").also { stage = 20 } + 3 -> playerl(fr, "Where is the statuette that Varmen took back from Uzer?").also { stage = 100 } + } + + 100 -> npc(ask, "The statuette? Oh, yes...").also { stage++ } + 101 -> npcl(neu, "That statuette was the only thing we had to show from that expedition.").also { stage++ } + 102 -> npcl(ask, "It was very worn, but you can still make out a lot of detail. The Uzerians were expert sculptors. It's a pity we only have that small example.").also { stage++ } + 103 -> npc(ask, "Now it's on display in the Varrock museum.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ElissaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ELISSA_1912) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/BarlakDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/BarlakDialogue.kt new file mode 100644 index 000000000..8714e8bf6 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/BarlakDialogue.kt @@ -0,0 +1,241 @@ +@file:Suppress("UNUSED_PARAMETER") + +package rs09.game.content.dialogue.region.dorgeshuun +import api.* +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs +import java.text.NumberFormat + +/** + * @author qmqz + */ + +@Initializable +class BarlakDialogue(player: Player? = null) : DialoguePlugin(player){ + var pask = FacialExpression.ASKING + var pfr = FacialExpression.FRIENDLY + var pneu = FacialExpression.NEUTRAL + + var nhap = FacialExpression.OLD_HAPPY + var ntalk1 = FacialExpression.OLD_CALM_TALK1 + var ntalk2 = FacialExpression.OLD_CALM_TALK2 + + var f = NumberFormat.getIntegerInstance() + var curItem = 0 + var toAddFromBank = 0 + + val sets = arrayOf( + intArrayOf(Items.LONG_BONE_10976, 1000, 1500, Skills.CONSTRUCTION), + intArrayOf(Items.CURVED_BONE_10977, 2000, 2250, Skills.CONSTRUCTION), + intArrayOf(Items.SNAIL_SHELL_7800, 600, 0, Skills.CONSTRUCTION), + intArrayOf(Items.PERFECT_SNAIL_SHELL_10996, 600, 500, Skills.CRAFTING), + intArrayOf(Items.TORTOISE_SHELL_7939, 600, 0, Skills.CRAFTING), + intArrayOf(Items.PERFECT_SHELL_10995, 600, 500, Skills.CRAFTING), + ) + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + if (player.skills.getStaticLevel(Skills.CONSTRUCTION) >= 30 && player.houseManager.hasHouse()) { + if (player.inventory.contains(Items.LONG_BONE_10976, 1)) { + curItem = 0 + npcl(nhap, "Those bones! Those are exactly the sort of thing I need! Will you sell them?").also { stage = 0 } + } else if (player.inventory.contains(Items.CURVED_BONE_10977, 1)) { + curItem = 1 + npcl(nhap, "Those bones! Those are exactly the sort of thing I need! Will you sell them?").also { stage = 0 } + } else if (player.inventory.contains(Items.PERFECT_SHELL_10995, 1)) { + curItem = 5 + npc(ntalk2, "That giant shell... what is it?").also { stage = 120 } + } else if (player.inventory.contains(Items.TORTOISE_SHELL_7939, 1)) { + curItem = 4 + npc(ntalk2, "That giant shell... what is it?").also { stage = 100 } + } else if (player.inventory.contains(Items.PERFECT_SNAIL_SHELL_10996, 1)) { + curItem = 3 + npc(ntalk1, "That giant shell... what is it?").also { stage = 60 } + } else if (player.inventory.contains(Items.SNAIL_SHELL_7800, 1)) { + curItem = 2 + npc(ntalk1, "That giant shell... what is it?").also { stage = 50 } + } else { + npc(nhap, "Bones!").also { stage = 150 } + } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(ntalk1, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the bones you're carrying and for any you have in your bank.").also { stage++ } + 1 -> npcl(ntalk2, "I'll try to teach you something about Construction as well, but it's highly technical so you won't understand if you don't already have level 30 Construction.").also { stage++ } + 2 -> options("Okay.", "No, I'll keep the bones.").also { stage++ } + 3 -> when (buttonId) { + 1 -> player(pfr, "Okay.").also { stage = 10 } + 2 -> player(pneu, "No thanks.").also { stage = 99 } + } + + 10 -> { + doDaMaffBish() + npc(ntalk1, "Thanks! Now, let me explain...").also { stage = 999 } + } + + 50 -> player(pfr, "It's a giant snail shell!").also { stage++ } + 51 -> npcl(ntalk1, "Hmm... I think I might be able to make something out of them.").also { stage++ } + 52 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the snail shells you're carrying.").also { stage++ } + 53 -> options("Okay.", "No. I'll keep the bones.").also { stage++ } + 54 -> when (buttonId) { + 1 -> player(pfr, "Okay.").also { stage = 55 } + 2 -> player(pneu, "No thanks.").also { stage = 99 } + } + 55 -> { + doDaMaffBish() + npcl(ntalk1, "Thanks. If you find any more shells like these, please bring them to me!").also { stage = 99 } + } + 60 -> player(pfr, "It's a giant snail shell!").also { stage++ } + 61 -> { + when (player.inventory.getAmount(Items.PERFECT_SNAIL_SHELL_10996)) { + 1 -> npcl(ntalk2, "Hmm... I think I might be able to make something out of them, especially that perfect one.").also { stage++ } + else -> npcl(ntalk1, "Hmm... I think I might be able to make something out of them, especially those perfect ones.").also { stage = 70 } + } + } + + 62 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the snail shell you're carrying, and I'll try to give you some advice on Crafting while I'm at it.").also { stage++ } + 63 -> options("Okay.", "No. I'll keep the bones.").also { stage++ } + 64 -> when (buttonId) { + 1 -> player(pfr, "Okay.").also { stage = 65 } + 2 -> player(pneu, "No thanks.").also { stage = 99 } + } + 65 -> { + npcl(ntalk2, "Thanks! Now, I don't think I could use that for Construction, but maybe I could make something...").also { stage = 1000 } + doDaMaffBish() + } + + 70 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the snail shells you're carrying, and I'll try to give you some advice on Crafting while I'm at it.").also { stage++ } + 71 -> options("Okay.", "No. I'll keep the bones.").also { stage++ } + 72 -> when (buttonId) { + 1 -> player(pfr, "Okay.").also { stage = 75 } + 2 -> player(pneu, "No thanks.").also { stage = 99 } + } + 75 -> { + npcl(ntalk2, "Thanks! Now, I don't think I could use that for Construction, but maybe I could make something...").also { stage = 1000 } + doDaMaffBish() + } + + 100 -> player(pfr, "It's a giant battle tortoise shell!").also { stage++ } + 101 -> npcl(ntalk1, "Hmm... I think I might be able to make something out of them.").also { stage++ } + 102 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the tortoise shells you're carrying.").also { stage++ } + 103 -> options("Okay.", "No. I'll keep the bones.").also { stage++ } + 104 -> when (buttonId) { + 1 -> player(pfr, "Okay.").also { stage = 105 } + 2 -> player(pneu, "No thanks.").also { stage = 99 } + } + 105 -> { + npcl(ntalk2, "Thanks. If you find any more shells like these, please bring them to me!").also { stage = 130 } + doDaMaffBish() + } + + 120 -> player(pfr, "It's a giant battle tortoise shell!").also { stage++ } + 121 -> { + when (player.inventory.getAmount(Items.PERFECT_SHELL_10995)) { + 1 -> npcl(ntalk2, "Hmm... I think I might be able to make something out of them, especially that perfect one.").also { stage++ } + else -> npcl(ntalk1, "Hmm... I think I might be able to make something out of them, especially those perfect ones.").also { stage = 130 } + } + } + 122 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the tortoise shell you're carrying, and I'll try to give you some advice on Crafting while I'm at it.").also { stage++ } + 123 -> options("Okay.", "No. I'll keep the bones.").also { stage++ } + 124 -> when (buttonId) { + 1 -> player(pfr, "Okay.").also { stage = 125 } + 2 -> player(pneu, "No thanks.").also { stage = 99 } + } + 125 -> { + npcl(ntalk2, "Thanks! Now, I don't think I could use that for Construction, but maybe I could make something...").also { stage = 1001 } + doDaMaffBish() + } + + 130 -> { + if (player.inventory.contains(Items.SNAIL_SHELL_7800, 1)) { + curItem = 2 + npc(ntalk1, "That giant shell... what is it?").also { stage = 50 } + } else if (player.inventory.contains(Items.PERFECT_SNAIL_SHELL_10996, 1)) { + curItem = 3 + npc(ntalk1, "That giant shell... what is it?").also { stage = 60 } + } else { + end() + } + } + + 150 -> player(FacialExpression.THINKING, "What?").also { stage++ } + 151 -> npc(FacialExpression.OLD_DISTRESSED, "I don't have any bones!").also { stage++ } + 152 -> options("Then how do you stand up?", "What do you need bones for?", "Will you buy anything besides bones?", "What kind of bones do you need?", "Goodbye").also { stage++ } + 153 -> when (buttonId) { + 1 -> player(FacialExpression.THINKING, "Then how do you stand up?").also { stage = 200 } + 2 -> player(FacialExpression.THINKING, "What do you need bones for?").also { stage = 220 } + 3 -> player(FacialExpression.THINKING, "Will you buy anything besides bones?").also { stage = 240 } + 4 -> player(FacialExpression.THINKING, "What kind of bones do you need?").also { stage = 260 } + 5 -> player(pfr, "Goodbye.").also { stage = 280 } + } + + 200 -> npc(FacialExpression.OLD_CALM_TALK1, "What?").also { stage++ } + 201 -> playerl(FacialExpression.FRIENDLY, "How do you stand up if you have no bones? Shouldn't you collapse into a gelatinous blob?").also { stage++ } + 202 -> npc(FacialExpression.OLD_LAUGH1, "Ha, ha, ha, ha, ha!").also { stage = 152 } + + 220 -> npcl(FacialExpression.OLD_LAUGH1, "To stand up properly. Otherwise I'd collapse into a gelatinous blob! Ha, ha, ha, ha, ha! No, seriously, I need bones to use as a Construction material.").also { stage++ } + 221 -> npcl(ntalk1, "We always need big bones to prop up the mine shafts and to make other temporary structures.").also { stage = 152 } + 240 -> npcl(ntalk2, "Well, I've had a few people bring me some interesting giant shells. They say they came from giant snails and giant tortoises. Of course, like the bones, some shells are better than others.").also { stage++ } + 241 -> npcl(ntalk1, "I'll give you 250gp for ordinary shells, but what I really need are perfect shells.").also { stage++ } + 242 -> npcl(ntalk2, "I'll pay double for them and give you a few tips about Crafting too.").also { stage = 152 } + + 260 -> npcl(ntalk1, "Enormous bones, as big as you can get. Not just any big bones will do. Sometimes you might find a particularly long, straight bone. That's the kind of thing I need; I'll give you 1,000gp for one of them.").also { stage++ } + 261 -> npcl(ntalk2, "Occasionally, you might find a long curved bone - these are especially valuable - I'll give you 2,000gp for them. I'll also teach you a bit about how we use the bones in Construction, if you like.").also { stage = 152 } + + 280 -> npc(ntalk2, "Goodbye.").also { stage = 99 } + + 999 -> sendDialogue("Barlak gives you a short lecture and you learn more about Construction.").also { stage = 99 } + 1000 -> sendDialogue("Barlak gives you a short lecture and you learn more about Crafting.").also { stage = 99 } + 1001 -> sendDialogue("Barlak gives you a short lecture and you learn more about Crafting.").also { stage = 130 } + 99 -> end() + } + return true + } + private fun wotItem(): Item { + return Item(sets[curItem][0]) + } + + private fun doDaMaffBish() { + addItemOrDrop(player, 995, gibMeDaCoinz(curItem)) + removeAll(player, wotItem(), Container.INVENTORY) + if (inBank(player, sets[curItem][0], 1)) { + removeAll(player, wotItem(), Container.BANK) + } + player.skills.addExperience(gibMeDaSkill(curItem), gibMeDaExp(curItem).toDouble()) + } + + private fun gibMeDaCoinz(a: Int): Int { + if (inBank(player, sets[curItem][0], 1)) { + toAddFromBank = amountInBank(player, sets[curItem][0]) + } else { + toAddFromBank = 0 + } + return (player.inventory.getAmount(sets[curItem][0]) * sets[curItem][1]) + (toAddFromBank * sets[curItem][1]) + } + + private fun gibMeDaExp(a: Int): Int { + return sets[curItem][2] + } + private fun gibMeDaSkill(a: Int): Int { + return sets[curItem][3] + } + + override fun newInstance(player: Player?): DialoguePlugin { + return BarlakDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.BARLAK_5828) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/BartakDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/BartakDialogue.kt new file mode 100644 index 000000000..39ce11110 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/BartakDialogue.kt @@ -0,0 +1,44 @@ +package rs09.game.content.dialogue.region.dorgeshuun + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class BartakDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DISTRESSED,"Oh no! What's broken?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player(FacialExpression.ASKING, "What? Nothing's broken?").also { stage++ } + 1 -> npc(FacialExpression.OLD_DISTRESSED, "I'm sorry. I'm just a bit jumpy.").also { stage++ } + 2 -> npcl(FacialExpression.OLD_DISTRESSED, "I'm in charge of all the metalworking of Dorgesh-Kaan. It's a big responsibility!").also { stage++ } + 3 -> npcl(FacialExpression.OLD_DISTRESSED, "If something metal breaks I have to fix it. And lots of things are made of metal!").also { stage++ } + 4 -> player(FacialExpression.FRIENDLY, "Don't worry, I'm sure you're up to the task!").also { stage++ } + 5 -> npc(FacialExpression.OLD_DISTRESSED, "I hope you're right.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return BartakDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.BARTAK_5778) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/CrateGoblinDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/CrateGoblinDialogue.kt new file mode 100644 index 000000000..e1040289c --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/CrateGoblinDialogue.kt @@ -0,0 +1,38 @@ +package rs09.game.content.dialogue.region.dorgeshuun + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class CrateGoblinDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_NORMAL,"Excuse me, I need to deliver this.").also { stage = 99 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return CrateGoblinDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.CRATE_GOBLIN_5784) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/DartogDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/DartogDialogue.kt new file mode 100644 index 000000000..9be60a7df --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/DartogDialogue.kt @@ -0,0 +1,72 @@ +package rs09.game.content.dialogue.region.dorgeshuun + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * todo add teleporting when areas are complete + */ + +@Initializable +class DartogDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_NORMAL,"Hello, surface-dweller.").also { stage = 0 } + return true + } + + private var fr = FacialExpression.FRIENDLY + private var ask = FacialExpression.ASKING + private var nor = FacialExpression.OLD_NORMAL + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage) { + 0 -> options("Who are you?", "Can you show me the way to the mine?", "Can you show me the way to Lumbridge Castle cellar?").also { stage++ } + 1 -> when (buttonId) { + 1 -> player(ask, "Who are you?").also { stage = 10} + 2 -> npcl(nor, "Of course! You're always welcome in our mines!").also { stage = 20 } + 3 -> player(ask, "Can you show me the way to Lumbridge Castle cellar?").also { stage = 50 } + } + + 10 -> npcl(nor, "The council posted me here to guard this new tunnel. I can also give you directions through the tunnels. A hero like you is always welcome in our mines!").also { stage++ } + 11 -> options("Can you show me the way to the mine?", "Can you show me the way to Lumbridge Castle cellar?", "Maybe some other time").also { stage++ } + 12 -> when (buttonId) { + 1 -> player(ask, "Can you show me the way to the mine?").also { stage = 40 } + 2 -> player(ask, "Can you show me the way to Lumbridge Castle cellar?").also { stage = 50 } + 3 -> player(fr, "Maybe some other time.").also { stage = 99 } + } + + 20 -> { + end() + //move player to mine + } + + 40 -> { + npcl(nor, "Of course! You're always welcome in our mines!").also { stage = 99 } + //move player to mine + } + + 50 -> { + npc(nor, "Of course!").also { stage = 99 } + //move to lumby castle celler + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DartogDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.DARTOG_4314) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/DurgokDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/DurgokDialogue.kt new file mode 100644 index 000000000..72807995a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/DurgokDialogue.kt @@ -0,0 +1,54 @@ +package rs09.game.content.dialogue.region.dorgeshuun + +import api.addItemOrDrop +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class DurgokDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npcl(FacialExpression.OLD_NORMAL,"Frogburger! There's nothing like grilled frog in a bun. Do you want one? Only 10gp!").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Yes, please.", "No, thanks.").also { stage++ } + 1 -> when(buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Yes please!").also { stage = 10 } + 2 -> player(FacialExpression.FRIENDLY, "No thanks.").also { stage = 99 } + } + + 10 -> if (player.inventory.contains(Items.COINS_995, 10)) { + player.inventory.remove(Item(Items.COINS_995, 10)) + addItemOrDrop(player, Items.FROGBURGER_10962, 1) + npc(FacialExpression.OLD_NORMAL, "There you go.").also { stage = 99 } + } else { + npc(FacialExpression.OLD_NORMAL, "I'm sorry, but you need 10gp for that.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DurgokDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.DURGOK_5794) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/MistagDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/MistagDialogue.kt similarity index 98% rename from Server/src/main/kotlin/rs09/game/content/dialogue/MistagDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/MistagDialogue.kt index 68be71adb..6fce578b7 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/MistagDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/MistagDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.dorgeshuun import core.game.component.Component import core.game.content.dialogue.DialoguePlugin diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/randomChildrenDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/randomChildrenDialogue.kt new file mode 100644 index 000000000..e14b711af --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dorgeshuun/randomChildrenDialogue.kt @@ -0,0 +1,59 @@ +package rs09.game.content.dialogue.region.dorgeshuun + +import api.toIntArray +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class randomChildrenDialogue(player: Player? = null) : DialoguePlugin(player){ + var a = FacialExpression.OLD_NORMAL + var b = FacialExpression.FRIENDLY + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + when ((1..5).random()) { + 1 -> npc(FacialExpression.OLD_NORMAL, "Are you a surface-dweller?").also { stage = 0 } + 2 -> npcl(a, "Are you " + player.name + "? Did you help Zanik save the city?").also { stage = 10 } + 3 -> npc(a, "Sorry, I'm not meant to talk to strangers.").also { stage = 99 } + 4 -> npc(a, "Shh! Don't tell anyone!").also { stage = 20 } + 5 -> npc(a, "Help! Help! The surface people are attacking!").also { stage = 30 } + } + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player(b, "Yes...").also { stage++ } + 1 -> npcl(a, "Haha! You look funny! All tall and skinny with tiny eyes!").also { stage = 99 } + + 10 -> player(b, "Yes, that was me!").also { stage++ } + 11 -> npcl(a, "When I'm older I'm going to be an adventurer, just like Zanik!").also { stage = 99 } + + 20 -> player(b, "Don't tell anyone what?").also { stage++ } + 21 -> npc(a, "SHHH!").also { stage = 99 } + + 30 -> player(b, "It's alright, I'm friendly!").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return randomChildrenDialogue(player) + } + + val ids = 5807..5822 + + override fun getIds(): IntArray { + return ids.toIntArray() + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/AfrahDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/duelarena/AfrahDialogue.kt similarity index 99% rename from Server/src/main/kotlin/rs09/game/content/dialogue/AfrahDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/duelarena/AfrahDialogue.kt index 94751ca20..38b140f8b 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/AfrahDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/duelarena/AfrahDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.duelarena import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/dwarvenmine/DrogoDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dwarvenmine/DrogoDialogue.kt new file mode 100644 index 000000000..348d642d5 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dwarvenmine/DrogoDialogue.kt @@ -0,0 +1,48 @@ +package rs09.game.content.dialogue.region.dwarvenmine + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class DrogoDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DEFAULT,"'Ello. Welcome to my Mining shop, friend.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Do you want to trade?", "Hello, shorty.", "Why don't you ever restock ores and bars?").also { stage++ } + 1 -> when (buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Do you want to trade?").also { stage = 10 } + 2 -> player(FacialExpression.FRIENDLY, "Hello, shorty.").also { stage = 20 } + 3 -> player(FacialExpression.FRIENDLY, "Why don't you ever restock ores and bars?").also { stage = 30 } + } + + 10 -> end().also { npc.openShop(player) } + 20 -> npc(FacialExpression.OLD_ANGRY1,"I may be short, but at least I've got manners.").also { stage = 99 } + 30 -> npc(FacialExpression.OLD_DEFAULT,"The only ores and bars I sell are those sold to me.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DrogoDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.DROGO_DWARF_579) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/dwarvenmine/DwarvenMineGuardDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dwarvenmine/DwarvenMineGuardDialogue.kt new file mode 100644 index 000000000..1dfb77367 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dwarvenmine/DwarvenMineGuardDialogue.kt @@ -0,0 +1,44 @@ +package rs09.game.content.dialogue.region.dwarvenmine + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class DwarvenMineGuardDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.OLD_ANGRY1, "Don't distract me while I'm on duty! This mine has to be protected!").also { stage++ } + 1 -> player(FacialExpression.FRIENDLY, "What's going to attack a mine?").also { stage++ } + 2 -> npcl(FacialExpression.OLD_ANGRY1, "Goblins! They wander everywhere, attacking anyone they think is small enough to be an easy victim. We need more cannons to fight them off properly.").also { stage++ } + 3 -> player(FacialExpression.FRIENDLY, "Well, I've done my bit to help with that.").also { stage++ } + 4 -> npcl(FacialExpression.OLD_ANGRY1, "Yes, I heard. Now please let me get on with my guard duties.").also { stage++ } + 5 -> player(FacialExpression.FRIENDLY, "Alright, I'll leave you alone now.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DwarvenMineGuardDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.GUARD_206) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/dwarvenmine/NurmofDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dwarvenmine/NurmofDialogue.kt new file mode 100644 index 000000000..17a6b44f3 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/dwarvenmine/NurmofDialogue.kt @@ -0,0 +1,47 @@ +package rs09.game.content.dialogue.region.dwarvenmine + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class NurmofDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npcl(FacialExpression.OLD_NORMAL,"Greetings and welcome to my pickaxe shop. Do you want to buy my premium quality pickaxes?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Yes, please.", "No, thank you.", "Are your pickaxes better than other pickaxes, then?").also { stage++ } + + 1 -> when (buttonId) { + 1 -> end().also { npc.openShop(player) } + 2 -> player(FacialExpression.FRIENDLY, "No thank you.").also { stage = 99 } + 3 -> player(FacialExpression.HALF_ASKING, "Are your pickaxes better than other pickaxes, then?").also { stage = 10 } + } + + 10 -> npcl(FacialExpression.OLD_NORMAL,"Of course they are! My pickaxes are made of higher grade metal than your ordinary bronze pickaxes, allowing you to mine ore just that little bit faster.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return NurmofDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.NURMOF_594) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/BrotherBordissDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/edgeville/BrotherBordissDialogue.kt similarity index 98% rename from Server/src/main/kotlin/rs09/game/content/dialogue/BrotherBordissDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/edgeville/BrotherBordissDialogue.kt index 4e15312f4..ff4ce3520 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/BrotherBordissDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/edgeville/BrotherBordissDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.edgeville import core.game.component.Component import core.game.content.dialogue.DialoguePlugin diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/entrana/HighPriestEntranaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/entrana/HighPriestEntranaDialogue.kt new file mode 100644 index 000000000..5237798a3 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/entrana/HighPriestEntranaDialogue.kt @@ -0,0 +1,68 @@ +package rs09.game.content.dialogue.region.entrana + +import api.addItemOrDrop +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class HighPriestEntranaDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + if (!player.questRepository.isComplete("Heroes' Quest")) { + npc(FacialExpression.FRIENDLY, "Many greetings. Welcome to our fair island.").also { stage = 10 } + } else { + options("Have you seen a pair of ice gloves?", "Ask about Entrana").also { stage = 5 } + } + + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> npcl(FacialExpression.FRIENDLY, "and devoted the island to those who wish peace for the world.").also { stage++ } + 2 -> npcl(FacialExpression.FRIENDLY, "The inhabitants of this island are mostly monks who spend their time meditating on Saradomin's ways.").also { stage++ } + 3 -> npcl(FacialExpression.FRIENDLY, "Of course, there are now more pilgrims to this holy site, since Saradomin defeated Zamorak in the battle of Lumbridge. It is good that so many see Saradomin's true glory!").also { stage = 99 } + + 5 -> when (buttonId) { + 1 -> npcl(FacialExpression.FRIENDLY, "By which you mean the pair of mythical gloves you stole from the cold dead body of the Queen of the Ice?").also { stage = 20 } + 2 -> npcl(FacialExpression.FRIENDLY,"You are standing on the holy island of Entrana. It was here that Saradomin first stepped upon Gielinor. In homage to Saradomin's first arrival, we have built a great church,").also { stage = 1 } + } + + 10 -> npc(FacialExpression.FRIENDLY, "Enjoy our stay here. May it be spiritually uplifting!").also { stage = 99 } + + 20 -> player(FacialExpression.SUSPICIOUS, "Er...").also { stage++ } + 21 -> npcl(FacialExpression.ANNOYED, "The gloves that you acquired to aid you in plucking the Entranan firebird? Another victim of your murderous nature, I should add.").also { stage++ } + 22 -> npcl(FacialExpression.ANNOYED, "The ice gloves that, from context, I would assume you have lost, if not carelessly discarded?").also { stage++ } + + 23 -> player(FacialExpression.FRIENDLY, "Those ice gloves, yes.").also { stage++ } + 24 -> sendDialogue("The high priest of Entrana shivers as he hands you your lost ice gloves.").also { + addItemOrDrop(player, Items.ICE_GLOVES_1580, 1) + stage++ + } + 25 -> npcl(FacialExpression.ANNOYED, "One of my monks found these gloves. If only to spare this world from further carnage, I return them to you.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return HighPriestEntranaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.HIGH_PRIEST_216) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/entrana/MazionDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/entrana/MazionDialogue.kt new file mode 100644 index 000000000..d9547acb9 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/entrana/MazionDialogue.kt @@ -0,0 +1,41 @@ +package rs09.game.content.dialogue.region.entrana + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class MazionDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + when ((1..3).random()) { + 1 -> npc(FacialExpression.FRIENDLY, "Nice weather we're having today!").also { stage = 99 } + 2 -> npc(FacialExpression.FRIENDLY, "Hello " + player.name + ", fine day today!").also { stage = 99 } + 3 -> npc(FacialExpression.ANNOYED, "Please leave me alone, a parrot stole my banana.").also { stage = 99 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return MazionDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.MAZION_3114) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/examcentre/ArchaeologistcalExpertUsedOnDialogueFile.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/examcentre/ArchaeologistcalExpertUsedOnDialogueFile.kt new file mode 100644 index 000000000..5dffe09e2 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/examcentre/ArchaeologistcalExpertUsedOnDialogueFile.kt @@ -0,0 +1,126 @@ +package rs09.game.content.dialogue.region.examcentre + +import api.addItemOrDrop +import api.sendDialogue +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.item.Item +import org.rs09.consts.Items +import rs09.game.content.dialogue.DialogueFile +import rs09.game.interaction.item.withnpc.ArchaeologicalExpertListener + +/** + * @author qmqz + */ + +class ArchaeologistcalExpertUsedOnDialogueFile(val it: Int) : DialogueFile() { + + var i = ArchaeologicalExpertListener() + var n = NPC(i.archy) + var itemUsed = it + + override fun handle(interfaceId: Int, buttonId: Int) { + + npc = n + + when (stage) { + + 0 -> when (itemUsed) { + i.staff -> player(FacialExpression.ASKING, "What do you think of this?").also { stage = 100 } + + i.unidentifiedLiquid -> { + replaceAll(i.unidentifiedLiquid, i.nitroglycerin) + npcl(FacialExpression.WORRIED, "This is a VERY dangerous liquid called nitroglycerin. Be careful how you handle it. Don't drop it or it will explode!").also { stage = 99 } + } + + i.nitroglycerin -> player(FacialExpression.ASKING, "Can you tell me any more about this?").also { stage = 110} + i.ammoniumNitrate -> player(FacialExpression.ASKING, "Have a look at this.").also { stage = 120 } + i.nuggets -> player(FacialExpression.ASKING, "I have these gold nuggets...").also { stage = 130 } + i.needle -> player(FacialExpression.NEUTRAL, "I found a needle.").also { stage = 140 } + i.rottenApple -> player(FacialExpression.SAD, "I found these...").also { stage = 150 } + i.brokenGlass -> player(FacialExpression.NEUTRAL, "Have a look at this glass.").also { stage = 160 } + i.brokenArrow -> player(FacialExpression.FRIENDLY, "Have a look at this arrow.").also { stage = 170 } + i.panningTray -> { + if (player!!.inventory.contains(Items.PANNING_TRAY_677,1)) { + npc(FacialExpression.NEUTRAL, "I have no need for panning trays!").also { stage = 99 } + } + if (player!!.inventory.contains(Items.PANNING_TRAY_678,1) || player!!.inventory.contains(Items.PANNING_TRAY_679,1)) { + npc(FacialExpression.NEUTRAL, "Have you searched this tray yet?").also { stage = 180 } + } + } + i.bones -> player(FacialExpression.FRIENDLY, "Have a look at these bones.").also { stage = 190 } + i.buttons -> player(FacialExpression.FRIENDLY, "I found these buttons.").also { stage = 200 } + i.crackedSample -> player(FacialExpression.WORRIED, "I found this rock...").also { stage = 210 } + i.oldTooth -> player(FacialExpression.FRIENDLY, "Hey look at this.").also { stage = 220 } + i.rustySword -> player(FacialExpression.FRIENDLY, "I found an old sword.").also { stage = 230 } + i.brokenStaff -> player(FacialExpression.ASKING, "Have a look at this staff.").also { stage = 240 } + i.brokenArmour -> player(FacialExpression.ASKING, "I found some armour.").also { stage = 250 } + i.damagedArmour -> player(FacialExpression.THINKING, "I found some old armour.").also { stage = 260 } + i.ceramicRemains -> player(FacialExpression.FRIENDLY, "I found some pottery pieces.").also { stage = 270 } + i.beltBuckle -> player(FacialExpression.ASKING, "Have a look at this unusual item...").also { stage = 280 } + i.animalSkull -> player(FacialExpression.FRIENDLY, "Have a look at this.").also { stage = 290 } + i.specialCup -> player(FacialExpression.FRIENDLY, "Have a look at this.").also { stage = 300 } + i.teddy -> player(FacialExpression.FRIENDLY, "Have a look at this.").also { stage = 310 } + i.stoneTablet -> player(FacialExpression.FRIENDLY, "Have a look at this.").also { stage = 320 } + else -> npcl(FacialExpression.FRIENDLY, "I don't think that has any archaeological significance").also { stage = 99 } + } + + + 100 -> npcl(FacialExpression.AMAZED, "That staff is incredible! It's the same symbol that was on that talisman you found here. Does this mean you've found out more about Zaros?").also { stage++ } + + 101 -> playerl( + FacialExpression.FRIENDLY, "I found out that he was banished, and that the people's hero was trapped in a pyramid and...").also { stage++ } + 102 -> npcl(FacialExpression.THINKING, "So you're the one who found out about that. I've heard the story from my friends in the museum. Well done on being able to wield such an impressive symbol.").also { stage++ } + 103 -> npc(FacialExpression.FRIENDLY, "Anyway....").also { stage = 99 } // 500 will be digsite dialog + + 110 -> npcl(FacialExpression.WORRIED, "Nitroglycerin! This is a dangerous substance. This is normally mixed with other chemicals to produce a potent compound.").also { stage++ } + 111 -> npcl(FacialExpression.WORRIED, "Be sure not to drop it! That stuff is highly volatile...").also { stage = 99 } + + 120 -> npcl(FacialExpression.WORRIED, "Really, you do find the most unusual items. I know what this is - it's a strong chemical called ammonium nitrate. Why you want this I'll never know...").also { stage = 99 } + 130 -> { + if (player!!.inventory.getAmount(i.nuggets) >= 3) { + player!!.inventory.remove(Item(i.nuggets, 3)) + addItemOrDrop(player!!, Items.GOLD_ORE_444, 1) + npcl(FacialExpression.FRIENDLY, "Good – that's three; I can exchange them for normal gold now. You can get this refined and make a profit!").also { stage = 131 } + } else if (player!!.inventory.getAmount(i.nuggets) < 3) { + npcl(FacialExpression.FRIENDLY, "I can't do much with these nuggets yet. Come back when you have 3 and I will exchange them for you.").also { stage = 99 } + } + } + 131 -> player(FacialExpression.FRIENDLY, "Excellent!").also { stage = 99 } + 140 -> npcl(FacialExpression.LAUGH, "Hmm, yes; I wondered why this race were so well dressed! It looks like they had mastery of needlework.").also { stage = 99 } + 150 -> npc(FacialExpression.DISGUSTED, "Ew! Throw them away this instant!").also { stage = 99 } + 160 -> npcl(FacialExpression.NEUTRAL, "Hey you should be careful of that. It might cut your fingers, throw it away!").also { stage = 99 } + 170 -> npcl(FacialExpression.AMAZED, "No doubt this arrow was shot by a strong warrior – it's split in half! It is not a valuable object though.").also { stage = 99 } + 180 -> player(FacialExpression.THINKING, "Not that I remember...").also { stage++ } + 181 -> npcl(FacialExpression.DISGUSTED, "It may contain something; I don't want to get my hands dirty.").also { stage++ } + 182 -> sendDialogue(player!!,"The expert hands the tray back to you.").also { stage = 99 } + 190 -> npcl(FacialExpression.FRIENDLY, "Ah, yes – a fine bone example... no noticeable fractures... and in good condition. These are common cow bones, however; they have no archaeological value.").also { stage = 99 } + 200 -> npcl(FacialExpression.THINKING, "Let's have a look. Ah, I think these are from the nobility, perhaps a royal servant?").also { stage = 99 } + 210 -> npcl(FacialExpression.THINKING, "What a shame it's cracked; this looks like it would have been a good sample.").also { stage = 99 } + 220 -> npcl(FacialExpression.LAUGH, "Oh, an old tooth. It looks like it has come from a mighty being. Pity there are no tooth fairies around here!").also { stage = 99 } + 230 -> npcl(FacialExpression.THINKING, "Oh, it's very rusty isn't it? I'm not sure this sword belongs here, it looks very out of place.").also { stage = 99 } + 240 -> npcl(FacialExpression.HALF_THINKING, "Look at this... Interesting... This appears to belong to a cleric of some kind; certainly not a follower of Saradomin, however.").also { stage++ } + 241 -> npcl(FacialExpression.THINKING, "I wonder if there was another civilization here before the Saradominists?").also { stage = 99 } + 250 -> npcl(FacialExpression.AMAZED, "It looks like the wearer of this fought a mighty battle.").also { stage = 99 } + 260 -> npcl(FacialExpression.THINKING, "How unusual. This armour doesn't seem to match with the other finds. Keep looking.").also { stage = 99 } + 270 -> npcl(FacialExpression.FRIENDLY, "Yes, many parts are discovered. The inhabitants of these parts were great potters.").also { stage++ } + 271 -> player(FacialExpression.ASKING, "You mean they were good at using potions?").also { stage++ } + 272 -> npcl(FacialExpression.LAUGH, "No, no, silly. They were known for their skill with clay.").also { stage = 99 } + 280 -> npcl(FacialExpression.THINKING, "Let me see. This is a belt buckle. Not so unusual - I should imagine it came from a guard.").also { stage = 99 } + 290 -> npcl(FacialExpression.THINKING, "Hmm, an interesting find; an animal skull for sure. Another student found one just like this today.").also { stage = 99 } + 300 -> npcl(FacialExpression.THINKING, "Looks like an award cup for some small find. Perhaps it belongs to one of the students?").also { stage = 99 } + 310 -> npcl(FacialExpression.LAUGH, "Why, it looks like a teddy bear to me. Perhaps someone's lucky mascot!").also { stage = 99 } + 320 -> npcl(FacialExpression.NEUTRAL, "I don't need another tablet! One is enough, thank you.").also { stage = 99 } + + 99 -> end() + } + } + + fun replaceAll(originalItem: Int, newItem: Int) { + for (a in 0..player!!.inventory.getAmount(originalItem)) { + if (player!!.inventory.contains(originalItem, 1)) { + player!!.inventory.replace(Item(newItem), player!!.inventory.getSlot(Item(originalItem))) + } + } + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/AmbassadorSpanfippleDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/AmbassadorSpanfippleDialogue.kt new file mode 100644 index 000000000..109bf3597 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/AmbassadorSpanfippleDialogue.kt @@ -0,0 +1,62 @@ +package rs09.game.content.dialogue.region.falador + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + + +/** + * @author qmqz + */ + +@Initializable +class AmbassadorSpanfippleDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DEFAULT,"It's all very white round here, isn't it?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + player(FacialExpression.THINKING, "Well, it is the White Knights' Castle.").also { stage++ } + } + + 1 -> { + npcl(FacialExpression.OLD_DEFAULT, "I think it would all look better in pink. At least then I wouldn't be squinting all the time.").also { stage++ } + } + + 2 -> { + playerl(FacialExpression.FRIENDLY, "Yes, but then they'd have to become the Pink Knights. I think they'd have problems recruiting then.").also { stage++ } + } + + 3 -> { + npc(FacialExpression.OLD_DEFAULT, "You're probably right. Maybe brown, then.").also { stage++ } + } + + 4 -> { + player(FacialExpression.HALF_THINKING, "I think that may be worse...").also { stage++ } + } + + 5 -> { + npc(FacialExpression.OLD_ANGRY1, "Bah, humans have no sense of style...").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AmbassadorSpanfippleDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.AMBASSADOR_SPANFIPPLE_4581) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/ApprenticeWorkmanDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/ApprenticeWorkmanDialogue.kt new file mode 100644 index 000000000..197313549 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/ApprenticeWorkmanDialogue.kt @@ -0,0 +1,64 @@ +package rs09.game.content.dialogue.region.falador + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class ApprenticeWorkmanDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hiya.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + npc(FacialExpression.FRIENDLY, "Sorry, I haven't got time to chat.", + "We've only just finished a collossal order of furniture", + "for the Varrock area, and already there's more work", + "coming in.").also { stage++ } + } + + 1 -> { + player(FacialExpression.ASKING, "Varrock?").also { stage++ } + } + + 2 -> { + npc(FacialExpression.FRIENDLY, "Yeah, the Council's had it redecorated.").also { stage++ } + } + + 3 -> { + npc(3236, "Oi - stop gabbing and get that chair finished!").also { stage++ } + } + + 4 -> { + npc(FacialExpression.FRIENDLY, "You'd better let me get on with my work.").also { stage++ } + } + + 5 -> { + player(FacialExpression.FRIENDLY, "Ok, bye.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ApprenticeWorkmanDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.APPRENTICE_WORKMAN_3235) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/DrunkenManDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/DrunkenManDialogue.kt new file mode 100644 index 000000000..14c9f0cfc --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/DrunkenManDialogue.kt @@ -0,0 +1,66 @@ +package rs09.game.content.dialogue.region.falador + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class DrunkenManDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + npc(FacialExpression.DRUNK, "... whassup?").also { stage++ } + } + + 1 -> { + player(FacialExpression.ASKING, "Are you alright?").also { stage++ } + } + + 2 -> { + npc(FacialExpression.DRUNK, "... see... two of you... why there two of you?").also { stage++ } + } + + 3 -> { + player(FacialExpression.FRIENDLY, "There's only one of me, friend.").also { stage++ } + } + + 4 -> { + npc(FacialExpression.DRUNK, "... no, two of you... you can't count...", + "... maybe you drunk too much...").also { stage++ } + } + + 5 -> { + player(FacialExpression.FRIENDLY, "Whatever you say, friend.").also { stage++ } + } + + 6 -> { + npc(FacialExpression.DRUNK, "... giant hairy cabbages...").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DrunkenManDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.DRUNKEN_MAN_3222) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/WorkmanDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/WorkmanDialogue.kt new file mode 100644 index 000000000..9f0391343 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/WorkmanDialogue.kt @@ -0,0 +1,49 @@ +package rs09.game.content.dialogue.region.falador + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs.WORKMAN_3236 + +/** + * @author qmqz + */ + +@Initializable +class WorkmanDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hiya.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + npc(FacialExpression.ASKING, "What do you want? I've got work to do!").also { stage++ } + } + + 1 -> { + player(FacialExpression.ASKING, "Can you teach me anything?").also { stage++ } + } + + 2 -> { + npcl(FacialExpression.ANNOYED, "No - I've got one lousy apprentice already, and that's quite enough hassle! Go away!").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return WorkmanDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(WORKMAN_3236) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/WysonTheGardenerDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/WysonTheGardenerDialogue.kt similarity index 99% rename from Server/src/main/kotlin/rs09/game/content/dialogue/WysonTheGardenerDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/WysonTheGardenerDialogue.kt index 67ae46595..8d9478ac1 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/WysonTheGardenerDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/falador/WysonTheGardenerDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.falador import core.game.content.dialogue.DialoguePlugin import core.game.content.global.BirdNest diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/AluftGianneJrDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/grandtree/AluftGianneJrDialogue.kt similarity index 96% rename from Server/src/main/kotlin/rs09/game/content/dialogue/AluftGianneJrDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/grandtree/AluftGianneJrDialogue.kt index 27eb8a084..cc586fe23 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/AluftGianneJrDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/grandtree/AluftGianneJrDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.grandtree import core.game.component.Component import core.game.content.dialogue.DialoguePlugin diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/AluftGianneSnrDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/grandtree/AluftGianneSnrDialogue.kt similarity index 99% rename from Server/src/main/kotlin/rs09/game/content/dialogue/AluftGianneSnrDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/grandtree/AluftGianneSnrDialogue.kt index 6d57baf8c..dc004249d 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/AluftGianneSnrDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/grandtree/AluftGianneSnrDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.grandtree import core.game.component.Component import core.game.content.dialogue.DialoguePlugin diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/BlurberryDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/grandtree/BlurberryDialogue.kt similarity index 98% rename from Server/src/main/kotlin/rs09/game/content/dialogue/BlurberryDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/grandtree/BlurberryDialogue.kt index c4125ca62..c81c6aa0c 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/BlurberryDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/grandtree/BlurberryDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.grandtree import core.game.content.dialogue.DialoguePlugin import core.game.node.entity.player.Player diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/hamdungeon/JimmyTheChiselDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/hamdungeon/JimmyTheChiselDialogue.kt new file mode 100644 index 000000000..c0ba7cdf2 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/hamdungeon/JimmyTheChiselDialogue.kt @@ -0,0 +1,38 @@ +package rs09.game.content.dialogue.region.hamdungeon + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * todo char quest description osrs and rs3 doesn't match, but there isn't any for rs3 yet + */ + +@Initializable +class JimmyTheChiselDialogue(player: Player? = null) : DialoguePlugin(player) { + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Hello mate!").also { stage = 99 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return JimmyTheChiselDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.JIMMY_THE_CHISEL_1718) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/AchiettiesDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/heroesguild/AchiettiesDialogue.kt similarity index 94% rename from Server/src/main/kotlin/rs09/game/content/dialogue/AchiettiesDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/heroesguild/AchiettiesDialogue.kt index 63344b3b7..b9d11a824 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/AchiettiesDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/heroesguild/AchiettiesDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.heroesguild import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/ElfTrackerDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/ElfTrackerDialogue.kt new file mode 100644 index 000000000..90cd5c55b --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/ElfTrackerDialogue.kt @@ -0,0 +1,89 @@ +package rs09.game.content.dialogue.region.isafdar + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class ElfTrackerDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + //todo check if found tracks or not + //temporary booly boi + var tracksFound = false + if (!tracksFound) { + player(FacialExpression.FRIENDLY, "Hello.").also { stage = 0 } + } else { + playerl(FacialExpression.NEUTRAL, "I've found tracks leading off to the west. But they trail off into the trees. Beyond that I am unable to follow.").also { stage = 30} + } + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.SUSPICIOUS, "Human! You must be one of Tyras's men...").also { stage++ } + 1 -> playerl(FacialExpression.HALF_GUILTY, "No, I'm " + player.name + "! Lord Iorwerth said you might be able to help me.").also { stage++ } + 2 -> npc(FacialExpression.SUSPICIOUS, "And you have something to prove this?").also { stage++ } + 3 -> { + //todo check quest stages whenever it's added + if (player.inventory.contains(Items.CRYSTAL_PENDANT_3208, 1) || player.equipment.contains(Items.CRYSTAL_PENDANT_3208, 1)) { + sendDialogue("You show the tracker the crystal pendant.").also { stage = 20 } + } else { + player(FacialExpression.HALF_GUILTY, "Well... Err... No.").also { stage = 10 } + } + } + 10 -> npcl(FacialExpression.ANNOYED, "As I was saying... I have no time for brigands or outlaws.").also { stage = 99 } + + 20 -> npcl(FacialExpression.FRIENDLY, "That is Lord Iorwerth's pendant. He must have a lot of faith in you. Now, what is it I can help you with?").also { stage ++ } + 21 -> playerl(FacialExpression.ASKING, "I need to find Tyras and kill him. Do you know where his camp is?").also { stage++ } + 22 -> npcl(FacialExpression.FRIENDLY, "Well this was his old camp. After the battle a few days ago they moved. We're yet to find them again.").also { stage++ } + 23 -> player(FacialExpression.ASKING, "Can I help at all?").also { stage++ } + 24 -> npcl(FacialExpression.FRIENDLY, "As it goes I'm not actually tracking them at the moment. I'm currently trying to trace our renegade brethen instead. This here is the best lead we've found so far.").also { stage++ } + 25 -> player(FacialExpression.HALF_ASKING, "What is?").also { stage++ } + 26 -> npc(FacialExpression.THINKING, "Ahh I guess you can't see it with those human eyes.").also { stage++ } + 27 -> npcl(FacialExpression.THINKING, "I tell you what. Now that you're here I may as well give you a hand. I'll search here on the east side. You check out the west end of the camp.").also { stage++ } + 28 -> npc(FacialExpression.THINKING, "Come and tell me if you find anything.").also { stage = 99 } + + //todo after finding the tracks + 30 -> npcl(FacialExpression.THINKING, "These forests aren't always as dense as you'd think. If you look closer, you might see ways that you can get through. With that in mind, why don't you give it another go?").also { stage++ } + 31 -> player(FacialExpression.ANNOYED, "Thanks... I'll see what I can find.").also { stage = 99 } + + //todo after searching past the dense forest + 40 -> player(FacialExpression.FRIENDLY, "Hello.").also { stage++ } + 41 -> npc(FacialExpression.FRIENDLY, "How goes the hunt for that bandit camp?").also { stage++ } + 42 -> { + //todo (If the camp has not been found) + //temporary booly bois + var campFound = false + if (!campFound) { + player(FacialExpression.FRIENDLY, "Getting there.").also { stage = 99 } + } else { + player(FacialExpression.NEUTRAL, "I found it a short distance west of here.").also { stage++ } + } + } + 43 -> npcl(FacialExpression.FRIENDLY, "I'm sure Lord Iorwerth will be pleased to hear that. You should let him know.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ElfTrackerDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ELF_TRACKER_1199) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/IlfeenDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/IlfeenDialogue.kt new file mode 100644 index 000000000..9e1ecc8a0 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/IlfeenDialogue.kt @@ -0,0 +1,78 @@ +package rs09.game.content.dialogue.region.isafdar + +import api.addItemOrDrop +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class IlfeenDialogue(player: Player? = null) : DialoguePlugin(player){ + + //temp var + var queststage = 0 + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + //todo choose dialogue tree based off of quest stage + when(queststage) { + 0 -> npcl(FacialExpression.FRIENDLY,"Good day, what are you doing all the way out here?").also { stage = 0 } + 1 -> playerl(FacialExpression.ASKING, "There is something I meant to ask you about. Do you remember Oaknock? He was a gnome inventor.").also { stage = 10 } + 2 -> player(FacialExpression.FRIENDLY, "Hello again. Are you still offering to chant seeds?").also { stage = 20 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> playerl(FacialExpression.FRIENDLY, "I'm just wandering, it's a lovely day for a walk in the woods.").also { stage++ } + 1 -> npc(FacialExpression.FRIENDLY, "It is that.").also { stage++ } + 2 -> player(FacialExpression.FRIENDLY, "Well I shouldn't keep you, see you later.").also { stage++ } + 3 -> npc(FacialExpression.FRIENDLY, "Bye.").also { stage = 99 } + + 10 -> npcl(FacialExpression.HAPPY, "Of course! I remember him from when I was living in the eastern lands. He was just a budding engineer then. I rather liked the young gnome: he was rather loud, but he had a good soul.").also { stage++ } + 11 -> npcl(FacialExpression.HAPPY, "He was very interested in elven magic. Last time we spoke, not too long ago, he was very interested in illusion magic and how to dispel it. I gave him some advice and a few pieces of equipment to help him.").also { stage++ } + 12 -> playerl(FacialExpression.THINKING, "I think Oaknock died of old age a few hundred years ago now.").also { stage++ } + 13 -> npcl(FacialExpression.HALF_GUILTY, "I keep forgetting, a hundred years is a long time for you.").also { stage++ } + 14 -> player(FacialExpression.ASKING, "Did you ever give him a seed?").also { stage++ } + 15 -> npcl(FacialExpression.FRIENDLY, "Of course. It grew into a saw. I hope he found it useful.").also { stage++ } + 16 -> player(FacialExpression.FRIENDLY, "I think he did! Thanks.").also { stage++ } + 17 -> sendDialogue("Ilfeen smiles serenely.").also { stage = 99 } + + 20 -> npcl(FacialExpression.ASKING, "I am, but you’ll need your own seed. I can also chant your shield or bow back to full charges if you have it with you. Would you like me to enchant anything?").also { stage++ } + 21 -> npcl(FacialExpression.ASKING, "Or I could give you a book about crystal singing?").also { stage++ } + 22 -> options ("Enchant something.", "Crystal singing book.", "Nothing, thanks.").also { stage++ } + 23 -> when (buttonId) { + //1 -> todo opens interface for enchanting + 2 -> player(FacialExpression.ASKING, "Could I have the book, please?").also { stage = 40 } + 3 -> npc(FacialExpression.FRIENDLY, "Well, good luck.").also { stage = 43 } + } + + 40 -> { + addItemOrDrop(player, Items.CRYSTAL_OF_SEREN_4313, 1) + sendDialogue("Ilfeen hands you a book.").also { stage++ } + } + 41 -> player(FacialExpression.FRIENDLY, "Thanks, I'll read all about it.").also { stage++ } + 42 -> npc(FacialExpression.FRIENDLY, "Well, good luck.").also { stage++ } + 43 -> player(FacialExpression.FRIENDLY, "Goodbye, Ilfeen.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return IlfeenDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ILFEEN_1777) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/TyrasGuard.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/TyrasGuard.kt new file mode 100644 index 000000000..2502b49d5 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/TyrasGuard.kt @@ -0,0 +1,57 @@ +package rs09.game.content.dialogue.region.isafdar + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class TyrasGuard(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"What is it?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("What's going on around here?", "Do you know what's south of here?", "I'll leave you alone.").also { stage++ } + 1 -> when (buttonId) { + 1 -> player(FacialExpression.ASKING, "What's going on around here?").also { stage = 10 } + 2 -> player(FacialExpression.ASKING, "Do you know what's south of here?").also { stage = 20 } + 3 -> player(FacialExpression.NEUTRAL, "I'll leave you alone.").also { stage = 99 } + } + + 10 -> npcl(FacialExpression.NEUTRAL, "Sorry, I shouldn't give out sensitive information to civilians. You should go to General Hining, in the camp along the road.").also { stage++ } + 11 -> options("Do you know what's south of here?", "Okay, thanks.").also { stage++ } + 12 -> when (buttonId) { + 1 -> player(FacialExpression.ASKING, "Do you know what's south of here?").also { stage = 20 } + 2 -> player(FacialExpression.NEUTRAL, "Ok, thanks.").also { stage = 99 } + } + + 20 -> npcl(FacialExpression.NEUTRAL, "No. We sent a scouting party in that direction, when we first established our camp. Some of the men got lost in the swamps. Eventually we listed them as dead.").also { stage++ } + 21 -> npcl(FacialExpression.NEUTRAL, "Then suddenly they returned, with a wild gleam in their eyes, raving about gods and snakes and all kinds of madness.").also { stage++ } + 22 -> npcl(FacialExpression.NEUTRAL, "We had to drive them out, in case their condition infected the rest of the troops. Their wives will be given a full widow pension when we return home.").also { stage++ } + 23 -> npcl(FacialExpression.NEUTRAL, "General Hining concluded that, whatever is down there, it's not affiliated with any of the elf factions, and it should be left alone.").also { stage++ } + 24 -> player(FacialExpression.FRIENDLY, "Thank you.").also { stage = 0 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return TyrasGuard(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.TYRAS_GUARD_1203) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/TyrasGuardTent.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/TyrasGuardTent.kt new file mode 100644 index 000000000..2ce812926 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/isafdar/TyrasGuardTent.kt @@ -0,0 +1,39 @@ +package rs09.game.content.dialogue.region.isafdar + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class TyrasGuardTent(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.NEUTRAL,"Sorry, can't stop to talk. You should go to General Hining if you need something.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return TyrasGuardTent(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.TYRAS_GUARD_1206) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/AgmundiDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/keldagrim/AgmundiDialogue.kt similarity index 70% rename from Server/src/main/kotlin/rs09/game/content/dialogue/AgmundiDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/keldagrim/AgmundiDialogue.kt index a3878c4ea..852662ec8 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/AgmundiDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/keldagrim/AgmundiDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.keldagrim import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression @@ -23,33 +23,33 @@ class AgmundiDialogue(player: Player? = null) : DialoguePlugin(player){ override fun handle(interfaceId: Int, buttonId: Int): Boolean { when(stage){ 0 -> player(FacialExpression.ASKING, "Oh, do you get humans here often?").also { stage++ } - 1 -> npc(FacialExpression.CHILD_SUSPICIOUS, "Not that often, no, but sometimes.").also { stage++ } - 2 -> npc(FacialExpression.CHILD_THINKING, "Of course, since you people are too big for dwarven", + 1 -> npc(FacialExpression.OLD_NORMAL, "Not that often, no, but sometimes.").also { stage++ } + 2 -> npc(FacialExpression.OLD_NORMAL, "Of course, since you people are too big for dwarven", "clothes, they typically don't stay very long.").also { stage++ } 3 -> player(FacialExpression.SUSPICIOUS, "Why don't you make bigger clothes then?").also { stage++ } - 4 -> npc(FacialExpression.CHILD_GUILTY, "What'd be the point? Besides, I don't make", "these clothes myself.").also { stage++ } + 4 -> npc(FacialExpression.OLD_NOT_INTERESTED, "What'd be the point? Besides, I don't make", "these clothes myself.").also { stage++ } 5 -> options ("Who makes these clothes then?", "I still want to buy your clothes.", "So do you have any quests for me?").also { stage++ } 6 -> when(buttonId){ 1 -> player(FacialExpression.GUILTY, "Who makes the clothes then?").also { stage = 10 } 2 -> npc.openShop(player) - 3 -> npc(FacialExpression.CHILD_SUSPICIOUS,"Quests? Why would I have any quests?").also { stage = 20 } + 3 -> npc(FacialExpression.OLD_NOT_INTERESTED,"Quests? Why would I have any quests?").also { stage = 20 } } - 10 -> npc(FacialExpression.CHILD_NORMAL,"Oh, my sister, she lives in Keldagrim-East.", + 10 -> npc(FacialExpression.OLD_DEFAULT,"Oh, my sister, she lives in Keldagrim-East.", "Has a little stall on the other side of", "the Kelda.").also { stage++ } - 11 -> npc(FacialExpression.CHILD_NORMAL,"If she only worked a little harder, like me,", + 11 -> npc(FacialExpression.OLD_DEFAULT,"If she only worked a little harder, like me,", "she wouldn't have to live in the sewers of the city.", "Shame really.").also { stage++ } 12 -> player("The sewers? Your sister lives in the sewers?").also { stage++ } - 13 -> npc(FacialExpression.CHILD_SAD,"Keldagrim-East, such a ghastly place.", + 13 -> npc(FacialExpression.OLD_SAD,"Keldagrim-East, such a ghastly place.", "Not civil, polite and clean like we are in the West.").also { stage++ } 14 -> player(FacialExpression.SUSPICIOUS, "Uh-huh.").also { stage=99 } 20 -> player("Oh, just anything to do would be fine.").also { stage++ } - 21 -> npc(FacialExpression.CHILD_NORMAL,"No, not right now... maybe I'll have something", + 21 -> npc(FacialExpression.OLD_NOT_INTERESTED,"No, not right now... maybe I'll have something", "for you to do later, but nothing at the moment.").also { stage = 99 } 99 -> end() diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/keldagrim/InnKeeperDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/keldagrim/InnKeeperDialogue.kt new file mode 100644 index 000000000..c28cc82c2 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/keldagrim/InnKeeperDialogue.kt @@ -0,0 +1,57 @@ +package rs09.game.content.dialogue.region.keldagrim + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class InnKeeperDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + npc(FacialExpression.CHILD_NEUTRAL, "Welcome to the King's Axe inn!", "What can I help you with?").also { stage++ } + } + + 1 -> { + player(FacialExpression.ASKING, "Can I have some beer please?").also { stage++ } + } + + 2 -> { + npc(FacialExpression.CHILD_NORMAL, "Go to the bar downstairs.", "I only deal with residents.").also { stage++ } + } + + 3 -> { + player(FacialExpression.THINKING, "Residents? People live here?").also { stage++ } + } + + 4 -> { + npc(FacialExpression.CHILD_LOUDLY_LAUGHING, "No, just guests that stay the night.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return InnKeeperDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.INN_KEEPER_2177) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/keldagrim/NolarDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/keldagrim/NolarDialogue.kt new file mode 100644 index 000000000..950b81ae4 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/keldagrim/NolarDialogue.kt @@ -0,0 +1,55 @@ +package rs09.game.content.dialogue.region.keldagrim + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class NolarDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.CHILD_NORMAL,"I have a wide variety of crafting tools on offer,", + "care to take a look?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + options("Yes please!", "No thanks").also { stage++ } + } + + 1 -> when(buttonId){ + 1 -> { + player(FacialExpression.FRIENDLY, "Yes please!").also { stage = 10 } + } + 2 -> { + player(FacialExpression.FRIENDLY, "No thanks.").also { stage = 99 } + } + } + + 10 -> { + end().also { npc.openShop(player) } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return NolarDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.NOLAR_2158) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/legendsguild/FionellaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/legendsguild/FionellaDialogue.kt new file mode 100644 index 000000000..f5ed2f5f3 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/legendsguild/FionellaDialogue.kt @@ -0,0 +1,56 @@ +package rs09.game.content.dialogue.region.legendsguild + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * Dialogue for + * @author qmqz + */ + +@Initializable +class FionellaDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Can I help you at all?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + + 0 -> { + options("Yes please. What are you selling?", "No thanks.").also { stage++ } + } + + 1 -> when(buttonId){ + 1 -> { + player(FacialExpression.FRIENDLY, "Yes please. What are you selling?").also { stage = 10 } + } + + 2 -> { + player(FacialExpression.FRIENDLY, "No thanks.").also { stage = 99 } + } + } + + 10 -> npc(FacialExpression.FRIENDLY, "Take a look.").also { stage = 100 } + + 99 -> end() + 100 -> end().also { npc.openShop(player) } + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FionellaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FIONELLA_932) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/LegendsGuardDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/legendsguild/LegendsGuardDialogue.kt similarity index 96% rename from Server/src/main/kotlin/rs09/game/content/dialogue/LegendsGuardDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/legendsguild/LegendsGuardDialogue.kt index a529844fb..5d98dd7ca 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/LegendsGuardDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/legendsguild/LegendsGuardDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.legendsguild import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/ArvelDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/ArvelDialogue.kt new file mode 100644 index 000000000..25a8e2521 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/ArvelDialogue.kt @@ -0,0 +1,47 @@ +package rs09.game.content.dialogue.region.lletya + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Not including quest-related dialogue + */ + +@Initializable +class ArvelDialogue(player: Player? = null) : DialoguePlugin(player){ + + fun gender (male : String = "hero", female : String = "heroine") = if (player.isMale) male else female + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npcl(FacialExpression.FRIENDLY,"Good day traveller. You are far from home, what brings you here?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> playerl(FacialExpression.FRIENDLY, "I am a wandering " + gender() + ". I come here in search of adventure.").also { stage++ } + 1 -> npc(FacialExpression.FRIENDLY, "Sounds ghastly, I just want to live in peace.").also { stage++ } + 2 -> playerl(FacialExpression.FRIENDLY, "Unfortunately without people like me, peace doesn't last for long.").also { stage++ } + 3 -> npcl(FacialExpression.FRIENDLY, "True, but then again most adventurers cause as much trouble as they put right.").also { stage++ } + 4 -> player(FacialExpression.FRIENDLY, "You've got a point there... Hmm...").also { stage++ } + 5 -> npc(FacialExpression.FRIENDLY, "Well, good day traveller. And always do the right thing.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ArvelDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ARVEL_2365) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/DalldavDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/DalldavDialogue.kt new file mode 100644 index 000000000..d40fb783f --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/DalldavDialogue.kt @@ -0,0 +1,48 @@ +package rs09.game.content.dialogue.region.lletya + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class DalldavDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Can I help you at all?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Yes please. What are you selling?", "Why do you sell this stuff?", "No thanks.").also { stage++ } + 1 -> when (buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Yes please. What are you selling?").also { stage = 10 } + 2 -> playerl(FacialExpression.FRIENDLY, "Why do you sell this stuff? The Crystal Bow is so much better.").also { stage = 20 } + 3 -> player(FacialExpression.FRIENDLY, "No thanks.").also { stage = 99 } + } + + 10 -> end().also { npc.openShop(player) } + + 20 -> npcl(FacialExpression.FRIENDLY, "We keep all these old toys to train our children with, but if people will part with coins for them, then they are theirs!").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DalldavDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.DALLDAV_2356) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/EoinDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/EoinDialogue.kt new file mode 100644 index 000000000..066862b6e --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/EoinDialogue.kt @@ -0,0 +1,39 @@ +package rs09.game.content.dialogue.region.lletya + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class EoinDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.FRIENDLY, "Sorry, I cannot stop or Iona will catch me, we are playing tag!").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return EoinDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.EOIN_2368) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/EudavGethinDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/EudavGethinDialogue.kt new file mode 100644 index 000000000..3e22c2951 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/EudavGethinDialogue.kt @@ -0,0 +1,44 @@ +package rs09.game.content.dialogue.region.lletya + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class EudavGethinDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Can I help you at all?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Yes please. What are you selling?", "No thanks.").also { stage++ } + + 1 -> when(buttonId) { + 1 -> end().also { npc.openShop(player) } + 2 -> player(FacialExpression.FRIENDLY, "No thanks.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return EudavGethinDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.EUDAV_2352, NPCs.GETHIN_2357) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/GoreuDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/GoreuDialogue.kt new file mode 100644 index 000000000..b1e35a2e9 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/GoreuDialogue.kt @@ -0,0 +1,42 @@ +package rs09.game.content.dialogue.region.lletya + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class GoreuDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.FRIENDLY, "Good day, can I help you?").also { stage++ } + 1 -> playerl(FacialExpression.FRIENDLY, "No thanks I'm just watching the world go by.").also { stage++ } + 2 -> npcl(FacialExpression.FRIENDLY, "Well I can think of no better place to do it, it is beautiful here is it not?").also { stage++ } + 3 -> playerl(FacialExpression.FRIENDLY, "Indeed it is.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return GoreuDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.GOREU_2363) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/IonaDialouge.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/IonaDialouge.kt new file mode 100644 index 000000000..43c1b529d --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/IonaDialouge.kt @@ -0,0 +1,39 @@ +package rs09.game.content.dialogue.region.lletya + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class IonaDialouge(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.FRIENDLY, "I can never catch Eoin, he is just too fast, I am always 'It'.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return IonaDialouge(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.IONA_2369) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/KelynDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/KelynDialogue.kt new file mode 100644 index 000000000..860653d7b --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/KelynDialogue.kt @@ -0,0 +1,43 @@ +package rs09.game.content.dialogue.region.lletya + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class KelynDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.FRIENDLY, "Huh... Oh sorry, you made me jump. I was miles away, day dreaming.").also { stage++ } + 1 -> player(FacialExpression.FRIENDLY, "About what may I ask?").also { stage++ } + 2 -> npcl(FacialExpression.FRIENDLY, "I was thinking about the crystal spires of Prifddinas.").also { stage++ } + 3 -> player(FacialExpression.FRIENDLY, "It must be beautiful, I've only seen the city walls.").also { stage++ } + 4 -> npcl(FacialExpression.FRIENDLY, "I have never seen it, all I know are the stories. I hope that changes one day.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return KelynDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.KELYN_2367) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/MawrthDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/MawrthDialogue.kt new file mode 100644 index 000000000..bd1e37594 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/MawrthDialogue.kt @@ -0,0 +1,44 @@ +package rs09.game.content.dialogue.region.lletya + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class MawrthDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npcl(FacialExpression.FRIENDLY,"Those children are nothing but trouble - if I did not watch them all the time, Seren knows what trouble they would get in to!").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player(FacialExpression.FRIENDLY, "They look old enough to look after themselves.").also { stage++ } + 1 -> npcl(FacialExpression.FRIENDLY, "They are only 34 and 38, far too young to be left unsupervised.").also { stage++ } + 2 -> player(FacialExpression.FRIENDLY, "Only!?! How old does that make you?").also { stage++ } + 3 -> npcl(FacialExpression.FRIENDLY, "Has no one told you it is rude to ask a lady her age?").also { stage++ } + 4 -> playerl(FacialExpression.FRIENDLY, "Sorry, I wasn't thinking. Anyway... I'd better stop distracting you.").also { stage++ } + 5 -> npc(FacialExpression.FRIENDLY, "Okay, See you some other time.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return MawrthDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.MAWRTH_2366) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/OronwenDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/OronwenDialogue.kt new file mode 100644 index 000000000..328aebb10 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lletya/OronwenDialogue.kt @@ -0,0 +1,46 @@ +package rs09.game.content.dialogue.region.lletya + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class OronwenDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Hello, can I help?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Yes please. What are you selling?", "No thanks.").also { stage++ } + + 1 -> when(buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Yes please. What are you selling?").also { stage = 10 } + 2 -> player(FacialExpression.FRIENDLY, "No thanks.").also { stage = 99 } + } + + 10 -> end().also { npc.openShop(player) } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return OronwenDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ORONWEN_2353) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/DukeHoracioDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lumbridge/DukeHoracioDialogue.kt similarity index 98% rename from Server/src/main/kotlin/rs09/game/content/dialogue/DukeHoracioDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/lumbridge/DukeHoracioDialogue.kt index 31303db91..f2dae3b5e 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/DukeHoracioDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lumbridge/DukeHoracioDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.lumbridge import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/BabaYagaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/BabaYagaDialogue.kt new file mode 100644 index 000000000..004239c72 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/BabaYagaDialogue.kt @@ -0,0 +1,55 @@ +package rs09.game.content.dialogue.region.lunarisle + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Does not include Lunar Diplomacy dialogue + */ + +@Initializable +class BabaYagaDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello there.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.ASKING, "Ah, a stranger to our island. How can I help?").also { stage ++ } + 1 -> options("Have you got anything to trade?", "It's a very interesting house you have here.", "I'm good thanks, bye.").also { stage ++ } + + 2 -> when(buttonId) { + 1 -> end().also { npc.openShop(player) } + 2 -> playerl(FacialExpression.ASKING, "It's a very interesting house you have here. Does he have a name?").also { stage = 10 } + 3 -> end() + } + + 10 -> npc(FacialExpression.FRIENDLY, "Why of course. It's Berty.").also { stage++ } + 11 -> player(FacialExpression.THINKING, "Berty? Berty the Chicken leg house?").also { stage++ } + 12 -> npc(FacialExpression.LAUGH, "Yes.").also { stage++ } + 13 -> player(FacialExpression.ASKING, "May I ask why?").also { stage++ } + 14 -> npcl(FacialExpression.LAUGH, "It just has that certain ring to it, don't you think? Beeerteeee!").also { stage++ } + 15 -> player(FacialExpression.HALF_WORRIED, "You're ins...").also { stage++ } + 16 -> npc("Insane? Very.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return BabaYagaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.BABA_YAGA_4513) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/BouquetMacHyacinthDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/BouquetMacHyacinthDialogue.kt new file mode 100644 index 000000000..1054953d2 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/BouquetMacHyacinthDialogue.kt @@ -0,0 +1,77 @@ +package rs09.game.content.dialogue.region.lunarisle + +import api.teleport +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.TeleportManager +import core.game.world.map.Location +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit + +/** + * @author qmqz + */ + +@Initializable +class BouquetMacHyacinthDialogue(player: Player? = null) : DialoguePlugin(player){ + + private val Rellekka = Location.create(2663, 3644, 0) + private var teled = false + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + if (!teled) { + if (player.inventory.contains(Items.SEAL_OF_PASSAGE_9083, 1) || player.equipment.contains(Items.SEAL_OF_PASSAGE_9083, 1)) { + player(FacialExpression.FRIENDLY, "Hi! What are you up to?").also { stage = 0 } + } else { + player(FacialExpression.FRIENDLY, "Hi, I...").also { stage = 5 } + } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FRIENDLY,"Watering the pretty flowers, you want to help?").also { stage++ } + 1 -> playerl(FacialExpression.HALF_WORRIED, "I don't have time to water flowers, I have people to save!").also { stage++ } + 2 -> npcl(FacialExpression.NEUTRAL, "Pft, you should take time to enjoy the simple things.").also { stage++ } + 3 -> player(FacialExpression.NEUTRAL, "I'm not a simple person.").also { stage++ } + 4 -> npc(FacialExpression.LAUGH, "So it seems.").also { stage = 99 } + + 5 -> npc(FacialExpression.ANNOYED, "What are you doing here, Fremennik?!").also { stage++ } + 6 -> player(FacialExpression.WORRIED, "I have a seal of pass...").also { stage++ } + 7 -> npc(FacialExpression.ANNOYED, "No you do not! Begone!").also { stage++ } + 8 -> teleport(player, Rellekka, TeleportManager.TeleportType.LUNAR).also { wait1() } + + 99 -> end() + } + return true + } + + private fun wait1() { + Executors.newSingleThreadScheduledExecutor().schedule({ + if (player.location.isInRegion(Rellekka.regionId)) { + playerl( + FacialExpression.WORRIED, + "Ooops. Suppose I need a seal of passage when I'm walking around that island." + ).also { end() } + } else { + wait1() + } + }, 1, TimeUnit.SECONDS) + } + + override fun newInstance(player: Player?): DialoguePlugin { + return BouquetMacHyacinthDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.BOUQUET_MAC_HYACINTH_4526) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/CabinBoyDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/CabinBoyDialogue.kt new file mode 100644 index 000000000..b8cba9294 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/CabinBoyDialogue.kt @@ -0,0 +1,72 @@ +package rs09.game.content.dialogue.region.lunarisle + +import api.addItemOrDrop +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Must have Lunar Diplomacy completed for the emerald lens + */ + +@Initializable +class CabinBoyDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + if (player.inventory.contains(Items.EMERALD_LENS_9066, 1) || player.bank.contains(Items.EMERALD_LENS_9066, 1)) { + playerl(FacialExpression.FRIENDLY, "So you've plucked up the courage to come and confront that girl!").also { stage = 0 } + } else { + player(FacialExpression.FRIENDLY, "Hi.").also { stage = 20 } + } + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.CHILD_FRIENDLY, "That I did, that I did!").also { stage++ } + 1 -> player(FacialExpression.ASKING, "And?").also { stage++ } + 2 -> npcl(FacialExpression.CHILD_FRIENDLY, "She turned out to be really nice! She's joining us to become a pirate!").also { stage++ } + 3 -> playerl(FacialExpression.HALF_WORRIED, "Really? And you're not sceptical about this? You know, after what she did last time?").also { stage++ } + 4 -> npc(FacialExpression.CHILD_SUSPICIOUS, "She---has---no---spell---on---me.").also { stage++ } + 5 -> player(FacialExpression.HALF_THINKING, "Huh? Why are you talking like that?").also { stage++ } + 6 -> npc(FacialExpression.CHILD_THINKING, "Like what?").also { stage++ } + 7 -> playerl(FacialExpression.HALF_ASKING, "Like someone else was talking for you. Are you sure she hasn't put a spell on you again? Did she wave a watch in front of your face? You know, tell you to look deep into her eyes?").also { stage++ } + 8 -> npc(FacialExpression.CHILD_SUSPICIOUS, "She---has---no---spell---on---me.").also { stage++ } + 9 -> playerl(FacialExpression.HALF_THINKING, "I think you've been hypnotised. I wonder what happens if I click my fingers?").also { + player.sendChat("*click*").also { stage++ } + } + 10 -> npc(FacialExpression.CHILD_SAD, "*Cluck* *cluck* *bwaarrk*").also { stage++ } + 11 -> npc(FacialExpression.CHILD_SAD, "").also { stage++ } + 12 -> player(FacialExpression.WORRIED, "Oh dear. Oh well, I'm sure you'll learn one day.").also { stage = 99 } + + 20 -> npc(FacialExpression.CHILD_FRIENDLY, "I bet you're after another lens!").also { stage++ } + 21 -> player(FacialExpression.HALF_THINKING, "How could you possibly know that?").also { stage++ } + 22 -> npcl(FacialExpression.CHILD_FRIENDLY, "Hey, I think I'm learning a thing or two from these Moon Clan ladies.").also { stage++ } + 23 -> options("Please", "No thanks").also { stage++ } + 24 -> when (buttonId) { + 1 -> player(FacialExpression.HALF_ASKING, "Oi! I need another lens, boy.").also { stage = 25} + 2 -> player(FacialExpression.SUSPICIOUS, "I think I'll pass. But thanks..").also { stage = 99 } + } + 25 -> npc(FacialExpression.CHILD_FRIENDLY, "Huh, oh ok, I suppose I owe you one.").also { addItemOrDrop(player, Items.EMERALD_LENS_9066, 1) }.also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return CabinBoyDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.CABIN_BOY_4539) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/MelenaMoonlanderDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/MelenaMoonlanderDialogue.kt new file mode 100644 index 000000000..cd8299d0e --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/MelenaMoonlanderDialogue.kt @@ -0,0 +1,64 @@ +package rs09.game.content.dialogue.region.lunarisle + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class MelenaMoonlanderDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello there.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.FRIENDLY, "Hi. Welcome to the general store. How might I help you?").also { stage++ } + + 1 -> options("What can you sell me?", "I have a question...", "I'm good thanks, bye.").also { stage++ } + + 2 -> when (buttonId) { + 1 -> end().also { npc.openShop(player) } + 2 -> player(FacialExpression.HALF_ASKING, "I have a question...").also { stage = 11 } + 3 -> player(FacialExpression.FRIENDLY, "I'm good thanks, bye.").also { stage = 99 } + } + + 11 -> npc(FacialExpression.FRIENDLY, "About magic of course.").also { stage++ } + 12 -> player(FacialExpression.SUSPICIOUS, "Sorry?").also { stage++ } + 13 -> npcl(FacialExpression.FRIENDLY, "I said about magic of course. You know, in response to your question.").also { stage++ } + 14 -> player(FacialExpression.HALF_THINKING, "But I didn't ask anything yet.").also { stage++ } + 15 -> npcl(FacialExpression.FRIENDLY, "Yes, but you were thinking of asking me how I was floating.").also { stage++ } + 16 -> player(FacialExpression.AMAZED, "That's true! How could you possibly know that?").also { stage++ } + 17 -> npc(FacialExpression.HALF_THINKING, "Don't you realise we can read your mind.").also { stage++ } + 18 -> player(FacialExpression.SUSPICIOUS, "Oh, of course. How do you manage to do that?").also { stage++ } + 19 -> npcl(FacialExpression.FRIENDLY, "It's quite simple, everyone has a resonance that is responded to by the moon. This resonance changes depending on what we are thinking. You can tune yourself in to listen to this").also { stage++ } + 20 -> npcl(FacialExpression.FRIENDLY, "resonance with practice - it's a life long quest for the members of the Moon Clan, but its especially easy to read with outsiders like yourself,").also { stage++ } + 21 -> npc(FacialExpression.FRIENDLY, "as you are far louder and unguarded.").also { stage++ } + 22 -> player(FacialExpression.SUSPICIOUS, "I see. I best be careful what I think of then.").also { stage++ } + 23 -> player(FacialExpression.WORRIED, "...").also { stage++ } + 24 -> player(FacialExpression.THINKING, "...").also { stage++ } + 25 -> npc(FacialExpression.DISGUSTED_HEAD_SHAKE, "That's disgusting!").also { stage++ } + 26 -> player(FacialExpression.SAD, "Sorry.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return MelenaMoonlanderDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.MELANA_MOONLANDER_4516) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/PaulinePolarisDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/PaulinePolarisDialogue.kt new file mode 100644 index 000000000..ad71d5407 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/PaulinePolarisDialogue.kt @@ -0,0 +1,48 @@ +package rs09.game.content.dialogue.region.lunarisle + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Does not include Lunar Diplomacy dialogue + */ + +@Initializable +class PaulinePolarisDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello there.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.ASKING, "Ah, a stranger to our island. How can I help?").also { stage ++ } + 1 -> playerl(FacialExpression.FRIENDLY, "Well, I've actually come here on a diplomatic mission. I want to try and settle some of the disputes between the Fremenniks and your clan.").also { stage++ } + 2 -> npcl(FacialExpression.FRIENDLY, "The Rremenniks? Pah! They are just too ignorant and stubborn to listen to anything we have to say - how can we possibly associate with a race that won't listen?").also { stage++ } + 3 -> playerl(FacialExpression.FRIENDLY, "I think they are very eager to listen, but they feel like you are keeping secrets from them.").also { stage++ } + 4 -> npc(FacialExpression.HALF_THINKING, "Secrets?").also { stage++ } + 5 -> playerl(FacialExpression.HALF_ASKING, "Yes, as in your magic ways. To be honest, I think it is fear of the unknown.").also { stage++ } + 6 -> npcl(FacialExpression.FRIENDLY, "Well, when the day comes that a Fremennik can prove they have the patience and interest in learning our ways, then we will perhaps share our secrets.").also { stage++ } + 7 -> player(FacialExpression.FRIENDLY, "I'm hoping I might be able to achieve that.").also { stage++ } + 8 -> npc(FacialExpression.FRIENDLY, "Good luck. It's far from simple.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return PaulinePolarisDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.PAULINE_POLARIS_4514) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/RimaeSirsalisDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/RimaeSirsalisDialogue.kt new file mode 100644 index 000000000..a701275ae --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/RimaeSirsalisDialogue.kt @@ -0,0 +1,62 @@ +package rs09.game.content.dialogue.region.lunarisle + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class RimaeSirsalisDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello there.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("What can you sell me?", "Do you have any use for suqah teeth or hides?", "It's a very interesting island you have here.", "I'm good thanks, bye.").also { stage++ } + + 1 -> when (buttonId) { + 1 -> end().also { npc.openShop(player) } + 2 -> player(FacialExpression.HALF_ASKING, "Do you have any use for suqah teeth or hides?").also { stage = 5 } + 3 -> npcl(FacialExpression.FRIENDLY, "Why thank you. It's been our haven for a great many generations.").also { stage = 10 } + 4 -> player(FacialExpression.FRIENDLY, "I'm good thanks, bye.").also { stage = 99 } + } + + 5 -> npcl(FacialExpression.FRIENDLY, "Most certainly! The hides are great for making clothes and the teeth are particularly useful for broaches, necklaces and the like. But I won't accept them from anyone.").also { stage = 99 } + + 10 -> playerl(FacialExpression.FRIENDLY, "Everything seems to have a magical feel to it.").also { stage++ } + 11 -> npcl(FacialExpression.FRIENDLY, "Of course. We integrate magic into all areas of our lives. It is a part of everyone, so why deny it? It's best to make the most of this innate gift we have all been given.").also { stage++ } + 12 -> player(FacialExpression.FRIENDLY, "What sort of things do you use your magic for?").also { stage++ } + 13 -> npcl(FacialExpression.FRIENDLY, "Take a look around. We use it in our day to day lives, from making a cup of tea to travelling around the island.").also { stage++ } + 14 -> npcl(FacialExpression.FRIENDLY, "You see our ancestors were the ones that found the first rune essence and put it to use! The various factions were eventually created,").also { stage++ } + 15 -> npcl(FacialExpression.FRIENDLY, "with people having different ideas on how the essence should be used (or not in some cases!)").also { stage++ } + 16 -> player(FacialExpression.FRIENDLY, "What has kept you so secluded on this island?").also { stage++ } + 17 -> npcl(FacialExpression.FRIENDLY, "It may be a bit beyond you, but although magic comes from within, we are all strongly linked to the moon and the").also { stage++ } + 18 -> npc(FacialExpression.FRIENDLY, "effects it has on us cannot be denied!").also { stage++ } + 19 -> player(FacialExpression.FRIENDLY, "It can't?").also { stage++ } + 20 -> npcl(FacialExpression.FRIENDLY, "Of course not. This very island has a great link to our moon, which helps us understand ourselves - especially our dreams,").also { stage++ } + 21 -> npc(FacialExpression.FRIENDLY, "which is the path to understanding magic.").also { stage++ } + 22 -> playerl(FacialExpression.FRIENDLY, "I think I will just have to take your word on that.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return RimaeSirsalisDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.RIMAE_SIRSALIS_4518) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SeleneDialog.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SeleneDialog.kt new file mode 100644 index 000000000..ae8b27c90 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SeleneDialog.kt @@ -0,0 +1,79 @@ +package rs09.game.content.dialogue.region.lunarisle + +import api.teleport +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.TeleportManager +import core.game.world.map.Location +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit + +/** + * @author qmqz + */ + +@Initializable +class SeleneDialog(player: Player? = null) : DialoguePlugin(player){ + + private val Rellekka = Location.create(2663, 3644, 0) + private var teled = false + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + if (!teled) { + if (player.inventory.contains(Items.SEAL_OF_PASSAGE_9083, 1) || player.equipment.contains(Items.SEAL_OF_PASSAGE_9083, 1)) { + player(FacialExpression.FRIENDLY, "Can you tell me a bit about your people?").also { stage = 0; } + } else { + player(FacialExpression.FRIENDLY, "Hi, I...").also { stage = 10 } + } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FRIENDLY,"Ok. Like what?").also { stage++ } + 1 -> player(FacialExpression.HALF_ASKING, "How about the values of the Moon clan!").also { stage++ } + 2 -> npcl(FacialExpression.NEUTRAL, "Let me see... We value knowledge of self because it is this that gives us our strength! It is most important!").also { stage++ } + 3 -> playerl(FacialExpression.FRIENDLY, "Well... I know things about myself. I know I like hot chocolate!").also { stage++ } + 4 -> npcl(FacialExpression.LAUGH, "I was meaning something a little deeper than that. We also like to see someone listen. You know how they say a wise man listens?").also { stage++ } + 5 -> player(FacialExpression.HALF_WORRIED, "....").also { stage++ } + 6 -> npc(FacialExpression.HALF_WORRIED, "Did you hear me?").also { stage++ } + 7 -> player(FacialExpression.HALF_WORRIED, ".... I'm listening.").also { stage++ } + 8 -> npc(FacialExpression.HALF_WORRIED, "Most wise.").also { stage++ } + 9 -> player(FacialExpression.HALF_WORRIED, "Huh?").also { stage = 99 } + + 10 -> npc(FacialExpression.ANNOYED, "What are you doing here, Fremennik?!").also { stage++ } + 11 -> player(FacialExpression.WORRIED, "I have a seal of pass...").also { stage++ } + 12 -> npc(FacialExpression.ANNOYED, "No you do not! Begone!").also { stage++ } + 13 -> teleport(player, Rellekka, TeleportManager.TeleportType.LUNAR).also { wait1() } + + 99 -> end() + } + return true + } + + private fun wait1() { + Executors.newSingleThreadScheduledExecutor().schedule({ + if (player.location.isInRegion(Rellekka.regionId)) { + playerl(FacialExpression.WORRIED, "Ooops. Suppose I need a seal of passage when I'm walking around that island.").also { end() } + } else { + wait1() + } + }, 1, TimeUnit.SECONDS) + } + + override fun newInstance(player: Player?): DialoguePlugin { + return SeleneDialog(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.SELENE_4517) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SirsalBankerDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SirsalBankerDialogue.kt new file mode 100644 index 000000000..0ee5d6356 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SirsalBankerDialogue.kt @@ -0,0 +1,64 @@ +package rs09.game.content.dialogue.region.lunarisle + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class SirsalBankerDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + if (player.inventory.contains(Items.SEAL_OF_PASSAGE_9083, 1) || player.equipment.contains(Items.SEAL_OF_PASSAGE_9083, 1)) { + npc(FacialExpression.FRIENDLY, "Good day, how may I help you?").also { stage = 0 } + } else { + player(FacialExpression.FRIENDLY, "Hi, I...").also { stage = 2 } + } + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("I'd like to access my bank account, please.", + "I'd like to check my PIN settings.", + "I'd like to collect items.", + "What is this place?").also { stage++ } + + 1 -> when (buttonId) { + 1 -> end().also { player.bank.open() } + 2 -> end().also { player.bankPinManager.openSettings() } + 3 -> end().also { player.playerGrandExchange.openCollectionBox() } + 4 -> player(FacialExpression.HALF_ASKING, "What is this place?").also { stage = 5 } + } + + 2 -> npc(FacialExpression.ANNOYED, "What are you doing here, Fremennik?!").also { stage++ } + 3 -> player(FacialExpression.WORRIED, "I have a seal of pass...").also { stage++ } + 4 -> npc(FacialExpression.ANNOYED, "No you do not! Begone!").also { stage = 99} + + 5 -> npcl(FacialExpression.FRIENDLY, "This is a branch of the Bank of Gielinor. We have branches in many towns.").also { stage++ } + 6 -> player(FacialExpression.FRIENDLY, "And what do you do?").also { stage++ } + 7 -> npcl(FacialExpression.FRIENDLY, "We will look after your items and money for you. Leave your valuables with us if you want to keep them safe.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return SirsalBankerDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.SIRSAL_BANKER_4519) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/AlvissDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/AlvissDialogue.kt new file mode 100644 index 000000000..4391c9622 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/AlvissDialogue.kt @@ -0,0 +1,65 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class AlvissDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DEFAULT,"Good day, sir.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + options("What are you doing down here?", "Good day.").also { stage++ } + } + + 1 -> when(buttonId){ + 1 -> { + player(FacialExpression.FRIENDLY, "What are you doing down here?").also { stage = 10 } + } + + 2 -> { + player(FacialExpression.NEUTRAL, "Good day.").also { stage = 99 } + } + } + + 10 -> { + npc(FacialExpression.OLD_DEFAULT,"I'm waiting for my shift, of course.", + "We can't dig all the time, you know.").also { stage++ } + } + + 11 -> { + npc(FacialExpression.OLD_DEFAULT," I'm also researching the links between the ", + "Fremenniks and the Dwarves.").also { stage++ } + } + + 12 -> { + npc(FacialExpression.OLD_DEFAULT,"I've found that we have some mythology in common.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AlvissDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ALVISS_3933) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/DerrikDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/DerrikDialogue.kt new file mode 100644 index 000000000..a54f0abd0 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/DerrikDialogue.kt @@ -0,0 +1,56 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * Dialogue for Derrik in Misc. + * @author qmqz + */ + +@Initializable +class DerrikDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Good day, Sir. Can I help you with anything?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + + 0 -> { + options("Can I use your anvil?", "Nothing, thanks.").also { stage++ } + } + + 1 -> when(buttonId){ + 1 -> { + player(FacialExpression.ASKING, "Can I use your anvil?").also { stage = 5 } + } + 2 -> { + player(FacialExpression.NEUTRAL, "Nothing, thanks.").also { stage = 99 } + } + } + + 5 -> { + npc(FacialExpression.NEUTRAL, "You may.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DerrikDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.DERRIK_1376) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/DonalDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/DonalDialogue.kt new file mode 100644 index 000000000..31b19c6e3 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/DonalDialogue.kt @@ -0,0 +1,52 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class DonalDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DEFAULT,"What do you want?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + player(FacialExpression.THINKING, "Just wondering if you were still here.").also { stage++ } + } + + 1 -> { + npc(FacialExpression.OLD_DEFAULT, "Of course I'm still here.").also { stage++ } + } + + 2 -> { + npc(FacialExpression.OLD_DISTRESSED, "I'm not going near that crack in the wall again.").also { stage++ } + } + + 3 -> { + npc(FacialExpression.OLD_DISTRESSED, "Rock falls and so on are fine, ", "but sea monsters in caves - never!").also { stage = 99 } + } + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DonalDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.DONAL_3938) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FerdDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FerdDialogue.kt new file mode 100644 index 000000000..a3d19afb5 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FerdDialogue.kt @@ -0,0 +1,66 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class FerdDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DEFAULT,"Good day, sir.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + player(FacialExpression.THINKING, "What are you doing down here?.").also { stage++ } + } + + 1 -> { + npc(FacialExpression.OLD_DEFAULT, "Shoring up the walls.").also { stage++ } + } + + 2 -> { + player(FacialExpression.ASKING, "What does that do?").also { stage++ } + } + + 3 -> { + npc(FacialExpression.OLD_DEFAULT, "Stops them falling down.").also { stage = 99 } + } + + 4 -> { + player(FacialExpression.ASKING, "Oh, I see.").also { stage++ } + } + + 5 -> { + npc(FacialExpression.OLD_NOT_INTERESTED, "Aye.", + "If you want to chatter, you'd better talk to ", + "Thorodin over there. I'm working.").also { stage = 99 } + } + + 6 -> { + player(FacialExpression.ASKING, "Okay then.").also { stage++ } + } + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FerdDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FERD_3937) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FinnDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FinnDialogue.kt new file mode 100644 index 000000000..f3908a8c4 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FinnDialogue.kt @@ -0,0 +1,68 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * Dialogue for Finn in Misc. + * @author qmqz + */ + +@Initializable +class FinnDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Can I help you, your Royal Highness?").also { stage = 0 } + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + options("Yes please. What are you selling?", "No thanks.", "What's it like living down here?").also { stage++ } + } + + 1 -> when(buttonId){ + 1 -> { + player(FacialExpression.ASKING, "Yes please. What are you selling?").also { stage = 10 } + } + + 2 -> { + player(FacialExpression.NEUTRAL, "No thanks.").also { stage = 99 } + } + + 3 -> { + player(FacialExpression.ASKING, "What's it like living down here?").also { stage = 20 } + } + } + + 10 -> { + end().also { npc.openShop(player) } + } + + 20 -> { + npc(FacialExpression.HALF_WORRIED, "A lot drier in the winter than it is above ground.").also { stage = 99 } + } + + 99 -> { + end() + } + + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FinnDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FINN_3922) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FishmongerMiscDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FishmongerMiscDialogue.kt new file mode 100644 index 000000000..7102e28c3 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FishmongerMiscDialogue.kt @@ -0,0 +1,44 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * Dialogue for the Fishmonger in Misc. + * @author qmqz + */ + +@Initializable +class FishmongerMiscDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Greetings, Sir.", + "Get your fresh fish here!", + "I've heard that the Etceterian fish is stored in", + "a cow shed.") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + end().also { npc.openShop(player) } + } + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FishmongerMiscDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FISHMONGER_1393) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FlowerGirlDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FlowerGirlDialogue.kt new file mode 100644 index 000000000..e5ee5fa99 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FlowerGirlDialogue.kt @@ -0,0 +1,81 @@ +package rs09.game.content.dialogue.region.miscellania + +import api.addItemOrDrop +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * Dialogue for the Flower Girl in Misc. + * @author qmqz + */ + +@Initializable +class FlowerGirlDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + //issues getting throne of miscellania status + /* + when (player.questRepository.getQuest("Throne of Miscellania").isCompleted(player)) { + true -> npc(FacialExpression.HAPPY, "Good day, Your Royal Highness.").also { stage = 1 } + false -> npc(FacialExpression.NEUTRAL, "Hello.").also { stage = 1 } + } + */ + npc(FacialExpression.NEUTRAL, "Hello.").also { stage = 1 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> { + player(FacialExpression.ASKING, "Good day. What are you doing?").also { stage++ } + } + + 2 -> { + /* + when (player.questRepository.getQuest("Throne of Miscellania").isCompleted(player)) { + true -> npc(FacialExpression.HAPPY, "I'm selling flowers, 15gp for three. Would you like some, Your Highness?").also { stage++ } + false -> npc(FacialExpression.NEUTRAL, "I'm selling flowers, 15gp for three. Would you like some?").also { stage++ } + } + */ + npc(FacialExpression.NEUTRAL, "I'm selling flowers, 15gp for three. Would you like some?").also { stage++ } + } + + 3 -> { + options("Yes, please.", "No, thank you.").also { stage++ } + } + + 4 -> when(buttonId){ + 1 -> { + if (player.inventory.contains(995,15)) { + npc(FacialExpression.HAPPY, "Thank you! Here you go.").also { stage = 99 } + player.inventory.remove(Item(995, 15)) + addItemOrDrop(player, 2460, 1) + } else { + player(FacialExpression.HALF_THINKING, "I'm sorry, but I don't have 15gp.").also { stage = 99 } + } + } + 2 -> { + player(FacialExpression.NEUTRAL, "No, thank you.").also { stage = 99 } + } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FlowerGirlDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FLOWER_GIRL_1378) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FullangrDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FullangrDialogue.kt new file mode 100644 index 000000000..5583157d7 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/FullangrDialogue.kt @@ -0,0 +1,57 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class FullangrDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DEFAULT,"Good day, sir.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + options("What are you doing down here?", "Good day.").also { stage++ } + } + + 1 -> when(buttonId){ + 1 -> { + player(FacialExpression.FRIENDLY, "What are you doing down here?").also { stage = 10 } + } + + 2 -> { + player(FacialExpression.NEUTRAL, "Good day.").also { stage = 99 } + } + } + + 10 -> { + npc(FacialExpression.OLD_DEFAULT,"I'm working on the digging, of course.", + "It's a small excavation, so only two of us ", + "can work on it at a time.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FullangrDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FULLANGR_3934) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/GreengrocerMiscDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/GreengrocerMiscDialogue.kt new file mode 100644 index 000000000..cfea553c9 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/GreengrocerMiscDialogue.kt @@ -0,0 +1,41 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * Dialogue for the Fishmonger in Misc. + * @author qmqz + */ + +@Initializable +class GreengrocerMiscDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Welcome, Sir.", + "I sell only the finest and freshest vegetables!").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage){ + 0 -> { + end().also { npc.openShop(player) } + } + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return GreengrocerMiscDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.GREENGROCER_1394) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/HallaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/HallaDialogue.kt new file mode 100644 index 000000000..162838cac --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/HallaDialogue.kt @@ -0,0 +1,70 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class HallaDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Welcome to Miscellania's first clothing store!", "We sell clothing made especially for Fremenniks", "and Dwarves.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + npc(FacialExpression.ASKING, "Can I help you with anything, your Royal Highness?").also { stage++ } + } + + 1 -> { + options("I'd like to look at what you have for sale.", "No thank you, I'm fine.", "What's it like living down here?").also { stage++ } + } + + 2 -> when(buttonId){ + 1 -> { + player(FacialExpression.FRIENDLY, "I'd like to look at what you have for sale.").also { stage = 10 } + } + + 2 -> { + player(FacialExpression.NEUTRAL, "No thank you, I'm fine.").also { stage = 99 } + } + + 3 -> { + player(FacialExpression.ASKING, "What's it like living down here?").also { stage = 20 } + } + } + + 10 -> { + end().also { npc.openShop(player) } + } + + 20 -> { + npc(FacialExpression.NEUTRAL, "It's very spacious down here.", "One of the dwarves said that the caves go on for miles!").also { stage++ } + } + 21 -> { + npc(FacialExpression.NEUTRAL, "The only problem I find is that the lighting's not very good,", "which means I make mistakes when cutting cloth.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return HallaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.HALLA_3921) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/JariDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/JariDialogue.kt new file mode 100644 index 000000000..a54d349eb --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/JariDialogue.kt @@ -0,0 +1,60 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class JariDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DEFAULT,"Good day, sir.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + options("What are you doing down here?", "Good day.").also { stage++ } + } + + 1 -> when(buttonId){ + 1 -> { + player(FacialExpression.FRIENDLY, "What are you doing down here?").also { stage = 10 } + } + + 2 -> { + player(FacialExpression.NEUTRAL, "Good day.").also { stage = 99 } + } + } + + 10 -> { + npc(FacialExpression.OLD_DEFAULT,"I'm waiting to work on the digging.").also { stage++ } + } + + 11 -> { + npc(FacialExpression.OLD_HAPPY,"It's the first excavation I've worked on, ", + "and I'm looking forward to it.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return JariDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.JARI_3935) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/MiscCitizenGoodDayDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/MiscCitizenGoodDayDialogue.kt new file mode 100644 index 000000000..cafaad19e --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/MiscCitizenGoodDayDialogue.kt @@ -0,0 +1,45 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class MiscCitizenGoodDayDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + npc(FacialExpression.FRIENDLY, "Good day, Your Royal Highness.").also { stage = 99 } + } + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return MiscCitizenGoodDayDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ALRIK_1381, NPCs.RUNOLF_3924, + NPCs.BRODDI_1390, NPCs.EINAR_1380, NPCs.INGRID_3926, + NPCs.RAGNAR_1379, NPCs.RAGNVALD_1392, NPCs.RANNVEIG_1386, + NPCs.THORA_3927, NPCs.THORA_1387, NPCs.THORHILD_1382, + NPCs.VALGERD_1388, NPCs.TJORVI_3925 + ) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/OsvaldDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/OsvaldDialogue.kt new file mode 100644 index 000000000..59fd5c7d0 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/OsvaldDialogue.kt @@ -0,0 +1,73 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class OsvaldDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Welcome to the Miscellania food store.","We've only opened recently.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0-> { + npc(FacialExpression.NEUTRAL, "Would you like to buy anything,", + "your Royal Highness?").also { stage++ } + } + + 1 -> { + options("Could you show me what you have for sale?", + "No thank you, I don't need food just now.", + "What's it like living down here?").also { stage++ } + } + + 2 -> when(buttonId){ + 1 -> { + player(FacialExpression.ASKING, "Could you show me what you have for sale?").also { stage = 10 } + } + + 2 -> { + player(FacialExpression.NEUTRAL, "No thank you, I don't need food just now.").also { end() } + } + + 3 -> { + player(FacialExpression.ASKING, "What's it like living down here?").also { stage = 20 } + } + } + + 10 -> { + end().also { npc.openShop(player) } + } + + 20 -> { + npc(FacialExpression.FRIENDLY, "The town's thriving.", + "I'm sure it'll soon be as busy as Rellekka!").also { stage = 99 } + } + + 99 -> { + end() + } + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return OsvaldDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.OSVALD_3923) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/RunaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/RunaDialogue.kt new file mode 100644 index 000000000..e222ade38 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/RunaDialogue.kt @@ -0,0 +1,77 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class RunaDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Would you like to try some fine Miscellanian ale,", "your Royal Highness?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + npc(FacialExpression.ASKING, "Well I say Miscellanian, but it's actually brewed", "on the mainland.").also { stage++ } + } + + 1 -> { + npc(FacialExpression.FRIENDLY, "Would you like to try some anyway?").also { stage++ } + } + + 2 -> { + options("Yes, please.", "No, thank you.", "What's it like living down here?").also { stage++ } + } + + 3 -> when(buttonId){ + 1 -> { + player(FacialExpression.ASKING, "Yes please.").also { stage = 10 } + } + + 2 -> { + player(FacialExpression.NEUTRAL, "No thank you.").also { stage = 99 } + } + + 3 -> { + player(FacialExpression.ASKING, "What's it like living down here?").also { stage = 20 } + } + } + + 10 -> { + end().also { npc.openShop(player) } + } + + 20 -> { + npc(FacialExpression.HALF_WORRIED, "Business is booming!").also { stage++ } + } + + 21 -> { + npc(FacialExpression.HALF_WORRIED, "Now, if only I hadn't taken a loss to the beer I sold", "to those teenagers.").also { end() } + } + + 99 -> { + end() + } + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return RunaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.RUNA_3920) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/ThorodinDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/ThorodinDialogue.kt new file mode 100644 index 000000000..f34e99b96 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/miscellania/ThorodinDialogue.kt @@ -0,0 +1,75 @@ +package rs09.game.content.dialogue.region.miscellania + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class ThorodinDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_DEFAULT,"Good day, sir.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + options("What are you doing down here?", "Good day.").also { stage++ } + } + + 1 -> when(buttonId){ + 1 -> { + player(FacialExpression.FRIENDLY, "What are you doing down here?").also { stage = 10 } + } + + 2 -> { + player(FacialExpression.NEUTRAL, "Good day.").also { stage = 99 } + } + } + + 10 -> { + npc(FacialExpression.OLD_DEFAULT,"We're extending the cave so more people can live in it.", + "These Miscellanians aren't so bad.", + "They appreciate the benefits of living underground.").also { stage++ } + } + + 11 -> { + player(FacialExpression.ASKING,"...such as?").also { stage++ } + } + + 12 -> { + npc(FacialExpression.OLD_DEFAULT,"Not getting rained on, for example.", + "Did you do anything about that monster Donal", "was talking about?").also { stage++ } + } + + 13 -> { + player(FacialExpression.FRIENDLY,"It's been taken care of.").also { stage++ } + } + + 14 -> { + npc(FacialExpression.OLD_HAPPY,"Glad to hear it.", + "Now we can get on with excavating.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ThorodinDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.THORODIN_3936) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/AfflictedDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/mortton/AfflictedDialogue.kt similarity index 95% rename from Server/src/main/kotlin/rs09/game/content/dialogue/AfflictedDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/mortton/AfflictedDialogue.kt index 98f92ef5c..a33ed01ac 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/AfflictedDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/mortton/AfflictedDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.mortton import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/mosleharmless/CharleyDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/mosleharmless/CharleyDialogue.kt new file mode 100644 index 000000000..8c8e5041c --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/mosleharmless/CharleyDialogue.kt @@ -0,0 +1,77 @@ +package rs09.game.content.dialogue.region.mosleharmless + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class CharleyDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + if (player.inventory.contains(Items.BOOK_O_PIRACY_7144, 1)) { + npc(FacialExpression.FRIENDLY, "I got fish, you got gold?").also { stage = 10 } + } else { + player(FacialExpression.FRIENDLY, "Hello!").also { stage = 0 } + } + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.FRIENDLY, "Arr? Be ye wantin' te go on account with our gang o' fillibusters?").also { stage++ } + 1 -> npcl(FacialExpression.FRIENDLY, "The powder monkey be takin' a caulk after gettin' rowdy on bumboo, so there be plenty of room for ye.").also { stage++ } + 2 -> player(FacialExpression.FRIENDLY, "Riiiiight...").also { stage++ } + 3 -> player(FacialExpression.FRIENDLY, "I'll just be over here if you need me.").also { stage = 99 } + + 10 -> options("Yes.", "Yes, but I don't want your fish.", "What happened to your legs?").also { stage++ } + + 11 -> when(buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Yes.").also { stage = 80 } + 2 -> player(FacialExpression.FRIENDLY, "Yes, but I don't want your fish.").also { stage = 20 } + 3 -> player(FacialExpression.HALF_ASKING, "What happened to your legs?").also { stage = 30 } + } + + 20 -> npcl(FacialExpression.FRIENDLY, "Then what are ye doin' in a fish shop? Looking fer work?").also { stage++ } + 21 -> player(FacialExpression.FRIENDLY, "Possibly, do you have any quests?").also { stage++ } + 22 -> npcl(FacialExpression.HALF_ASKING, "I dunno, I haven't gone through the last catch yet. What sort of a fish is it?").also { stage++ } + 23 -> player(FacialExpression.FRIENDLY, "A quest isn't a type of fish!").also { stage++ } + 24 -> npcl(FacialExpression.FRIENDLY, "Then I don't have any, and yer wastin' my time!").also { stage = 99 } + + 30 -> npcl(FacialExpression.FRIENDLY, "Ye wanna know what happened to my legs?").also { stage++ } + 31 -> npcl(FacialExpression.FRIENDLY, "Yer too much of a lilly-livered, hat wearin' landlubber to know what happened to my legs!").also { stage++ } + 32 -> playerl(FacialExpression.FRIENDLY, "No I'm not! I've seen some freaky stuff! I can take it!").also { stage++ } + 33 -> npcl(FacialExpression.FRIENDLY, "All right, lad, since yer so insistent, I'll tell ye.").also { stage++ } + 34 -> npcl(FacialExpression.FRIENDLY, "See, I was clingin' onto a barrel, me ship havin' just had an encounter with this albatross.").also { stage++ } + 35 -> npcl(FacialExpression.FRIENDLY, "The sea was thrashin' and wild, but not so wild that I didn't see the fins of some sharks closin' in on me.").also { stage++ } + 36 -> npcl(FacialExpression.FRIENDLY, "I managed to yank a sliver of wood from the barrel just as one of them grabbed me from below, but I slipped down the things throat by about two feet before I managed te kill it.").also { stage++ } + 37 -> player(FacialExpression.FRIENDLY, "How did you survive?").also { stage++ } + 38 -> npcl(FacialExpression.FRIENDLY, "A passin' ship saw the sharks and knew there would be survivors in the water. They sent a longboat and picked me up, but not before the sharks had taken off my legs.").also { stage++ } + 39 -> npcl(FacialExpression.FRIENDLY, "And that lad is why they call me two feet Charley, because they found me jammed two feet down a shark's throat.").also { stage++ } + 40 -> player(FacialExpression.DISGUSTED, "I think I'm gonna be sick...").also { stage++ } + 41 -> npcl(FacialExpression.FRIENDLY, "I knew ye couldn't handle the truth!").also { stage = 99 } + + 80 -> end().also { npc.openShop(player) } + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return CharleyDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.CHARLEY_3161) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/nardah/Nkuku.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/nardah/Nkuku.kt new file mode 100644 index 000000000..1be752237 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/nardah/Nkuku.kt @@ -0,0 +1,41 @@ +package rs09.game.content.dialogue.region.nardah + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class Nkuku(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Good day to you.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + npc(FacialExpression.FRIENDLY, "May Saradomin be with you.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return Nkuku(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.NKUKU_3032) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/OttoGodblessedDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ottosgrotto/OttoGodblessedDialogue.kt similarity index 97% rename from Server/src/main/kotlin/rs09/game/content/dialogue/OttoGodblessedDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/ottosgrotto/OttoGodblessedDialogue.kt index 3487805fa..6b01e2701 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/OttoGodblessedDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ottosgrotto/OttoGodblessedDialogue.kt @@ -1,10 +1,9 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.ottosgrotto import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player -import core.game.node.item.Item import core.plugin.Initializable import rs09.tools.END_DIALOGUE diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/BeefyBurnsDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/BeefyBurnsDialogue.kt new file mode 100644 index 000000000..ef5d99fd6 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/BeefyBurnsDialogue.kt @@ -0,0 +1,43 @@ +package rs09.game.content.dialogue.region.piratescove + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class BeefyBurnsDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.HALF_ASKING, "What are you cooking?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.LAUGH, "My speciality! What else could I be cooking?").also { stage++ } + 1 -> player(FacialExpression.THINKING, "Ok, and your speciality is...?").also { stage++ } + 2 -> npcl(FacialExpression.LAUGH, "Boiled shark guts with a hint of rosemary and a dash of squid ink.").also { stage++ } + 3 -> player(FacialExpression.FRIENDLY,"I think I'll stick to making my own food.").also { stage++ } + 4 -> npc(FacialExpression.FRIENDLY, "Your loss!").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return BeefyBurnsDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.BEEFY_BURNS_4541) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/DaveyBoyDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/DaveyBoyDialogue.kt new file mode 100644 index 000000000..aa1a341c8 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/DaveyBoyDialogue.kt @@ -0,0 +1,51 @@ +package rs09.game.content.dialogue.region.piratescove + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class DaveyBoyDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + when ((1..2).random()) { + 1 -> playerl(FacialExpression.HALF_ASKING, "What does it take to become first mate on a ship?").also { stage = 0 } + 2 -> npcl(FacialExpression.ANNOYED, "It is customary when stowing away on a vessel to not introduce yourself to the Captains First Mate, oh foolish one.").also { stage = 10 } + } + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.LAUGH, "Good question. We have a diplomatic consession at the turn of the financial year. Said pirate is chosen should the existing mate be absent without leave.").also { stage++ } + 1 -> playerl(FacialExpression.THINKING, "I had no idea. I always figured it was all about popularity.").also { stage++ } + 2 -> npc(FacialExpression.FRIENDLY, "It is. I'm just pulling your leg.").also { stage++ } + 3 -> player(FacialExpression.FRIENDLY,"Oh....").also { stage = 99 } + + 10 -> player(FacialExpression.ANNOYED, "Hey! I'm not a stowaway!").also { stage++ } + 11 -> player(FacialExpression.ANNOYED, "That Lokar guy invited me aboard...").also { stage++ } + 12 -> npcl(FacialExpression.FRIENDLY, "I see. Well, don't distract me as I'm making preparations for departure.").also { stage++ } + 13 -> npcl(FacialExpression.FRIENDLY, "Try not to distract any of the crew either, Zamorak knows it's hard enough to get them to do any work around here without strangers wandering round the ship asking them inane questions.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DaveyBoyDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FIRST_MATE_DAVEY_BOY_4543) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/EagleEyeShultzDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/EagleEyeShultzDialogue.kt new file mode 100644 index 000000000..c250ac646 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/EagleEyeShultzDialogue.kt @@ -0,0 +1,42 @@ +package rs09.game.content.dialogue.region.piratescove + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class EagleEyeShultzDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + playerl(FacialExpression.HALF_ASKING, "What do you do for fun on this ship? You know, when you're not doing pirate stuff.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npcl(FacialExpression.FRIENDLY, "All sorts! Hide and seek, pin the patch on the pirate, walk the plank!").also { stage++ } + 1 -> playerl(FacialExpression.WORRIED, "What a life! Wait a minute. 'Walk the plank'? Surely that's a bit dangerous?").also { stage++ } + 2 -> npcl(FacialExpression.LAUGH, "Well of course, but where's the fun without a few deaths?").also { stage++ } + 3 -> player(FacialExpression.HALF_THINKING,"I think I'll stick to Runelink.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return EagleEyeShultzDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.EAGLE_EYE_SHULTZ_4542) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/LecherousLeeDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/LecherousLeeDialogue.kt new file mode 100644 index 000000000..8a4e9c5be --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/piratescove/LecherousLeeDialogue.kt @@ -0,0 +1,107 @@ +package rs09.game.content.dialogue.region.piratescove + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class LecherousLeeDialogue(player: Player? = null) : DialoguePlugin(player){ + + private val conversations = arrayOf (0, 10, 13, 17, 21, 27, 31, 36, 43, 52) + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY, "Hello.").also { stage = conversations.random() } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player(FacialExpression.FRIENDLY, "So how's life as a pirate?").also { stage++ } + 1 -> npcl(FacialExpression.LAUGH, "What kind of question is that? How's life as a... I dunno. Whatever it is that you do for a living.").also { stage++ } + 2 -> player(FacialExpression.FRIENDLY,"I'm a freelance troubleshooter.").also { stage++ } + 3 -> npc(FacialExpression.FRIENDLY, "What does that entail then?").also { stage++ } + 4 -> playerl(FacialExpression.FRIENDLY,"Mostly killing things for money and delivering items around the planet for people.").also { stage++ } + 5 -> player(FacialExpression.FRIENDLY,"I collect stuff.").also { stage++ } + 6 -> npc(FacialExpression.FRIENDLY, "So how's that life?").also { stage++ } + 7 -> player(FacialExpression.FRIENDLY,"Can't complain, can't complain...").also { stage++ } + 8 -> npc(FacialExpression.FRIENDLY, "Well, there you go.").also { stage = 99 } + + 10 -> player(FacialExpression.FRIENDLY, "Aren't you a little short for a pirate?").also { stage++ } + 11 -> npcl(FacialExpression.LAUGH, "My mother was a gnome. Apparently it was a very painful birth.").also { stage++ } + 12 -> player(FacialExpression.FRIENDLY,"More info than I wanted, thanks!").also { stage = 99 } + + 13 -> npcl(FacialExpression.FRIENDLY, "Sorry, can't stop, the Captain will have my guts for garters if he catches me slacking off talking to the stowaway.").also { stage++ } + 14 -> player(FacialExpression.FRIENDLY,"I'm not a stowaway! I was invited aboard!").also { stage++ } + 15 -> npcl(FacialExpression.FRIENDLY, "Yeah, whatever guy, it doesn't really matter who you are I'll get in trouble!").also { stage = 99 } + + 17 -> playerl(FacialExpression.FRIENDLY, "You know, I've always wondered what life as a pirate actually entails.").also { stage++ } + 18 -> npcl(FacialExpression.LAUGH, "Well, at the moment it mostly involves being asked random questions by a stowaway.").also { stage++ } + 19 -> playerl(FacialExpression.FRIENDLY,"I'm not a stowaway! I was invited aboard! By Lokar! Ask him!").also { stage++ } + 20 -> npcl(FacialExpression.FRIENDLY, "Hey, whatever pal. Just make sure the captain doesn't catch you, pirates don't like stowaways much.").also { stage = 99 } + + 21 -> npcl(FacialExpression.LAUGH, "Ah, good day to you sirrah! Your face is unfamiliar, did you perhaps join us aboard the ship at Lunar Isle?").also { stage++ } + 22 -> playerl(FacialExpression.FRIENDLY,"No, Lokar offered me a lift in Rellekka actually.").also { stage++ } + 23 -> npcl(FacialExpression.FRIENDLY, "Oh, really? You don't look like a Fremennik to me!").also { stage++ } + 24 -> playerl(FacialExpression.FRIENDLY,"Well... I kind of am, and I kind of aren't. It's a long story.").also { stage++ } + 25 -> npcl(FacialExpression.FRIENDLY, "Sorry I don't have time to hear it then! See you around young fremennik-who-is-not-really-a- fremennik!").also { stage++ } + 26 -> playerl(FacialExpression.FRIENDLY,"'Bye.").also { stage = 99 } + + 27 -> player(FacialExpression.FRIENDLY, "Brrrr! Its cold up here!").also { stage++ } + 28 -> npcl(FacialExpression.LAUGH, "You think this is cold? Up by Acheron it gets so cold that when you talk you see the words freeze in the air in front of you!").also { stage++ } + 29 -> player(FacialExpression.FRIENDLY,"REALLY?").also { stage++ } + 30 -> npcl(FacialExpression.FRIENDLY, "Nah, not really. I was exaggerating for humourous effect. It is very very cold though!").also { stage = 99 } + + + 31 -> npc(FacialExpression.LAUGH, "Hello to you too.").also { stage++ } + 32 -> playerl(FacialExpression.FRIENDLY,"Yar! We be pirates, yar! Avast, ye scurvy land-lubbing lychee!").also { stage++ } + 33 -> npcl(FacialExpression.FRIENDLY, "Please don't talk like that, it is extremely irritating.").also { stage++ } + 34 -> npcl(FacialExpression.FRIENDLY, "Also, please don't call me a lychee, whatever that may be.").also { stage++ } + 35 -> player(FacialExpression.FRIENDLY,"Oh. Okay. Sorry.").also { stage = 99} + + + 36 -> npc(FacialExpression.LAUGH, "ARGH!", "SOUND THE ALARM!", "STOWAWAY ON BOARD!", "STOWAWAY ON BOARD!").also { stage++ } + 37 -> player(FacialExpression.FRIENDLY,"No! I'm not a stowaway! Honest! I was invited here!").also { stage++ } + 38 -> npc(FacialExpression.FRIENDLY, "Oh, sorry, my mistake then.").also { stage++ } + 39 -> npcl(FacialExpression.FRIENDLY, "You must admit you do look a lot like a stowaway though.").also { stage++ } + 40 -> player(FacialExpression.FRIENDLY,"Why, what do they usually look like?").also { stage++ } + 41 -> npc(FacialExpression.FRIENDLY, "Erm... I've never actually met one...").also { stage++ } + 42 -> player(FacialExpression.FRIENDLY,"Okay then...").also { stage = 99 } + + 43 -> npc(FacialExpression.LAUGH, "Hello.").also { stage++ } + 44 -> player(FacialExpression.FRIENDLY,"So... You're a pirate, huh?").also { stage++ } + 45 -> npcl(FacialExpression.FRIENDLY, "It's what it says on my pay-packet at the end of the month.").also { stage++ } + 46 -> player(FacialExpression.FRIENDLY,"How's that working out for you?").also { stage++ } + 47 -> npcl(FacialExpression.FRIENDLY, "Pretty good so far. All the grog and loot that we can plunder, plus full medical including dental.").also { stage++ } + 48 -> player(FacialExpression.FRIENDLY,"You mean you have insurance?").also { stage++ } + 49 -> npcl(FacialExpression.FRIENDLY, "Not as such. If any of us get sick we kidnap a doctor and don't let him go until we're better.").also { stage++ } + 50 -> npcl(FacialExpression.FRIENDLY, "You'd be surprised what an incentive for expert health care that is.").also { stage++ } + 51 -> player(FacialExpression.FRIENDLY,"I can imagine.").also { stage = 99 } + + 52 -> npc(FacialExpression.LAUGH, "Hello there. So what brings you aboard the Lady Zay?").also { stage++ } + 53 -> playerl(FacialExpression.FRIENDLY,"Well, I was planning on visiting the Moon Clan, but I have to say your ship is very impressive.").also { stage++ } + 54 -> npcl(FacialExpression.FRIENDLY, "Aye, she's a beauty alright! The Lady Zay has been my home for many hard months, through storm and sun, and she always gets us to here we were headed!").also { stage++ } + 55 -> playerl(FacialExpression.FRIENDLY,"Yes, she's certainly one of the finest boats I've seen on my travels!").also { stage++ } + 56 -> npc(FacialExpression.FRIENDLY, "That she is lad, that she is.").also { stage = 99 } + + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return LecherousLeeDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.LECHEROUS_LEE_4556) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/CouncilWorkerDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDialogue.kt similarity index 94% rename from Server/src/main/kotlin/rs09/game/content/dialogue/CouncilWorkerDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDialogue.kt index 52822d60b..72c109e30 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/CouncilWorkerDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.rellekka import core.game.content.dialogue.DialoguePlugin import core.game.node.entity.player.Player diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/FurTraderDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/FurTraderDialogue.kt new file mode 100644 index 000000000..ab5e10455 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/FurTraderDialogue.kt @@ -0,0 +1,46 @@ +package rs09.game.content.dialogue.region.rellekka + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Needs the quest to be completed to really do anything else here + * Trade option shouldn't work either unless it's completed + */ + +@Initializable +class FurTraderDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + if (!player.questRepository.isComplete("The Fremennik Trials")) { + npc(FacialExpression.ANNOYED, "I don't sell to outerlanders.").also { stage = 99 } + } else { + npc(FacialExpression.FRIENDLY,"Welcome back ! Have you seen the furs I have today?").also { stage = 10 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.ANNOYED, "I don't sell to outerlanders.").also { stage = 99 } + 10 -> end().also { npc.openShop(player) } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FurTraderDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FUR_TRADER_1316) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/GeoffreyDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/seersvillage/GeoffreyDialogue.kt similarity index 98% rename from Server/src/main/kotlin/rs09/game/content/dialogue/GeoffreyDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/seersvillage/GeoffreyDialogue.kt index ecc1bc303..76128e88f 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/GeoffreyDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/seersvillage/GeoffreyDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.seersvillage import core.Util import core.game.content.dialogue.DialoguePlugin diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/shilovillage/FernaheiDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/shilovillage/FernaheiDialogue.kt new file mode 100644 index 000000000..27412a910 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/shilovillage/FernaheiDialogue.kt @@ -0,0 +1,55 @@ +package rs09.game.content.dialogue.region.shilovillage + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class FernaheiDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Welcome to Fernahei's Fishing Shop Bwana!", + "Would you like to see my items?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + options("Yes please!", "No, but thanks for the offer.").also { stage++ } + } + + 1 -> when (buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Yes, please.").also { stage = 10 } + 2 -> player(FacialExpression.FRIENDLY, "No, but thanks for the offer.").also { stage = 20 } + } + + 10 -> { + end().also { npc.openShop(player) } + } + + 20 -> { + npc(FacialExpression.FRIENDLY, "That's fine, and thanks for your interest.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FernaheiDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FERNAHEI_517) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/shilovillage/ObliDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/shilovillage/ObliDialogue.kt new file mode 100644 index 000000000..d238b77ce --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/shilovillage/ObliDialogue.kt @@ -0,0 +1,51 @@ +package rs09.game.content.dialogue.region.shilovillage + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class ObliDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Welcome to Obli's General Store Bwana!", + "Would you like to see my items?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + options("Yes please!", "No, but thanks for the offer.").also { stage++ } + } + + 1 -> when (buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Yes, please.").also { stage = 10 } + 2 -> player(FacialExpression.FRIENDLY, "No, but thanks for the offer.").also { stage = 99 } + } + + 10 -> { + end().also { npc.openShop(player) } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ObliDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.OBLI_516) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/sophanem/EmbalmerDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/sophanem/EmbalmerDialogue.kt new file mode 100644 index 000000000..4b2f4e7fc --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/sophanem/EmbalmerDialogue.kt @@ -0,0 +1,41 @@ +package rs09.game.content.dialogue.region.sophanem + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class EmbalmerDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.SUSPICIOUS,"What are you doing?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> playerl(FacialExpression.FRIENDLY, "I have this acne potion which I thought might help ease your itching.").also { stage++ } + 1 -> npcl(FacialExpression.ANNOYED, "If I thought that these spots could be cured by some potion, I would have mixed up one myself before now.").also { stage++ } + 2 -> player(FacialExpression.SAD, "Sorry, I was just trying to help.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return EmbalmerDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.EMBALMER_1980) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/ThormacDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/sorcererstower/ThormacDialogue.kt similarity index 99% rename from Server/src/main/kotlin/rs09/game/content/dialogue/ThormacDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/sorcererstower/ThormacDialogue.kt index 50812bf52..360fc6819 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/ThormacDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/sorcererstower/ThormacDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.sorcererstower import core.game.component.Component import core.game.content.dialogue.DialoguePlugin diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/GabootyDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/taibwowannai/GabootyDialogue.kt similarity index 99% rename from Server/src/main/kotlin/rs09/game/content/dialogue/GabootyDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/taibwowannai/GabootyDialogue.kt index 1f77413a7..b2fe51f80 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/GabootyDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/taibwowannai/GabootyDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.taibwowannai import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/AsyffDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/AsyffDialogue.kt similarity index 98% rename from Server/src/main/kotlin/rs09/game/content/dialogue/AsyffDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/AsyffDialogue.kt index 214231252..1c5640149 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/AsyffDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/AsyffDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.varrock import core.game.component.Component import core.game.content.dialogue.DialoguePlugin diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/ElsieDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/ElsieDialogue.kt similarity index 99% rename from Server/src/main/kotlin/rs09/game/content/dialogue/ElsieDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/ElsieDialogue.kt index 228d86491..b97f4d3f6 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/ElsieDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/ElsieDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.varrock import core.game.content.dialogue.DialoguePlugin import core.game.node.entity.player.Player diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/IffieDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/IffieDialogue.kt similarity index 94% rename from Server/src/main/kotlin/rs09/game/content/dialogue/IffieDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/IffieDialogue.kt index 8cb3b2f4d..0064ea79e 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/IffieDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/IffieDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.varrock import core.game.content.dialogue.DialoguePlugin import core.game.node.entity.player.Player diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/KingRoaldDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/KingRoaldDialogue.kt similarity index 98% rename from Server/src/main/kotlin/rs09/game/content/dialogue/KingRoaldDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/KingRoaldDialogue.kt index f61e625c8..1a45c8018 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/KingRoaldDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/KingRoaldDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.varrock import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/ThessaliaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/ThessaliaDialogue.kt similarity index 99% rename from Server/src/main/kotlin/rs09/game/content/dialogue/ThessaliaDialogue.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/ThessaliaDialogue.kt index eccde821c..8e38f81d6 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/ThessaliaDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/varrock/ThessaliaDialogue.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.varrock import core.game.component.Component import core.plugin.Initializable diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/BrotherMaledictDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/BrotherMaledictDialogue.kt new file mode 100644 index 000000000..4ba9409c5 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/BrotherMaledictDialogue.kt @@ -0,0 +1,38 @@ +package rs09.game.content.dialogue.region.witchaven + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Does not take quests into consideration + */ + +@Initializable +class BrotherMaledictDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"The blessings of Saradomin be with you child.").also { stage = 99 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return BrotherMaledictDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.BROTHER_MALEDICT_4878) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/CarolineDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/CarolineDialogue.kt new file mode 100644 index 000000000..2ab1aead7 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/CarolineDialogue.kt @@ -0,0 +1,41 @@ +package rs09.game.content.dialogue.region.witchaven + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class CarolineDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello again.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FRIENDLY, "Hello traveller, how are you?").also { stage++ } + 1 -> player(FacialExpression.FRIENDLY, "Not bad thanks, yourself?").also { stage++ } + 2 -> npcl(FacialExpression.FRIENDLY, "I'm good. Busy as always looking after Kent and Kennith but no complaints.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return CarolineDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.CAROLINE_696) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/ColONiallDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/ColONiallDialogue.kt new file mode 100644 index 000000000..85cedf6d9 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/ColONiallDialogue.kt @@ -0,0 +1,56 @@ +package rs09.game.content.dialogue.region.witchaven + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Does not take quest into consideration + */ + +@Initializable +class ColONiallDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello there.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FRIENDLY, "Hello. What can I do for you?").also { stage++ } + 1 -> player(FacialExpression.FRIENDLY, "Oh, I'm just wondering what you're doing.").also { stage++ } + 2 -> npc(FacialExpression.FRIENDLY, "A spot of fishing.").also { stage++ } + 3 -> player(FacialExpression.FRIENDLY, "That doesn't look much like a fishing rod.").also { stage++ } + 4 -> npc(FacialExpression.FRIENDLY, "That my friend, depends on what you're fishing for.").also { stage++ } + 5 -> player(FacialExpression.FRIENDLY, "And what would that be?").also { stage++ } + 6 -> npcl(FacialExpression.FRIENDLY, "A little of this, a little of that; the usual things.").also { stage++ } + 7 -> player(FacialExpression.FRIENDLY, "Have you caught much?").also { stage++ } + 8 -> npc(FacialExpression.FRIENDLY, "The odd bite here and there. Hmm.").also { stage++ } + 9 -> player(FacialExpression.FRIENDLY, "What?").also { stage++ } + 10 -> npcl(FacialExpression.FRIENDLY, "You look like a capable lad. Tell you what, when you've got a bit more experience under your belt, get yourself over to Falador.").also { stage++ } + 11 -> player(FacialExpression.FRIENDLY, "What's in Falador?").also { stage++ } + 12 -> npcl(FacialExpression.FRIENDLY, "An old friend of mine. You'll find him sitting on a bench in Falador Park. See what he can do for you.").also { stage++ } + 13 -> player(FacialExpression.FRIENDLY, "What's his name? Who should I say sent me?").also { stage++ } + 14 -> npcl(FacialExpression.FRIENDLY, "None of that matters if you can find him and if you're ready my name isn't necessary.").also { stage++ } + 15 -> player(FacialExpression.FRIENDLY, "Oh right. I'll get going then. Goodbye.").also { stage++ } + 16 -> npc(FacialExpression.FRIENDLY, "Goodbye and good luck.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ColONiallDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.COL_ONIALL_4872) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/EzekialLovecraftDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/EzekialLovecraftDialogue.kt new file mode 100644 index 000000000..ed0554c8a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/EzekialLovecraftDialogue.kt @@ -0,0 +1,64 @@ +package rs09.game.content.dialogue.region.witchaven + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Does not take quests into consideration + */ + +@Initializable +class EzekialLovecraftDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npcl(FacialExpression.FRIENDLY,"Well hello there; welcome to our little village. Pray, stay awhile.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("What do you do here?", "Can I buy some fishing supplies please?", "You are a bit too strange for me. Bye.").also { stage++ } + + 1 -> when (buttonId) { + 1 -> player(FacialExpression.ASKING, "What do you do here?").also { stage = 10 } + 2 -> player(FacialExpression.HALF_ASKING, "Can I buy some fishing supplies please?").also { stage = 25 } + 3 -> player(FacialExpression.ANNOYED, "You are a bit too strange for me. Bye.").also { stage = 30 } + } + + 10 -> npcl(FacialExpression.FRIENDLY, "I supply the local fishermen with the tools and bait they need to do their job.").also { stage++ } + 11 -> player(FacialExpression.FRIENDLY, "Interesting. Have you been doing it long?").also { stage++ } + 12 -> npcl(FacialExpression.FRIENDLY, "Why yes, all of my life. I took over from my father, who inherited the business from his father and so on. In fact, there have been Lovecraft's selling bait for over ten generations.").also { stage++ } + 13 -> player(FacialExpression.FRIENDLY, "Wow, that's some lineage.").also { stage++ } + 14 -> npcl(FacialExpression.LAUGH, "Oh yes, we have a long and interesting family history. For one reason or another the Lovecraft's have always been bait sellers or writers.").also { stage++ } + 15 -> playerl(FacialExpression.FRIENDLY, "Hmm, yes well. I'm sure it's all fascinating, but I...").also { stage++ } + 16 -> npcl(FacialExpression.FRIENDLY, "Oh very, very fascinating, for instance my great grandfather Howard...").also { stage++ } + 17 -> playerl(FacialExpression.HALF_ROLLING_EYES, "Yawn. Oh, I'm sorry but I really must be getting on. I think my giraffe needs feeding.").also { stage++ } + 18 -> npc(FacialExpression.HALF_ASKING, "Your?").also { stage++ } + 19 -> playerl(FacialExpression.ANNOYED, "Giraffe. Sorry, but he gets cranky without enough sugar. Bye now!").also { stage++ } + 20 -> npc(FacialExpression.FRIENDLY, "Oh right, goodbye.").also { stage = 99 } + + 25 -> end().also { npc.openShop(player) } + + 30 -> npc(FacialExpression.FRIENDLY, "Sniff. Yes, everyone says that.").also { stage = 99 } + + + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return EzekialLovecraftDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.EZEKIAL_LOVECRAFT_4856) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/HolgartDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/HolgartDialogue.kt new file mode 100644 index 000000000..cf784455e --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/HolgartDialogue.kt @@ -0,0 +1,43 @@ +package rs09.game.content.dialogue.region.witchaven + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class HolgartDialogue(player: Player? = null) : DialoguePlugin(player){ + fun gender (male : String = "sir", female : String = "madam") = if (player.isMale) male else female + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello there.").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FRIENDLY, "Well hello " + gender() + ", beautiful day isn't it?").also { stage++ } + 1 -> player(FacialExpression.FRIENDLY, "Not bad I suppose.").also { stage++ } + 2 -> npc(FacialExpression.FRIENDLY, "Just smell that sea air... beautiful.").also { stage++ } + 3 -> player(FacialExpression.FRIENDLY, "Hmm... lovely...").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return HolgartDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.HOLGART_4866) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/JebDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/JebDialogue.kt new file mode 100644 index 000000000..78315cc95 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/JebDialogue.kt @@ -0,0 +1,38 @@ +package rs09.game.content.dialogue.region.witchaven + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Does not take quest into consideration + */ + +@Initializable +class JebDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Hello there.").also { stage = 99 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return JebDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.JEB_4895) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/MayorHobbDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/MayorHobbDialogue.kt new file mode 100644 index 000000000..b3f8982c0 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/MayorHobbDialogue.kt @@ -0,0 +1,38 @@ +package rs09.game.content.dialogue.region.witchaven + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + * Does not take quest into consideration + */ + +@Initializable +class MayorHobbDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npcl(FacialExpression.FRIENDLY,"Well hello there; welcome to our little village. Pray, stay awhile.").also { stage = 99 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return MayorHobbDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.MAYOR_HOBB_4874) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/WitchhavenVillageDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/WitchhavenVillageDialogue.kt new file mode 100644 index 000000000..9eafa60df --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/witchaven/WitchhavenVillageDialogue.kt @@ -0,0 +1,78 @@ +package rs09.game.content.dialogue.region.witchaven + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class WitchhavenVillageDialogue(player: Player? = null) : DialoguePlugin(player){ + + private val conversations = arrayOf (0, 7, 11, 19, 24) + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY, "Hello there.").also { stage = conversations.random() } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + + 0 -> sendDialogue("Their eyes are staring vacantly into space.").also { stage++ } + 1 -> npc(FacialExpression.NEUTRAL, "Ye mariners all, as ye pass by,").also { stage++ } + 2 -> npc(FacialExpression.NEUTRAL, "Come in and drink if you are dry,").also { stage++ } + 3 -> npc(FacialExpression.NEUTRAL, "Come spend, me lads, your money brisk,").also { stage++ } + 4 -> npc(FacialExpression.NEUTRAL, "And pop your nose in a jug of this.").also { stage++ } + 5 -> player(FacialExpression.NEUTRAL, "You're not fooling anyone you know.").also { stage++ } + 6 -> npc(FacialExpression.NEUTRAL, "We fooled you easily enough.").also { stage = 99 } + + 7 -> sendDialogue("Their eyes are staring vacantly into space.").also { stage++ } + 8 -> npc(FacialExpression.NEUTRAL, "Free. She is free...").also { stage++ } + 9 -> player(FacialExpression.NEUTRAL, "What?").also { stage++ } + 10 -> npc(FacialExpression.NEUTRAL, "The mother is free.").also { stage = 99 } + + 11 -> sendDialogue("Their eyes are staring vacantly into space.").also { stage++ } + 12 -> npc(FacialExpression.NEUTRAL, "You! You did it!").also { stage++ } + 13 -> player(FacialExpression.NEUTRAL, "I didn't mean to!").also { stage++ } + 14 -> npc(FacialExpression.NEUTRAL, "You killed him!").also { stage++ } + 15 -> player(FacialExpression.NEUTRAL, "It was an accide... Killed who?").also { stage++ } + 16 -> npc(FacialExpression.NEUTRAL, "Our Prince, you killed our Prince.").also { stage++ } + 17 -> player(FacialExpression.NEUTRAL, "Oh that, yes I did.").also { stage++ } + 18 -> npc(FacialExpression.NEUTRAL, "Leave us alone.").also { stage = 99 } + + 19 -> sendDialogue("Their eyes are staring vacantly into space.").also { stage++ } + 20 -> npc(FacialExpression.NEUTRAL, "Soon now... So soon...").also { stage++ } + 21 -> npc(FacialExpression.NEUTRAL, "The stars are almost right.").also { stage++ } + 22 -> player(FacialExpression.NEUTRAL, "For what?").also { stage++ } + 23 -> npc(FacialExpression.NEUTRAL, ". . .").also { stage = 99 } + + 24 -> sendDialogue("Their eyes are staring vacantly into space.").also { stage++ } + 25 -> npc(FacialExpression.NEUTRAL, "Ahh, our saviour.").also { stage++ } + 26 -> player(FacialExpression.NEUTRAL, "Please don't remind me.").also { stage++ } + 27 -> npc(FacialExpression.NEUTRAL, "Do not worry, soon your regret will be gone.").also { stage++ } + 28 -> player(FacialExpression.NEUTRAL, "If you think you will get to me...").also { stage++ } + 29 -> npc(FacialExpression.NEUTRAL, "All in good time.").also { stage = 99 } + + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return WitchhavenVillageDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.WITCHAVEN_VILLAGER_4883, NPCs.WITCHAVEN_VILLAGER_4884, + NPCs.WITCHAVEN_VILLAGER_4885, NPCs.WITCHAVEN_VILLAGER_4886, + NPCs.WITCHAVEN_VILLAGER_4887, NPCs.WITCHAVEN_VILLAGER_4888) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/worldwide/BlackGuardDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/worldwide/BlackGuardDialogue.kt new file mode 100644 index 000000000..1e8a93bd1 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/worldwide/BlackGuardDialogue.kt @@ -0,0 +1,36 @@ +package rs09.game.content.dialogue.region.worldwide + +import core.game.content.dialogue.DialoguePlugin +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class BlackGuardDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + sendDialogue("The guard ignores you.").also { stage = 99 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return BlackGuardDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.BLACK_GUARD_2130, NPCs.BLACK_GUARD_2131, NPCs.BLACK_GUARD_2132, NPCs.BLACK_GUARD_2133) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/GardenerDialoguePlugin.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/worldwide/GardenerDialoguePlugin.kt similarity index 99% rename from Server/src/main/kotlin/rs09/game/content/dialogue/GardenerDialoguePlugin.kt rename to Server/src/main/kotlin/rs09/game/content/dialogue/region/worldwide/GardenerDialoguePlugin.kt index 93149710b..23153a3a4 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/GardenerDialoguePlugin.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/worldwide/GardenerDialoguePlugin.kt @@ -1,4 +1,4 @@ -package rs09.game.content.dialogue +package rs09.game.content.dialogue.region.worldwide import core.game.content.dialogue.DialoguePlugin import core.game.node.entity.npc.NPC diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/BlaecDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/BlaecDialogue.kt new file mode 100644 index 000000000..ca085c26c --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/BlaecDialogue.kt @@ -0,0 +1,42 @@ +package rs09.game.content.dialogue.region.zanaris + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class BlaecDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + when ((1..3).random()) { + 1 -> npc(FacialExpression.FRIENDLY,"Wunnerful weather we're having today!").also { stage = 99 } + 2 -> npc(FacialExpression.FRIENDLY,"Greetin's " + player.name + ", fine day today!").also { stage = 99 } + 3 -> npcl(FacialExpression.ANNOYED,"Please leave me alone, I'm busy trapping the pygmy shrews.").also { stage = 99 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return BlaecDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.BLAEC_3115) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/CoOrdinatorDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/CoOrdinatorDialogue.kt new file mode 100644 index 000000000..dd31fbc81 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/CoOrdinatorDialogue.kt @@ -0,0 +1,47 @@ +package rs09.game.content.dialogue.region.zanaris + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class CoOrdinatorDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY, "Hello, what are you doing?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + when ((1..5).random()) { + 1 -> npcl(FacialExpression.OLD_DISTRESSED,"Sorry, I don't have time for idle chit-chat, I need to find a Winter Fairy to send to Trollheim!").also { stage = 99 } + 2 -> npcl(FacialExpression.OLD_DISTRESSED,"Sorry, I don't have time for idle chit-chat, I need to send a fairy to get little Freddie's tooth!").also { stage = 99 } + 3 -> npcl(FacialExpression.OLD_DISTRESSED,"Sorry, I don't have time for idle chit-chat, I need to send an Autumn Fairy off to Burthorpe!").also { stage = 99 } + 4 -> npcl(FacialExpression.OLD_DISTRESSED,"Sorry, I don't have time to talk, I need to send a Tooth Fairy to visit Sarah-Jane!").also { stage = 99 } + 5 -> npcl(FacialExpression.OLD_DISTRESSED,"Sorry, I don't have time to stop, I need to send a weather fairy off to Etceteria!").also { stage = 99 } + } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return CoOrdinatorDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.CO_ORDINATOR_3302) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyChefDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyChefDialogue.kt new file mode 100644 index 000000000..865adfbc3 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyChefDialogue.kt @@ -0,0 +1,38 @@ +package rs09.game.content.dialogue.region.zanaris + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class FairyChefDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npcl(FacialExpression.OLD_DEFAULT,"'Ello, sugar. I'm afraid I can't gossip right now, I've got a cake in the oven.").also { stage = 99 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FairyChefDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FAIRY_CHEF_3322, NPCs.FAIRY_CHEF_3323) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyDialogue.kt new file mode 100644 index 000000000..2e5ea3624 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyDialogue.kt @@ -0,0 +1,53 @@ +package rs09.game.content.dialogue.region.zanaris + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class FairyDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + when ((1..7).random()) { + 1 -> npcl(FacialExpression.OLD_CALM_TALK1,"Err, hello. Do you have any idea what a Winter Fairy actually does?").also { stage = 10 } + 2 -> npcl(FacialExpression.OLD_DISTRESSED,"Have you got any idea where Burthorpe is? The co-ordinator says I need to go there and paint all the leaves yellow, but I've never heard of that place!").also { stage = 99 } + 3 -> npcl(FacialExpression.OLD_DISTRESSED,"Be careful when you pick mushrooms near the strange ruins to the south. Some of them will try to eat you!").also { stage = 99 } + 4 -> npcl(FacialExpression.OLD_DISTRESSED,"I'm afraid I can't stop to chat. I've just been told to get ready to go to Etceteria for some reason or other!").also { stage = 99 } + 5 -> npcl(FacialExpression.OLD_CALM_TALK2,"Picking mushrooms near the forge will probably end quite badly for you. Not as bad as the ones by the strange ruins to the south though. They're much bigger.").also { stage = 99 } + 6 -> npc(FacialExpression.OLD_DISTRESSED,"Sorry, I can't talk I'm looking for Sarah-Jane!").also { stage = 99 } + 7 -> npc(FacialExpression.OLD_CALM_TALK2,"Is your name Freddie, and are you losing your teeth?").also { stage = 20 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 10 -> player(FacialExpression.THINKING, "No, no idea at all.").also { stage++ } + 11 -> npcl(FacialExpression.OLD_DISTRESSED,"Oh, pity. Neither do I, but I'm supposed to be one this week.").also { stage = 99 } + + 20 -> player(FacialExpression.THINKING, "Err, no. I'm afraid not.").also { stage++ } + 21 -> npcl(FacialExpression.OLD_CALM_TALK2, "Oh, right. You don't have any idea where I can find him do you?").also { stage++ } + 22 -> player(FacialExpression.NEUTRAL, "No, I don't know that either.").also { stage++ } + 23 -> npcl(FacialExpression.OLD_CALM_TALK1, "Oh, ok then. If you do find out please let me know. The co-ordinator has sent me to find him.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FairyDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FAIRY_4443, NPCs.FAIRY_4444, NPCs.FAIRY_4445, NPCs.FAIRY_4446, NPCs.FAIRY_567, NPCs.FAIRY_57) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyFixit.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyFixit.kt new file mode 100644 index 000000000..fbf4a42b4 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyFixit.kt @@ -0,0 +1,72 @@ +package rs09.game.content.dialogue.region.zanaris + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class FairyFixit(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + //tempvar + //post quest dialogue is missing for rs3 and osrs is too modern, so i'm just gonna use osrs as a placeholder + var completedFairyQueen = false + if (completedFairyQueen) { + npc(FacialExpression.OLD_CALM_TALK1, "Pssst! Human! I've got something for you.").also { stage = 20 } + } else { + npc(FacialExpression.OLD_DISTRESSED, "What is it, human? Busy busy busy!").also { stage = 0 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Why are you carrying that toolbox?", "I'm okay, thanks.").also { stage++ } + 1 -> when (buttonId){ + 1 -> player(FacialExpression.ASKING,"Why are you carrying that toolbox?").also { stage = 10 } + 2 -> player(FacialExpression.FRIENDLY, "I'm okay, thanks.").also { stage = 99 } + } + + + 10 -> npc(FacialExpression.OLD_DEFAULT, "It's the fizgog! It's picking up cable again!").also { stage++ } + 11 -> playerl(FacialExpression.ASKING, "Uh, right. So is it safe to use the fairy rings then?").also { stage++ } + 12 -> npcl(FacialExpression.OLD_CALM_TALK1, "Sure, as long as you have been given permission to use them. You should just be aware that using the fairy rings sometimes has strange results - the locations that you have been to may").also { stage++ } + 13 -> npcl(FacialExpression.OLD_CALM_TALK2, "affect the locations you are trying to reach. I could fix it by replacing the fizgog and the whosprangit; I've put in a request for some new parts, but they're").also { stage++ } + 14 -> npc(FacialExpression.OLD_CALM_TALK1, "pretty hard to get hold of it seems.").also { stage = 99 } + + 20 -> options("What have you got for me?", "Why are you carrying that toolbox?", "Not interested, thanks.").also { stage++ } + 21 -> when (buttonId) { + 1 -> player(FacialExpression.ASKING, "What have you got for me?").also { stage = 30 } + 2 -> player(FacialExpression.ASKING,"Why are you carrying that toolbox?").also { stage = 10 } + 3 -> player(FacialExpression.NEUTRAL, "Not interested, thanks.").also { stage = 99 } + } + + 30 -> npcl(FacialExpression.OLD_CALM_TALK1, "They said you'd helped cure our Queen. I haven't got a lot of rewards to offer, but my enchantment scrolls might help if you're working with fairy rings in your home.").also { stage++ } + 31 -> { + end() + npc.openShop(player) + } + + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FairyFixit(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FAIRY_FIXIT_4455) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyShopAssistantDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyShopAssistantDialogue.kt new file mode 100644 index 000000000..910f9f942 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/zanaris/FairyShopAssistantDialogue.kt @@ -0,0 +1,44 @@ +package rs09.game.content.dialogue.region.zanaris + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class FairyShopAssistantDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.OLD_NORMAL,"Can I help you at all?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Yes please. What are you selling?", "No thanks.").also { stage++ } + + 1 -> when (buttonId) { + 1 -> end().also { npc.openShop(player) } + 2 -> player(FacialExpression.NEUTRAL, "No thanks.").also { stage = 99 } + } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FairyShopAssistantDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.FAIRY_SHOP_ASSISTANT_535) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt b/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt index 9d903a657..32a242f6d 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt @@ -4,6 +4,7 @@ import core.cache.def.impl.ItemDefinition import core.game.content.ttrail.ClueLevel import core.game.content.ttrail.ClueScrollPlugin import core.game.node.entity.npc.drop.RareDropTable +import core.game.node.entity.npc.drop.CELEMinorTable import core.game.node.entity.player.Player import core.game.node.item.Item import core.tools.RandomFunction @@ -51,6 +52,7 @@ open class WeightBasedTable : ArrayList() { SLOT_CLUE_MEDIUM -> ClueScrollPlugin.getClue(ClueLevel.MEDIUM) SLOT_CLUE_HARD -> ClueScrollPlugin.getClue(ClueLevel.HARD) SLOT_RDT -> RareDropTable.retrieve() + SLOT_CELEDT -> CELEMinorTable.retrieve() else -> e.getItem() } safeItems.add(safeItem) @@ -83,6 +85,11 @@ open class WeightBasedTable : ArrayList() { return this } + fun insertCELEDTRoll(weight: Double): WeightBasedTable{ + this.add(WeightedItem(SLOT_CELEDT,1,1,weight,false)) + return this + } + companion object { @JvmStatic fun create(vararg items: WeightedItem): WeightBasedTable{ @@ -98,6 +105,7 @@ open class WeightBasedTable : ArrayList() { val SLOT_CLUE_EASY = Items.TOOLKIT_1 val SLOT_CLUE_MEDIUM = Items.ROTTEN_POTATO_5733 val SLOT_CLUE_HARD = Items.GRANITE_LOBSTER_POUCH_12070 + val SLOT_CELEDT = Items.NULL_799 } override fun toString(): String { diff --git a/Server/src/main/kotlin/rs09/game/content/quest/free/shieldofarrav/CharlieTheTrampDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/free/shieldofarrav/CharlieTheTrampDialogue.kt new file mode 100644 index 000000000..95c34706a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/free/shieldofarrav/CharlieTheTrampDialogue.kt @@ -0,0 +1,116 @@ +package rs09.game.content.quest.free.shieldofarrav + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.content.quest.free.shieldofarrav.ShieldofArrav +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class CharlieTheTrampDialogue(player: Player? = null) : DialoguePlugin(player){ + var q = "Shield of Arrav" + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Spare some change guv?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Who are you?", "Sorry, I haven't got any.", "Go get a job!", "Ok. Here you go.", "Is there anything down this alleyway?").also { stage++ } + + 1 -> when (buttonId) { + 1 -> player(FacialExpression.HALF_THINKING, "Who are you?").also { stage = 50 } + 2 -> player(FacialExpression.NEUTRAL, "Sorry, I haven't got any.").also { stage = 100 } + 3 -> player(FacialExpression.ANNOYED, "Go get a job!").also { stage = 150 } + 4 -> player(FacialExpression.ANNOYED, "Ok. Here you go.").also { stage = 200 } + 5 -> player(FacialExpression.ANNOYED, "Is there anything down this alleyway?").also { stage = 250 } + } + + 50 -> npcl(FacialExpression.FRIENDLY, "Charles. Charles E. Trampin' at your service. Now, about that change you were going to give me...").also { stage = 0 } + 100 -> npc(FacialExpression.SAD, "Thanks anyways!").also { stage = 99 } + 150 -> npc(FacialExpression.ANNOYED, "You startin? I hope your nose falls off!").also { stage = 99 } + 200 -> { + if (player.inventory.contains(Items.COINS_995, 1)) { + player.inventory.remove(Item(Items.COINS_995, 1)).also { end() } + } else { + sendDialogue("You need one coin to give away.").also { stage = 99 } + } + } + 201 -> npc(FacialExpression.HAPPY, "Hey, thanks a lot!").also { stage++ } + 202 -> options("No problem.", "Don't I get some sort of quest hint or something now?").also { stage++ } + 203 -> when(buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "No problem.").also { stage = 99 } + 2 -> player(FacialExpression.HALF_THINKING, "So... don't I get some sort of quest hint or something now?").also { stage = 220 } + } + 220 -> npcl(FacialExpression.ANNOYED, "Huh? What do you mean? That wasn't why I asked you for money.").also { stage++ } + 221 -> npcl(FacialExpression.SAD, "I just need to eat...").also { stage = 99 } + 250 -> npcl(FacialExpression.AFRAID,"The ruthless and notorious criminal gang known as the Black Arm Gang have their headquarters down there.").also { stage++ } + 251 -> options("Thank you for the warning!", "Do you think they would let me join?").also { stage++ } + 252 -> when (buttonId) { + 1 -> player(FacialExpression.FRIENDLY,"Thanks for the warning!").also { stage = 270 } + 2 -> player(FacialExpression.ASKING, "Do you think they would let me join?").also { stage = 280 } + } + 270 -> npc(FacialExpression.HAPPY, "Don't worry about it.").also { stage = 99 } + + 280 -> if (!ShieldofArrav.isBlackArm(player) && !ShieldofArrav.isPhoenix(player)) { + npcl(FacialExpression.SUSPICIOUS, "You never know. You'll find a lady down there called Katrine. Speak to her.").also { stage = 282 } + } else if (ShieldofArrav.isBlackArm(player)) { + npcl(FacialExpression.SUSPICIOUS, "I was under the impression you were already a member...").also { stage = 99 } + } else { + npcl(FacialExpression.ANNOYED, "No. You're a collaborator with the Phoenix Gang. There's no way they'll let you join now.").also { stage++ } + } + + 282 -> npc(FacialExpression.AFRAID, "But don't upset her, she's pretty dangerous.").also { stage++ } + 283 -> npcl(FacialExpression.FRIENDLY, "I also heard that Reldo the librarian knows more about them, go talk to him.").also { stage++ } + 284 -> { + if (!player.questRepository.hasStarted(q)) { + player.questRepository.getQuest(q).start(player) + player.questRepository.getQuest(q).setStage(player,50) + } + end() + } + + 291 -> options("How did you know I was in the Phoenix Gang?", "Any ideas how I could get in there then?").also { stage++ } + 292 -> when(buttonId) { + 1 -> player(FacialExpression.SUSPICIOUS, "How did you know I was in the Phoenix Gang?").also { stage = 300 } + 2 -> stage = 290 + } + + 300 -> npcl(FacialExpression.NEUTRAL, "In my current profession I spend a lot of time on the streets and you hear these sorta things sometimes.").also { stage++ } + 301 -> player(FacialExpression.ASKING, "Any ideas how I could get in there then?").also { stage++ } + 302 -> npc(FacialExpression.THINKING, "Hmmm. I dunno.").also { stage++ } + 303 -> npcl(FacialExpression.THINKING, "Your best bet would probably be to find someone else... Someone who ISN'T a member of the Phoenix Gang, and get them to infiltrate the ranks of the Black Arm Gang for you.").also { stage++ } + 304 -> npc(FacialExpression.THINKING, "If you find someone like that, tell 'em to come to me first.").also { stage++ } + + 305 -> options("Ok. Good plan!", "Like who?").also { stage++ } + 306 -> when (buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Ok. Good plan!").also { stage = 310 } + 2 -> player(FacialExpression.ASKING, "Like who?").also { stage = 320 } + } + + 310 -> npc(FacialExpression.LAUGH, "I'm not just a pretty face!").also { stage = 99 } + 320 -> npcl(FacialExpression.NEUTRAL, "There's plenty of other adventurers about besides yourself. I'm sure if you asked one of them nicely they would help you.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return CharlieTheTrampDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.CHARLIE_THE_TRAMP_641) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/deserttreasure/ArchaeologistDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/deserttreasure/ArchaeologistDialogue.kt new file mode 100644 index 000000000..83327508c --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/deserttreasure/ArchaeologistDialogue.kt @@ -0,0 +1,102 @@ +package rs09.game.content.dialogue.region.lletya + +import api.setQuestStage +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.skill.Skills +import core.plugin.Initializable +import org.rs09.consts.NPCs + +/** + * @author qmqz + */ + +@Initializable +class ArchaeologistDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + if (!player.questRepository.hasStarted("Desert Treasure")) { + if (player.questRepository.isComplete("The Digsite Quest") && + player.questRepository.isComplete("The Tourist Trap") && + player.questRepository.isComplete("The Temple of Ikov") && + player.questRepository.isComplete("Priest In Peril") && + player.questRepository.isComplete("Waterfall Quest") && + player.questRepository.isComplete("Troll Stronghold") && + player.skills.getStaticLevel(Skills.SLAYER) >= 10 && + player.skills.getStaticLevel(Skills.FIREMAKING) >= 50 && + player.skills.getStaticLevel(Skills.MAGIC) >= 50 && + player.skills.getStaticLevel(Skills.THIEVING) >= 53 ) { + player(FacialExpression.FRIENDLY,"Hello there.").also { stage = 0 } + } else { + player(FacialExpression.FRIENDLY,"Hello there.").also { stage = 999 } + } + + } else { + + } + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + + 999 -> sendDialogue("He seems to be lost in his own thoughts...").also { stage = 99 } + + 0 -> npc(FacialExpression.FRIENDLY, "Howdy stranger. What brings you out to these parts?").also { stage++ } + 1 -> options("What are you doing here?", "Do you have any quests?", "Who are you?", "Nothing really.").also { stage++ } + 2 -> when (buttonId) { + //1 -> todo + 2 -> player(FacialExpression.FRIENDLY, "Do you have any quests?", "Call it a hunch, but you look like the type of man who", "might...").also { stage = 20 } + //3 -> todo + //4 -> todo + } + + 20 -> npc(FacialExpression.HALF_THINKING, "Well, it's funny you should say that.", + "I'm not sure if I would really call it a quest as such,", + "but I found this ancient stone tablet in one of my", + "excavations, and it would really help me out if you").also { stage++ } + 21 -> npc(FacialExpression.FRIENDLY, "could go and take it back to the digsite for me and get", + "it examined.").also { stage++ } + 22 -> npc(FacialExpression.NEUTRAL, "It's very old, and I don't recognise and of the", + "inscriptions on it.").also { stage++ } + 23 -> options("Yes, I'll help you.", "No thanks, I don't want to help.").also { stage++ } + 24 -> when(buttonId) { + 1 -> player(FacialExpression.FRIENDLY, "Sure, I was heading that way anyways.", + "Any particular person at the digsite you want me to", + "talk to?").also { stage = 30 } + // 2 -> todo + } + + 30 -> npc(FacialExpression.NEUTRAL, "His name's Terry Balando. Give it to nobody but him.", + "I'm sorry, I can't entrust you with the actual tablet I", + "found, but it is far too valuable to give away, but I took", + "these etchings - they should be enough for him to make").also { stage++ } + 31 -> npc(FacialExpression.NEUTRAL, "a preliminary translation on.", + "Come back and let me know what he says, I would hate", + "to waste my time excavating anything that isn't worth", + "my time as a world famous archaeologist!").also { + player.questRepository.getQuest("Desert Treasure").start(player) + setQuestStage(player, "Desert Treasure", 1) + stage = 99 + } + + + + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ArchaeologistDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.ARCHAEOLOGIST_1918) + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/deserttreasure/DesertTreasure.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/deserttreasure/DesertTreasure.kt new file mode 100644 index 000000000..f42498ac6 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/deserttreasure/DesertTreasure.kt @@ -0,0 +1,103 @@ +//package rs09.game.content.quest.members.deserttreasure + +//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 + +/** + * @author qmqz + */ + +//@Initializable +//class DesertTreasure : Quest("Desert Treasure",15, 44, 3, 440, 0, 1, 15){ + + //override fun drawJournal(player: Player?, stage: Int) { + // super.drawJournal(player, stage) + // var line = 12 + + //val stage = player?.questRepository?.getStage("Desert Treasure")!! + + //when (stage) { + // 0 -> { + // line(player,"I can start this quest by speaking to !!The Archaeologist??", line++) + // line(player,"who is exploring the !!Bedabin Camp?? South West of the", line++) + // line(player,"!!Shantay Pass.??", line++) + // line(player,"To complete this quest I will need:", line++) + // if (player.skills.getStaticLevel(Skills.SLAYER) < 10) { + // line(player,"Level 10 Slayer", line++) + // } else { + // line(player,"---Level 10 Slayer/--", line++) + // } + // if (player.skills.getStaticLevel(Skills.SLAYER) < 10) { + // line(player,"Level 50 Firemaking", line++) + // } + // if (player.skills.getStaticLevel(Skills.SLAYER) < 10) { + // line(player,"Level 50 Magic", line++) + // } + // if (player.skills.getStaticLevel(Skills.SLAYER) < 10) { + // line(player,"Level 53 Thieving", line++) + // } + // line(player,"I must have completed the following quests:", line++) + + // if (player.questRepository.isComplete("The Digsite Quest")) { + // line(player,"---!!The digsite Quest??/--", line++) + // } else { + // line(player,"!!The digsite Quest??", line++) + // } + + // if (player.questRepository.isComplete("The Tourist Trap")) { + // line(player,"---!!The Tourist Trap??/--", line++) + // } else { + // line(player,"!!The Tourist Trap??", line++) + // } + + // if (player.questRepository.isComplete("The Temple of Ikov")) { + // line(player,"---!!The Temple of Ikov??/--", line++) + // } else { + // line(player,"!!The Temple of Ikov??", line++) + // } + + // if (player.questRepository.isComplete("Priest In Peril")) { + // line(player,"---!!Priest In Peril??/--", line++) + // } else { + // line(player,"!!Priest In Peril??", line++) + // } + + // if (player.questRepository.isComplete("Waterfall Quest")) { + // line(player,"---!!Waterfall Quest??/--", line++) + // } else { + // line(player,"!!Waterfall Quest??", line++) + // } + + // if (player.questRepository.isComplete("Troll Stronghold")) { + // line(player,"---!!Troll Stronghold??/--", line++) + // } else { + // line(player,"!!Troll Stronghold??", line++) + // } + + + // line(player,"", line++) + //} + // } + //} + + // override fun finish(player: Player) { + // var ln = 10 + // super.finish(player) + // player.packetDispatch.sendString("You have completed Desert Treasure!", 277, 4) + // player.packetDispatch.sendItemZoomOnInterface(1891, 240, 277, 5) +// + // drawReward(player,"3 Quest Points", ln++) + // drawReward(player,"20,000 Magic XP", ln++) + // drawReward(player,"Ability to use", ln++) + // drawReward(player,"Ancient Magicks", ln) + + // player.skills.addExperience(Skills.MAGIC, 20000.0) + + // } + + // override fun newInstance(`object`: Any?): Quest { + // return this + // } +//} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/familycrest/BootDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/familycrest/BootDialogue.kt index 38fd18d26..dc443a652 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/familycrest/BootDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/familycrest/BootDialogue.kt @@ -1,6 +1,7 @@ package core.game.content.quest.members.familycrest import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player import core.plugin.Initializable @@ -17,11 +18,11 @@ class BootDialogue (player: Player? = null): DialoguePlugin(player){ val qstage = player?.questRepository?.getStage("Family Crest") ?: -1 if(qstage < 14 || qstage > 14){ - npc("Hello tall person.") + npc(FacialExpression.OLD_NORMAL,"Hello tall person.") stage = 1 } else{ - npc("Hello tall person.") + npc(FacialExpression.OLD_NORMAL,"Hello tall person.") stage = 2 } @@ -37,7 +38,7 @@ class BootDialogue (player: Player? = null): DialoguePlugin(player){ 10 ->when(buttonId){ 1-> player("Hello short person.").also { stage = 1000 } - 2 -> npc("I'm called Boot, because when I was very young, ", + 2 -> npc(FacialExpression.OLD_ANGRY1,"I'm called Boot, because when I was very young, ", "I used to sleep, in a large boot.").also{stage++} } @@ -45,13 +46,13 @@ class BootDialogue (player: Player? = null): DialoguePlugin(player){ 11 -> player("Yeah, great, I didn't want your life story.").also { stage = 1000} 20 -> when (buttonId){ - 1 -> npc("High quality gold eh? Hmmm... " , + 1 -> npc(FacialExpression.OLD_DEFAULT,"High quality gold eh? Hmmm... " , "Well, the very best quality gold that I know of " , "can be found in an underground ruin near Witchaven.").also{stage++} 2-> player("Hello short person.").also { stage = 1000 } - 3 -> npc("I'm called Boot, because when I was very young, ", + 3 -> npc(FacialExpression.OLD_ANGRY1,"I'm called Boot, because when I was very young, ", "I used to sleep, in a large boot.").also{stage = 11} } diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/merlinsquest/TheLadyOfTheLake.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/merlinsquest/TheLadyOfTheLake.kt new file mode 100644 index 000000000..c66175559 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/merlinsquest/TheLadyOfTheLake.kt @@ -0,0 +1,153 @@ +package rs09.game.content.quest.members.merlinsquest + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.Item +import org.rs09.consts.Items + +/** + * Handles the LadyOfTheLake dialogue. + * + * @author Vexia + * @author Splinter + * @author pain + */ +class TheLadyOfTheLake(player: Player? = null) : DialoguePlugin(player) { + + override fun open(vararg args: Any): Boolean { + npc = args[0] as NPC + stage = if (!player.hasItem(Item(35, 1))) { + npc("Good day to you, " + (if (player.isMale) "sir" else "madam") + ".") + 0 + } else if(player.achievementDiaryManager.getDiary(DiaryType.SEERS_VILLAGE).isComplete(2) + && player.equipment.contains(14631,1) && player.equipment.contains(35,1)){ + npcl(FacialExpression.HAPPY,"I am the Lady of the Lake.") + 110 + } + else { + npc("Good day to you, " + (if (player.isMale) "sir" else "madam") + ".") + 699 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + val quest = player.questRepository.getQuest("Merlin's Crystal") + when (stage) { + 0 -> options("Who are you?", "I seek the sword Excalibur.", "Good day.").also { stage = 1 } + 1 -> when (buttonId) { + 1 -> player("Who are you?").also { stage = 100 } + 2 -> player("I seek the sword Excalibur.").also { + if (quest.getStage(player) < 50) { + stage = 250 + } else { + stage = 161 + } + } + 3 -> player("Good day.").also { stage = 10000 } + } + 100 -> npcl(FacialExpression.HAPPY,"I am the Lady of the Lake.").also { stage = 145 } + 110 -> player("And I'm-").also { stage++ } + 111 -> npc( + "You're " + player.name + ". And I see from the sign you", + "wear that you have earned the trust of Sir Kay." + ).also { stage++ } + 112 -> player("It was nothing.. really...").also { stage++ } + 113 -> npc("You shall be rewarded handsomely!").also { stage++ } + 114 -> { + interpreter.sendItemMessage( + Items.EXCALIBUR_35, + "The Lady of the Lake reaches out and touches the", + "blade Excalibur which seems to vibrate with new power." + ).also { + if (player.inventory.containsAtLeastOneItem(Items.EXCALIBUR_35)) { + player.inventory.remove(Item(Items.EXCALIBUR_35)) + player.inventory.add(Item(14632)) + } + else if (player.equipment.containsAtLeastOneItem(Items.EXCALIBUR_35)) { + player.equipment.remove(Item(Items.EXCALIBUR_35)) + player.equipment.add(Item(14632), true, false) + } + stage++ + } + } + 115 -> player("What does this do then?").also { stage++ } + 116 -> npc( + "I made the blade more powerful, and also gave it a", + "rather healthy effect when you use the special." + ).also { stage++ } + 117 -> player("Thanks!").also { stage = 10000 } + 145 -> options("I seek the sword Excalibur.", "Good day.").also { stage = 150 } + 150 -> when (buttonId) { + 1 -> player("I seek the sword Excalibur.").also { stage = 161 } + 2 -> player("Good day.").also { stage = 10000 } + } + 161 -> if (quest.getStage(player) == 50 || quest.getStage(player) == 60) { // they haven't proven themselves yet + npc("Aye, I have that artefact in my possession.").also { stage = 300 } + } else if (quest.getStage(player) >= 70) { + npc( + "... But you have already proved thyself to be worthy", + "of wielding it once already. I shall return it to you", + "if you can prove yourself to still be worthy.").also { stage = 162 } + } + 162 -> player("... And how can I do that?").also { stage = 163 } + 163 -> npc("Why, by proving yourself to be above material goods.").also { stage = 164 } + + 164 -> npc("500 coins ought to do it.").also { stage = 166 } + 166 -> if (player.inventory.contains(995, 500)) { + player("Ok, here you go.").also { stage = 168 } + } else { + player("I don't have that kind of money...").also { stage = 167 } + } + 167 -> npc("Well, come back when you do.").also { stage = 10000 } + 168 -> if (player.inventory.freeSlots() == 0) { + player("Sorry, I don't seem to have enough inventory space.").also { stage = 10000 } + } else if (player.inventory.contains(995, 500)) { + player.inventory.remove(Item(995, 500)) + player.inventory.add(Item(35, 1)) + npc( + "You are still worthy to wield Excalibur! And thanks", + "for the cash! I felt like getting a new haircut!" + ) + stage = 170 + } else { + player("I don't have that kind of money...").also { stage = 167 } + } + 170 -> interpreter.sendDialogue("The lady of the Lake hands you Excalibur.").also { stage = 10000 } + + 250 -> npc("I am afraid I do not know what you are talking about.").also { stage = 10000 } + + 300 -> npc("'Tis very valuable, and not an artefact to be given", "away lightly.").also { stage = 301 } + 301 -> npc("I would want to give it away only to one who is worthy", "and good.").also { stage = 302 } + 302 -> player("And how am I meant to prove that?").also { stage = 303 } + 303 -> npc("I shall set a test for you.").also { stage = 304 } + 304 -> npc( + "First I need you to travel to Port Sarim. Then go to", + "the upstairs room of the jeweller's shop there." + ).also { stage = 305 } + 305 -> player("Ok. That seems easy enough.").also { + quest.setStage(player, 60) + stage = 10000 + } + 699 -> options("Who are you?", "Good day.").also { stage = 700 } + 700 -> when (buttonId) { + 1 -> player("Who are you?").also { stage = 720 } + 2 -> player("Good day.").also { stage = 10000 } + } + 720 -> npc("I am the Lady of the Lake.").also { stage = 10000 } + 10000 -> end() + } + return true + } + + override fun newInstance(player: Player): DialoguePlugin { + return TheLadyOfTheLake(player) + } + + override fun getIds(): IntArray { + return intArrayOf(250) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.kt index 0229a2486..ba49eb3e3 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.kt @@ -3,20 +3,50 @@ package rs09.game.content.quest.members.thefremenniktrials import core.game.node.entity.player.Player import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression +import core.game.node.item.Item +import core.plugin.Initializable +import org.rs09.consts.Items -//@InitializablePlugin +@Initializable //Disabled because the quest isn't done yet. class AskeladdenDialogue(player: Player? = null) : DialoguePlugin(player) { override fun open(vararg args: Any?): Boolean { player?.let { - if (it.questRepository.getStage("Fremennik Trials") > 0) { - player("Hello there.").also { stage = 0; return true } + if(player.inventory.contains(3709,1)){ + playerl(FacialExpression.ASKING,"I thought you really liked the long hall?") + stage = 27 + return true } - if(it.getAttribute("fremtrials:lalli-talkedto",false)!!){ + else if(player?.getAttribute("sigmund-steps", 0) == 13){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a written promise from Askeladden to stay out of the Longhall?") + stage = 15 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"I've lost one of the items I was supposed to be trading.") + stage = 35 + return true + } + else if(player.questRepository.isComplete("Fremennik Trials")){ + playerl(FacialExpression.HAPPY,"Hello again Askeladden.") + stage = 40 + return true + } + else if (it.questRepository.getStage("Fremennik Trials") > 0) { + player("Hello there.") + stage = 0 + return true + } + else if(it.getAttribute("fremtrials:lalli-talkedto",false)!!){ player("Hello there. I understand you managed to get some", "golden wool from Lalli?") stage = 0 return true } + else{ + playerl(FacialExpression.HAPPY,"Hello there.") + stage = 55 + return true + } } return true } @@ -40,9 +70,67 @@ class AskeladdenDialogue(player: Player? = null) : DialoguePlugin(player) { 10 -> npc(FacialExpression.CHILD_FRIENDLY, "Buddy, I hafta say: if brains were explosives, that troll", "wouldn't have enough to blow his nose!").also { stage++ } 11 -> player(FacialExpression.HALF_ASKING, "Do you have any spare rocks then?").also { stage++ } 12 -> npc(FacialExpression.CHILD_NEUTRAL, "Sure thing buddy, although I have to say, I doubt even", "that troll is stupid enough to fall for the SAME trick", "TWICE in a row! You can try anyways though!").also { - player.setAttribute("/save:fremtrials:askeladden-talkedto",true); - stage++} - //Give player ROCK + player.inventory.add(Item(Items.PET_ROCK_3695)) + player.setAttribute("/save:fremtrials:askeladden-talkedto",true); + stage = 1000} + + 15 -> npcl(FacialExpression.CHILD_LOUDLY_LAUGHING,"What? I can't believe she asked you to get a written promise from me to stay out!").also { stage++ } + 16 -> playerl(FacialExpression.NEUTRAL,"Yup, she really did.").also { stage++ } + 17 -> npcl(FacialExpression.CHILD_FRIENDLY,"Awwwwwww.... but the longhall is just SO MUCH FUN! I'd live there if I could! I suppose you really need that promise to help become a Fremennik, huh?").also { stage++ } + 18 -> playerl(FacialExpression.NEUTRAL,"Yeah, I really do...").also { stage++ } + 19 -> npcl(FacialExpression.CHILD_FRIENDLY,"Well I'll tell you what buddy; As it's you, I'll give you that written promise. All I ask in return for it is a measly 5000 gold. What do you say?").also { stage++ } + 20 -> options("Yes","No").also { stage++ } + 21 -> when(buttonId){ + 1 -> if(player?.inventory?.contains(995,5000)!! && !player.inventory.isFull){ + playerl(FacialExpression.HAPPY,"That's all you want in return? Sure thing. Here you go.") + stage = 22 + }else stage = 25 + 2 -> stage = 25 + } + 22 -> npcl(FacialExpression.CHILD_FRIENDLY,"Done, and done. Let me know if you got any more cash burning a hole in your pocket I can relieve you of, buddy.").also { + player?.inventory?.remove(Item(Items.COINS_995,5000)) + player?.inventory?.add(Item(Items.PROMISSORY_NOTE_3709)) + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 25 -> playerl(FacialExpression.SAD,"I don't think so... That's really quite a lot of money...").also { stage++ } + 26 -> npcl(FacialExpression.CHILD_LOUDLY_LAUGHING,"Hey, suit yourself buddy. You change your mind, the bank of Askeladden is open for deposits 24 hours a day! Eh-heh- heh-heh-heh.").also { stage = 1000 } + + 27 -> npcl(FacialExpression.CHILD_FRIENDLY,"I do!").also { stage++ } + 28 -> playerl(FacialExpression.ASKING,"Then why did you sign this guarantee that you will never enter it again?").also { stage++ } + 29 -> npcl(FacialExpression.CHILD_FRIENDLY,"Aha! It is because I am cunning! That guarantee says that Askeladden will never enter the longhall again!").also { stage++ } + 30 -> npcl(FacialExpression.CHILD_FRIENDLY,"But when I have completed my Fremennik trials, and passed my trial of manhood,").also { stage++ } + 31 -> npcl(FacialExpression.CHILD_LOUDLY_LAUGHING,"I will be given a new name, as is our custom, and will therefore not be Askeladden anymore!").also { stage++ } + 32 -> npcl(FacialExpression.CHILD_LOUDLY_LAUGHING,"That guarantee isn't worth the paper it's written on!! You didn't think I would give up going to the longhall for only 5000 did you?").also { stage++ } + 33 -> playerl(FacialExpression.ANNOYED,"Knowing you, I guess I didn't.").also { stage = 1000 } + + 35 -> npcl(FacialExpression.CHILD_NORMAL,"That's a shame. You should speak to the merchant.").also { stage = 1000 } + + 40 -> npcl(FacialExpression.CHILD_FRIENDLY,"Hey buddy! That ain't my name no more! My new Fremennik name is Larravak! What's yours?").also { stage++ } + 41 -> playerl(FacialExpression.HAPPY,"My Fremennik name is ${player.getAttribute("fremennikname","lebron james")}.").also { stage++ } + 42 -> npcl(FacialExpression.CHILD_LOUDLY_LAUGHING,"Ha! Ain't as good as my name buddy! So what can I do ya for?").also { stage++ } + 43 -> options("Ask about things to do","Ask for a new pet rock").also { stage++ } + 44 -> when(buttonId){ + 1 -> playerl(FacialExpression.ASKING,"So, Askeladd- sorry, Larravak; What is there to do around here now that we are both Fremenniks?").also { stage++ } + 2 -> playerl(FacialExpression.ASKING,"Can I have another pet rock? I lost mine...").also { stage = 50 } + } + 45 -> npcl(FacialExpression.CHILD_THINKING,"I guess you could do a bit of shopping. We got fresh fish at the docks, and some armour and weapons at Skulgrimen's place.").also { stage++ } + 46 -> playerl(FacialExpression.HAPPY,"Okay, thanks.").also { stage = 1000 } + + 50 -> npcl(FacialExpression.CHILD_FRIENDLY,"Sure thing buddy! I'd say take better care of this one, but it's just a rock! I have hundreds of them! Go wild!").also { + player.inventory.add(Item(Items.PET_ROCK_3695)) + stage = 1000 + } + + 55 -> npcl(FacialExpression.CHILD_FRIENDLY,"Hey there, buddy. You're an outerlander, huh? I'm not really supposed to talk to you.").also { stage++ } + 56 -> playerl(FacialExpression.ASKING,"Why not?").also { stage++ } + 57 -> npcl(FacialExpression.CHILD_THINKING,"I dunno buddy. Some stupid tradition or other. We're always told not to talk to outerlanders unless the Chieftain has allowed it.").also { stage++ } + 58 -> playerl(FacialExpression.ASKING,"The Chieftain? Who is that?").also { stage++ } + 59 -> npcl(FacialExpression.CHILD_FRIENDLY,"His names Brundt, buddy. He's a real boring guy. You can find him in the long hall there.").also { stage++ } + 60 -> playerl(FacialExpression.ASKING,"Can you take me to see him?").also { stage++ } + 61 -> npcl(FacialExpression.CHILD_FRIENDLY,"Sorry buddy, I'm not allowed into the long hall. Don't worry, he's easy to spot. He's the one in the fancy helmet. Oh, and he only has one eye.").also { stage++ } + 62 -> playerl(FacialExpression.ASKING,"He's a cyclops?").also { stage++ } + 63 -> npcl(FacialExpression.CHILD_NORMAL,"Nah, nah, nah... He just wears an eyepatch! Well, see ya around buddy!").also { stage = 1000 } 1000 -> end() diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.kt index 2da22cb59..960905bd6 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.kt @@ -1,14 +1,70 @@ package rs09.game.content.quest.members.thefremenniktrials +import api.addItem +import api.removeItem import core.game.node.entity.player.Player -import core.game.node.entity.player.info.PlayerDetails import core.plugin.Initializable import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import kotlin.random.Random @Initializable class ChieftanBrundt(player: Player? = null) : DialoguePlugin(player){ + val gender = if (player?.isMale == true){"brother"} else "sister" + val fName = player?.getAttribute("fremennikname","bringle") + override fun open(vararg args: Any?): Boolean { - if(player?.questRepository?.getStage("Fremennik Trials")!! == 0) { + if(player?.inventory?.contains(3701,1) == true){ + playerl(FacialExpression.HAPPY,"I got Sigli's hunting map for you.") + stage = 515 + return true + } + else if(player?.inventory?.contains(3708,1) == true){ + playerl(FacialExpression.ASKING,"So cutting sales tax isn't going to ruin your economy here or anything?") + stage = 520 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"I've got this trade item. Is it for you?") + stage = 525 + return true + } + if(player?.getAttribute("sigmund-steps",0) == 5){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a map to unspoiled hunting grounds, do you?") + stage = 510 + return true + } + else if(player?.getAttribute("sigmund-steps",0) == 4){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a guarantee of a reduction on sales taxes, do you?") + stage = 500 + return true + } + else if(player.getAttribute("fremtrials:votes",0) == 7){ + npcl(FacialExpression.HAPPY," Greetings again outerlander! How goes your attempts to gain votes with the council of elders?") + stage = 545 + return true + } + else if(player.getAttribute("fremtrials:votes",0) in 3..6){ + npcl(FacialExpression.HAPPY," Greetings again outerlander! How goes your attempts to gain votes with the council of elders?") + stage = 540 + return true + } + else if(player.getAttribute("fremtrials:votes",0) == 1){ + npcl(FacialExpression.HAPPY," Greetings again outerlander! How goes your attempts to gain votes with the council of elders?") + stage = 535 + return true + } + else if(player.getAttribute("fremtrials:votes",-1) == 0){ + npcl(FacialExpression.HAPPY," Greetings again outerlander! How goes your attempts to gain votes with the council of elders?") + stage = 530 + return true + } + else if(player.questRepository.isComplete("Fremennik Trials")){ + npcl(FacialExpression.HAPPY,"Hello again, $gender $fName. I hope your travels have brought you wealth and joy! What compels you to visit me on this day?") + stage = 600 + return true + } + else if(player?.questRepository?.getStage("Fremennik Trials")!! == 0) { npc("Greetings outlander!") stage = 0 } @@ -20,11 +76,24 @@ class ChieftanBrundt(player: Player? = null) : DialoguePlugin(player){ //Pre-Quest 0 -> { options("What is this place?", "Why will no-one talk to me?", "Do you have any quests?", "Nice hat!");stage++} 1 -> when(buttonId){ - 1 -> TODO("Not yet implemented") - 2 -> TODO("Not yet implemented") - 3 -> {player("Do you have any quests?");stage = 300} - 4 -> TODO("Not yet implemented") + 1 -> playerl(FacialExpression.HAPPY,"What is this place?").also { stage ++ } + 2 -> playerl(FacialExpression.ASKING,"Why will no-one talk to me?").also { stage = 5 } + 3 -> player("Do you have any quests?").also {stage = 300} + 4 -> playerl(FacialExpression.HAPPY,"Nice hat!").also { stage = 15 } } + 2 -> npcl(FacialExpression.HAPPY,"This place? Why, this is Relleka! Homeland of all Fremennik! I do not recognise your face outerlander; Where do you come from?").also { stage++ } + 3 -> playerl(FacialExpression.HAPPY,"Hmmm... I will not press the issue then outerlander. How may my tribe and I help you?").also { stage = 0 } + + 5 -> npcl(FacialExpression.HAPPY,"Do not take it personally, outerlander! We are a simple people, and it is our experience that keeping ourselves to ourselves is best.").also { stage++ } + 6 -> npcl(FacialExpression.HAPPY,"This is why speaking to outerlanders is forbidden.").also { stage++ } + 7 -> npcl(FacialExpression.HAPPY,"We do not wish to enter war with the outerlanders and their strange magics, so we limit all unauthorised communication.").also { stage++ } + 8 -> playerl(FacialExpression.ASKING,"Then how come you're talking to me?").also { stage++ } + 9 -> npcl(FacialExpression.HAPPY,"Ah, this is because I am the chieftan. I am the one who authorised contact. You will not find many of my tribe so forthcoming with you, as I.").also { stage++ } + 10 -> playerl(FacialExpression.ASKING,"Is there a way for you to authorise your tribe to talk to me then?").also { stage++ } + 11 -> npcl(FacialExpression.HAPPY,"Well, there is one way... but I doubt it is of any interest to you.").also { stage = 0 } + + 15 -> npcl(FacialExpression.ANNOYED,"Don't mock me outerlander; this helm has saved my life more times than I care to recall right now.").also { stage = 1000 } + //Do you have any quests? 300 -> {npc("Quests, you say outlander? Well, I would not call it a","quest as such, but if you are brave of heart and strong","of body, perhaps..."); stage++} @@ -60,6 +129,132 @@ class ChieftanBrundt(player: Player? = null) : DialoguePlugin(player){ //No, I'm not interested 340 -> TODO("Not implemented yet") + 500 -> npcl(FacialExpression.THINKING,"A reduction on sales taxes? Why, I am the only one in the Fremennik who may authorise such a thing. What does an outerlander want with that?").also { stage++ } + 501 -> playerl(FacialExpression.HAPPY,"Actually, it's not for me. I need to get it as part of my trials").also { stage++ } + 502 -> npcl(FacialExpression.THINKING,"Hmmm. Interesting. Your trials seem to be very different to those I took as a young lad.").also { stage++ } + 503 -> npcl(FacialExpression.NEUTRAL,"Well, I am not adverse in principle to giving a slight tax break to our shops.").also { stage++ } + 504 -> npcl(FacialExpression.THINKING,"There will of course be a shortfall in the tribe's income, that will need to be made up for elsewhere, however.").also { stage++ } + 505 -> npcl(FacialExpression.ASKING,"How about this. For many years Sigli has been the only one in the tribe who knows the locations of the best hunting grounds where game is easiest to catch.").also { stage++ } + 506 -> npcl(FacialExpression.ASKING,"If you can persuade him to let the entire tribe know these hunting grounds, then we can increase productivity within the tribe, and any shortfall caused by lowering sales taxes will be covered.").also { stage++ } + 507 -> npcl(FacialExpression.HAPPY,"I think this is a more than fair arrangement to make, dont you?").also { stage++ } + 508 -> playerl(FacialExpression.HAPPY,"Yeah, that sounds very fair.").also { stage++ } + 509 -> npcl(FacialExpression.HAPPY,"Speak to Sigli then, and you may have my promise to reduce our sales taxes. And best of luck with the rest of your trials.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + + 510 -> npcl(FacialExpression.ANNOYED,"Ah, outerlander... if you wish to become a Fremennik you should try and pay more attention to what people tell you... ").also { stage++ } + 511 -> npcl(FacialExpression.ANNOYED,"Sigli the hunter is the only one who knows of such hunting grounds. Go and request his knowledge.").also { stage = 1000 } + + 515 -> npcl(FacialExpression.HAPPY,"Excellent work outerlander! And so quickly, too! Here, you may take my financial report promising reduced sales taxes on all goods.").also { + removeItem(player,3701) + addItem(player,3708) + stage = 1000 + } + + 520 -> npcl(FacialExpression.HAPPY,"Not at all outerlander; now that we have Sigli's map we can increase the amount of hunts we run, and make up any shortfall that way.").also { stage = 1000 } + + 525 -> npcl(FacialExpression.ANNOYED,"Not unless it's a map of the hunting grounds.").also { stage = 1000 } + + 530 -> playerl(FacialExpression.HAPPY,"I don't have any votes yet.").also { stage++ } + 531 -> npcl(FacialExpression.HAPPY,"Go and speak to the twelve members of the council of elders who live in this village. I am sure at least a few will be prepared to vote for you.").also { stage = 550 } + + 535 -> playerl(FacialExpression.HAPPY,"I only have one vote so far.").also { stage++ } + 536 -> npcl(FacialExpression.HAPPY,"Hmmm... well that is certainly a good start I would say. Keep up the good work!").also { stage++ } + 537 -> npcl(FacialExpression.HAPPY,"Remember: You need to get at least seven council votes to be accepted as a member of the Fremennik.").also { stage = 550 } + + 540 -> playerl(FacialExpression.HAPPY,"I only have ${player.getAttribute("fremtrials:votes",0)} votes so far.").also { stage++ } + 541 -> npcl(FacialExpression.HAPPY,"Hmmm... you are doing very well so far, outerlander. Keep up the good work!").also { stage = 537 } + + 545 -> playerl(FacialExpression.HAPPY,"I have seven members of the council prepared to vote in my favour now!").also { stage++ } + 546 -> npcl(FacialExpression.HAPPY,"I know outerlander, for I have been closely monitoring your progress so far!").also {stage++} + 547 -> npcl(FacialExpression.HAPPY,"Then let us put the formality aside, and let me personally welcome you into the Fremennik! May you bring us honour!").also { + if(player.inventory.freeSlots() >= 10){ + println(GenerateFremennikName()) + player.setAttribute("/save:fremennikname", GenerateFremennikName()) + stage = 560 + } + else stage = 548 + + } + 548 -> sendDialogue("You require 10 free spaces in your backpack to claim your reward.").also { stage = 1000 } + + 550 -> npcl(FacialExpression.HAPPY,"If you need any help with your trials, I suggest you speak to Askeladden. He is currently doing his own trials of manhood to become a true Fremennik.") + + 560 -> npcl(FacialExpression.HAPPY,"From this day onward, you are outerlander no more! In honour of your acceptance into the Fremennik, you gain a new name: ${player.getAttribute("fremennikname","how did u break this")}.").also { + cleanupAttributes(player) + player.questRepository.getQuest("Fremennik Trials").finish(player) + stage = 1000 + } + + 600 -> options("I just came to say hello.","Do you have any quests?","Nice hat!","Can I hear the history of your people?").also { stage++ } + 601 -> when(buttonId){ + 1 -> playerl(FacialExpression.HAPPY,"I just came by to say hello.").also { stage++ } + 2 -> playerl(FacialExpression.ASKING,"Do you have any quests?").also { stage = 605 } + 3 -> playerl(FacialExpression.HAPPY,"Nice hat!").also { stage = 610 } + 4 -> playerl(FacialExpression.ASKING,"Can I hear the history of your people?").also { stage = 615 } + } + 602 -> npcl(FacialExpression.HAPPY,"Well met, $gender $fName. it is always good to see your face in glorious Rellekka once more!").also { stage = 1000 } + + 605 -> npcl(FacialExpression.HAPPY,"Not at the moment, $fName. Rest assured, should your services to the Fremennik be required, I will call upon you").also { stage = 1000 } + + 610 -> npcl(FacialExpression.HAPPY,"Aye that it is, $gender $fName. Should you desire one of your own, you should go to Skulgrimen's shop and see what they have available!").also { stage = 1000 } + + 615 -> npcl(FacialExpression.HAPPY,"Why, of course, $fName! Do not say 'your people' like that, for you are now a Fremennik yourself! What did you want to hear of?").also { stage++ } + 616 -> options("Tell me of the finding of Koschei","Tell me of the lands to the North","Tell me of the outerlanders","Don't tell me anything").also { stage++ } + 617 -> when(buttonId){ + 1 -> playerl(FacialExpression.HAPPY,"I'm interested in finding out about that mysterious warrior I fought as part of Thorvalds' combat trial. His name is Koschei I believe.").also { stage++ } + 2 -> playerl(FacialExpression.HAPPY,"I would like to hear of the lands across the ocean to the North.").also { stage = 635 } + 3 -> playerl(FacialExpression.HAPPY,"I would like to hear a little of the history between the Fremenniks and the outerlanders.").also { stage = 645 } + 4 -> playerl(FacialExpression.HAPPY,"Actually, history isn't really my thing.").also { stage = 665 } + } + + 618 -> npcl(FacialExpression.HAPPY,"Ah... the deathless one... We do not even know if Koschei is his name, when we found him he had no memory,").also { stage++ } + 619 -> npcl(FacialExpression.HAPPY,"he was simply repeating that single word. Whatever happened to him must have rattled his soul so hard that his memory ran away from him,").also { stage++ } + 620 -> npcl(FacialExpression.HAPPY,"and he has not yet found its hiding place.").also { stage++ } + 621 -> playerl(FacialExpression.ASKING,"So how exactly did you find him?").also { stage++ } + 622 -> npcl(FacialExpression.HAPPY,"Well, it was a raiding party like any other. We had just struck one of the smaller northern islands to harvest supplies by combat, as our laws allow,").also { stage++ } + 623 -> npcl(FacialExpression.HAPPY,"when we saw a figure in the icey waters. As we were at least a 3 week sail from any port, and saw no other ships nearby, he must have been there some time.").also { stage++ } + 624 -> npcl(FacialExpression.HAPPY,"We could not leave someone to the cold death of the ocean, even an outerlander, so we fished him aboard. He muttered continually, but his words made no sense.").also { stage++ } + 625 -> npcl(FacialExpression.HAPPY,"He had no clothes or possessions with him, and seemed to have been burnt somehow before he had landed in the water. I cannot help but wonder what burnt him,").also { stage++ } + 626 -> npcl(FacialExpression.HAPPY,"for as you may have seen, he is incredibly powerful and resistant to damage by any means I know of! Anyway, we decided to bring him back to Rellekka,").also { stage++ } + 627 -> npcl(FacialExpression.HAPPY,"for he did not seem of good health or sound mind, and simply repeated the word Koschei over and over. Yrsa tended to him for many weeks, until one day it was as though a new soul had entered his burnt and broken body.").also { stage++ } + 628 -> npcl(FacialExpression.HAPPY,"He suddenly left her house one day, fully healed, and able to speak to us as though nothing had happened to him.").also { stage++ } + 629 -> npcl(FacialExpression.HAPPY,"He still had no recollection of how he had come to be in the icey ocean, or of who he was, or where he had come from, but this did not matter to us or him.").also { stage++ } + 630 -> npcl(FacialExpression.HAPPY,"He took his trials of adulthood, as you did, and has been a boon to our clan ever since. Someday I fear he may regain his memory, and leave us for his past...").also { stage++ } + 631 -> npcl(FacialExpression.HAPPY,"But I will always respect any decision he decides to make should that day ever come upon us. Until then, he is more than welcome to stay here.").also { stage++ } + 632 -> npcl(FacialExpression.HAPPY,"So, $fName, was there anything more you wished to hear?").also { stage = 616 } + + 635 -> npcl(FacialExpression.HAPPY,"Well, I think the best thing for you would be to go to the docks and ask to join one of our longboats on a journey. My affairs are concentrated mostly on Rellekka,").also { stage++ } + 636 -> npcl(FacialExpression.HAPPY,"So my knowledge is not great, but I will happily share what little I do know with you, $fName. North of this town the atmosphere becomes bitterly cold.").also { stage++ } + 637 -> npcl(FacialExpression.HAPPY,"There are a number of small inhabited islands that we have sea routes with. The largest of these is possibly Miscellania,").also { stage++ } + 638 -> npcl(FacialExpression.HAPPY,"Although I hear that there has been some recent incident with their monarch, but I don't know the details.").also { stage++ } + 639 -> npcl(FacialExpression.HAPPY,"There is also of course the island of the moon clan, who change with the tides. They are our bitterest enemies, and we are currently at war with them.").also { stage++ } + 640 -> npcl(FacialExpression.HAPPY,"They are an evil people, equally cursed and blessed by the magic in their blood. Beyond those islands, there is the large frozen wasteland we call Acheron.").also { stage++ } + 641 -> npcl(FacialExpression.HAPPY,"It is an inhospitable land, and you will need an agile and sturdy body just to keep alive in its perils.").also { stage++ } + 642 -> npcl(FacialExpression.HAPPY,"As I say, my knowledge outside of this town is rather limited, and I know no more than this.").also { stage++ } + 643 -> npcl(FacialExpression.HAPPY,"Was there anything else you wished to hear tell of?").also { stage = 616 } + + 645 -> npcl(FacialExpression.HAPPY,"Ah, now that is something I know a great deal about. Believe it or not, all outerlanders were once orginally Fremenniks.").also { stage++ } + 646 -> npcl(FacialExpression.HAPPY,"When first man came to these lands all were Fremenniks, and followed our ways. We lived a happy life, and never settled in one place for long.").also { stage++ } + 647 -> npcl(FacialExpression.HAPPY,"We travelled by boat along the coastlines, never taking more from the land than could be regrown by the same time in the following year.").also { stage++ } + 648 -> npcl(FacialExpression.HAPPY,"However, many moons past, some of our tribesmen were weary of constantly travelling the lands, and decided to build themselves permanent homes.").also { stage++ } + 649 -> npcl(FacialExpression.HAPPY,"Unfortunately, the other races that had also migrated here did not like this. They waged war against us at every opportunity.").also { stage++ } + 650 -> npcl(FacialExpression.HAPPY,"We were driven mostly to the coastlines, where we could escape by boat when attacked. Remember, at this time we had no real way to defend against constant attack.").also { stage++ } + 651 -> npcl(FacialExpression.HAPPY,"Then one day one of our Seers, whose full name has been lost in the telling of this tale, discovered a cave full of strange rocks.").also { stage++ } + 652 -> npcl(FacialExpression.HAPPY,"This rock would never be consumed, no matter how much we took, and sparkled at its peak, and broke off in small and regular sized chunks when mined.").also { stage++ } + 653 -> npcl(FacialExpression.HAPPY,"Stranger than this, we found that these rocks would become filled with power when taken to certain places across this land! There was a terrible argument in our tribe!").also { stage++ } + 654 -> npcl(FacialExpression.HAPPY,"Some said that we should take as many of these rocks as we could, and use them in defending against our enemies' attacks!").also { stage++ } + 655 -> npcl(FacialExpression.HAPPY,"Others said that we had found a place that belonged only to the gods, and that should we steal what was not ours we would find only torment and misery.").also { stage++ } + 656 -> npcl(FacialExpression.HAPPY,"We voted on this, and decided that it was in the best interests of the tribe to leave these strange rocks where they lay, for the gods can be spiteful and cruel,").also { stage++ } + 657 -> npcl(FacialExpression.HAPPY,"especially to those who do not treat them with the respect they desire. Some of our number refused to accept this ruling by our council however.").also { stage++ } + 658 -> npcl(FacialExpression.HAPPY,"They began to mine these rocks, and set up transport systems to the various places of power that enchanted them. They even created temples at each of these places!").also { stage++ } + 659 -> npcl(FacialExpression.HAPPY,"This was going too far! We had no choice, but to expel them from our tribe forever!").also { stage++ } + 660 -> npcl(FacialExpression.HAPPY,"We turned our backs upon them, and let them know they would never be welcome back to our tribes until they had released themselves from the rocks.").also { stage++ } + 661 -> npcl(FacialExpression.HAPPY,"This is the tale of how the outerlanders came about; through stealing from the gods, and from betraying our ideals. This is why we show them no trust.").also { stage++ } + 662 -> npcl(FacialExpression.HAPPY,"Was there something else you wished to hear?").also { stage = 616 } + + 665 -> npcl(FacialExpression.HAPPY,"Well let me know should you wish to hear our lore and histories. We value them highly.").also { stage = 1000 } 1000 -> end() } @@ -75,4 +270,68 @@ class ChieftanBrundt(player: Player? = null) : DialoguePlugin(player){ return intArrayOf(1294) } +} + +fun GenerateFremennikName(): String { + val namePrefixes = arrayOf( + "Bal", + "Bar", + "Dal", + "Dar", + "Den", + "Dok", + "Jar", + "Jik", + "Lar", + "Rak", + "Ral", + "Ril", + "Sig", + "Tal", + "Thor", + "Ton" + ) + val nameSuffixes = arrayOf( + "dar", + "dor", + "dur", + "kal", + "kar", + "kir", + "kur", + "lah", + "lak", + "lim", + "lor", + "rak", + "rar", + "tin", + "ton", + "tor", + "vald" + ) + val randomPrefix = Random.nextInt(0, 15) + val randomSuffix = Random.nextInt(0, 16) + + return "${namePrefixes[randomPrefix]}${nameSuffixes[randomSuffix]}" +} + +fun cleanupAttributes(player: Player){ + player.removeAttribute("PeerStarted") + player.removeAttribute("housepuzzlesolved") + player.removeAttribute("fremtrials:peer-vote") + player.removeAttribute("fremtrials:votes") + player.removeAttribute("fremtrials:sigmund-vote") + player.removeAttribute("fremtrials:manni-vote") + player.removeAttribute("fremtrials:swensen-vote") + player.removeAttribute("fremtrials:olaf-accepted") + player.removeAttribute("fremtrials:lalli-talkedto") + player.removeAttribute("fremtrials:askeladden-talkedto") + player.removeAttribute("hasWool") + player.removeAttribute("lyreConcertPlayed") + player.removeAttribute("fremtrials:olaf-vote") + player.removeAttribute("fremtrials:sigli-accepted") + player.removeAttribute("fremtrials:thorvald-vote") + player.removeAttribute("fremtrials:sigli-vote") + player.removeAttribute("riddlesolved") } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/CouncilWorkerFTDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/CouncilWorkerFTDialogue.kt index d9502019d..e86eb6e1a 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/CouncilWorkerFTDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/CouncilWorkerFTDialogue.kt @@ -5,14 +5,16 @@ import rs09.game.content.dialogue.DialogueFile import rs09.tools.END_DIALOGUE import rs09.tools.START_DIALOGUE +val COUNCIL_WORKER = 1287 + class CouncilWorkerFTDialogue(val questStage: Int,var isBeerInteraction: Boolean = false) : DialogueFile(){ override fun handle(componentID: Int, buttonID: Int) { if(isBeerInteraction){ when(stage){ - START_DIALOGUE -> {npc("Oh, thank you much ${if(player?.appearance?.isMale!!) "sir" else "miss"}");stage++} - 1 -> {npc("Ta very much like. That'll hit the spot nicely.. Here,","You can have this. I picked it up as a souvenir on me","last holz");player?.inventory?.add( + START_DIALOGUE -> {npc(COUNCIL_WORKER,"Oh, thank you much ${if(player?.appearance?.isMale!!) "sir" else "miss"}");stage++} + 1 -> {npc(COUNCIL_WORKER,"Ta very much like. That'll hit the spot nicely.. Here,","You can have this. I picked it up as a souvenir on me","last holz");player?.inventory?.add( Item(3713) ); player?.inventory?.remove(Item(1917)); stage = END_DIALOGUE} } @@ -21,13 +23,13 @@ class CouncilWorkerFTDialogue(val questStage: Int,var isBeerInteraction: Boolean else if(questStage in 1..99){ when(stage){ START_DIALOGUE -> if(player?.questRepository?.getStage("Fremennik Trials")!! > 0){ - player("I know this is an odd question, but are you","a member of the elder council?") + player("I know this is an odd question, but are you","a member of the elder council?"); stage = 1 } else { end() } - 1 -> {npc("'fraid not, ${if(player?.appearance?.isMale!!) "sir" else "miss"}"); stage++} - 2 -> {npc("Say, would you do me a favor? I'm quite parched.","If you bring me a beer, I'll make it worthwhile.");stage++} - 3 -> if(player?.inventory?.containsItem(Item(1917))!!){ + 1 -> {npc(COUNCIL_WORKER,"'fraid not, ${if(player?.appearance?.isMale!!) "sir" else "miss"}"); stage++} + 2 -> {npc(COUNCIL_WORKER,"Say, would you do me a favor? I'm quite parched.","If you bring me a beer, I'll make it worthwhile.");stage++} + 3 -> if(player?.inventory?.containsItem(Item(1917)) == true){ player("Oh, I have one here! Take it.") stage = 0 isBeerInteraction = true @@ -36,7 +38,5 @@ class CouncilWorkerFTDialogue(val questStage: Int,var isBeerInteraction: Boolean } } } - } - } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FishermanDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FishermanDialogue.kt new file mode 100644 index 000000000..c24ae8093 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FishermanDialogue.kt @@ -0,0 +1,78 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.addItem +import api.removeItem +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.player.Player +import core.plugin.Initializable + +@Initializable +class FishermanDialogue(player: Player? = null) : DialoguePlugin(player) { + + override fun open(vararg args: Any?): Boolean { + if(player?.inventory?.contains(3704,1) == true){ + playerl(FacialExpression.HAPPY,"Here. I got you your map.") + stage = 15 + return true + } + else if(player?.inventory?.contains(3703,1) == true){ + playerl(FacialExpression.ASKING,"I don't see what's so special about this so called exotic fish.") + stage = 16 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"Is this trade item for you?") + stage = 17 + return true + } + if(player?.getAttribute("sigmund-steps", 0) == 8){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a map of deep sea fishing spots do you?") + stage = 10 + return true + } + else if(player?.getAttribute("sigmund-steps", 0) == 7){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find an exotic and extremely odd fish, do you?") + stage = 1 + return true + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> npcl(FacialExpression.AMAZED,"Ah, so even outerlanders have heard of my amazing catch the other day!").also { stage++ } + 2 -> playerl(FacialExpression.THINKING,"You have it? Can I trade you something for it?").also { stage++ } + 3 -> npcl(FacialExpression.HAPPY,"As exotic looking as it is, it is bad eating. I will happily trade it if you can find me the secret map of the best fishing spots that the navigator has hidden away.").also { stage++ } + 4 -> playerl(FacialExpression.AMAZED,"Is that all?").also { stage++ } + 5 -> npcl(FacialExpression.HAPPY,"Indeed it is, outerlander. The only reason I sit out here in the cold all day long is so I don't have to pay his outrageous prices.").also { stage++ } + 6 -> npcl(FacialExpression.HAPPY,"By getting me his copy of that map, I will finally be self sufficient. I might even make a profit!").also { stage++ } + 7 -> playerl(FacialExpression.THINKING,"I'll see what I can do.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 10 -> npcl(FacialExpression.ANNOYED,"You should pay attention when I speak! I already told you, that rip off navigator has it, and I want it!").also { stage = 1000 } + + 15 -> npcl(FacialExpression.HAPPY,"Great work outerlander! With this, I can finally catch enough fish to make an honest living from it! Here, have the stupid fish.").also { + removeItem(player,3704) + addItem(player,3703) + stage = 1000 + } + + 16 -> npcl(FacialExpression.ANNOYED,"Me neither, outerlander. That is why I gave it to you.").also { stage = 1000 } + + 17 -> npcl(FacialExpression.ANNOYED,"I don't think so.").also { stage = 1000 } + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return FishermanDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1302) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FremennikSailorDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FremennikSailorDialogue.kt new file mode 100644 index 000000000..7b69ae5fc --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FremennikSailorDialogue.kt @@ -0,0 +1,80 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.addItem +import api.removeItem +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.player.Player +import core.plugin.Initializable + +@Initializable +class SailorDialogue (player: Player? = null) : DialoguePlugin(player) { + + override fun open(vararg args: Any?): Boolean { + if(player?.inventory?.contains(3699,1) == true){ + playerl(FacialExpression.HAPPY,"You'll be glad to know I have had a love song written just for you by Olaf. So can I have that flower of yours now?") + stage = 15 + } + else if(player?.inventory?.contains(3698,1) == true){ + playerl(FacialExpression.ASKING,"So tell me... who is this woman that you are trying to impress anyway?") + stage = 20 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"I've got an item to trade.") + stage = 25 + return true + } + else if(player?.getAttribute("sigmund-steps",0) == 2){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a love ballad, do you?") + stage = 10 + return true + } + else if(player?.getAttribute("sigmund-started",false)!!){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a unique flower from across the sea, do you?") + stage = 1 + return true + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> npcl(FacialExpression.HAPPY,"Ah! Even the outerlanders have heard of my mysterious flower! I found it in a country far far away from here!").also { stage++ } + 2 -> playerl(FacialExpression.ASKING,"Can I buy it from you?").also { stage++ } + 3 -> npcl(FacialExpression.NEUTRAL,"I'm afraid not, outerlander. There is a woman in this village whose heart I seek to capture, and I think giving her this strange flower might be my best bet with her.").also { stage++ } + 4 -> playerl(FacialExpression.THINKING,"Maybe you could let me have the flower and do something else to impress her?").also { stage++ } + 5 -> npcl(FacialExpression.HAPPY,"Hmm... that is not a totally stupid idea outerlander. I know she is a lover of music, and a romantic ballad might be just the thing with which to woo her.").also { stage++ } + 6 -> npcl(FacialExpression.THINKING,"Unfortunately I don't have a musical bone in my entire body, so someone else will have to write it for me.").also { stage++ } + 7 -> playerl(FacialExpression.ASKING,"So if I can find someone to write you a romantic ballad, you will give me your flower?").also { stage++ } + 8 -> npcl(FacialExpression.HAPPY,"That sounds like a fair deal to me, outerlander.").also { + player.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 10 -> npcl(FacialExpression.NEUTRAL,"Well, the only musician I know of in these parts would be that terrible bard Olaf... Ask him.").also { stage = 1000 } + + 15 -> npcl(FacialExpression.HAPPY,"Oh. It's by Olaf? Hmm. Well, a deal's a deal. I just hope it's better than the usual rubbish he comes up with, or my chances are worse than ever.").also { + removeItem(player,3699) + addItem(player,3698) + stage = 1000 + } + + 20 -> npcl(FacialExpression.HAPPY,"It's Thora, the longhall barkeep. Please don't tell her though. She's not like the rest of the Fremennik girls, she has a secret desire to see the world.").also { stage++ } + 21 -> npcl(FacialExpression.HAPPY,"Being a sailor, I can really relate to that.").also { stage = 1000 } + + 25 -> npcl(FacialExpression.HAPPY,"Remember, it's not for me unless it's a love ballad.") + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin{ + return SailorDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1385) + } + +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FremennikTrials.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FremennikTrials.kt index b0ea9d5a8..8408d94ff 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FremennikTrials.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/FremennikTrials.kt @@ -1,13 +1,16 @@ -/* package core.game.content.quest.fremtrials import core.game.node.entity.player.Player +import api.* import core.game.node.entity.player.link.quest.Quest import core.game.node.entity.skill.Skills +import core.game.node.item.Item import core.plugin.Initializable +import org.rs09.consts.Items +import rs09.game.content.activity.allfiredup.AFUBeacon @Initializable -class FremennikTrials : Quest("Fremennik Trials",64,63,3,347,0,1,10){ +class FremennikTrials : Quest("Fremennik Trials",62,63,3,347,0,1,10){ class SkillRequirement(val skill: Int?, val level: Int?) @@ -30,7 +33,8 @@ class FremennikTrials : Quest("Fremennik Trials",64,63,3,347,0,1,10){ line(player,"I can start this quest by speaking to !!Chieftan Brundt?? on",line++) line(player,"the !!Fremennik Longhall,?? which is in the town of !!Rellekka?? to",line++) line(player,"the north of !!Sinclair Mansion??.",line) - } else { + } + else if(started && stage != 100){ line(player,"In order to join the Fremenniks, I need to",line++) line(player,"!!earn the approval?? of !!7 members?? of the elder council.",line++) line(player,"I've written down the members who I can try to help:",line++) @@ -38,8 +42,48 @@ class FremennikTrials : Quest("Fremennik Trials",64,63,3,347,0,1,10){ line(player,"Swensen the Navigator",line++,player.getAttribute("fremtrials:swensen-vote",false)) line(player,"Sigli the Huntsman",line++,player.getAttribute("fremtrials:sigli-vote",false)) line(player,"Olaf the Bard",line++,player.getAttribute("fremtrials:olaf-vote",false)) + line(player,"Thorvald the Warrior",line++,player.getAttribute("fremtrials:thorvald-vote",false)) + line(player,"Sigmund the Merchant",line++,player.getAttribute("fremtrials:sigmund-vote",false)) + line(player,"Peer the Seer",line++,player.getAttribute("fremtrials:peer-vote",false)) line(player,"So far I have gotten ${player.getAttribute("fremtrials:votes",0)} votes.",line++) } + else if(stage == 100){ + line(player,"I made my way to the far north of !!Kandarin?? and found",line++) + line(player,"the Barbarian hometown of !!Rellekka??. The tribe that live",line++) + line(player,"there call themselves the !!Fremennik??, and offerred me the",line++) + line(player,"chance to join them if I could pass their trials.",line++) + line += 1 + line(player,"I managed to persuade !!seven?? of the !!twelve?? council of",line++) + line(player,"elders to vote for me at their next meeting. and become an",line++) + line(player,"honorary member of the !!Fremennik??.",line++) + line += 1 + line(player,"---QUEST COMPLETE---",line++) + line(player,"They also gave me a new name:",line++) + line(player,player.getAttribute("fremennikname","hingerdinger lmao"),line++) + } + } + + override fun finish(player: Player?) { + super.finish(player) + player ?: return + var ln = 10 + player.packetDispatch.sendItemZoomOnInterface(Items.FREMENNIK_HELM_3748, 235, 277, 5) + drawReward(player, "3 Quest points, 2.8k XP in:", ln++) + drawReward(player, "Strength, Defence, Attack,",ln++) + drawReward(player, "Hitpoints, Fishing, Thieving,", ln++) + drawReward(player, "Agility,Crafting, Fletching,", ln++) + drawReward(player, "Woodcutting",ln++) + player.skills.addExperience(Skills.STRENGTH, 2812.4) + player.skills.addExperience(Skills.DEFENCE, 2812.4) + player.skills.addExperience(Skills.ATTACK, 2812.4) + player.skills.addExperience(Skills.HITPOINTS, 2812.4) + player.skills.addExperience(Skills.FISHING, 2812.4) + player.skills.addExperience(Skills.THIEVING, 2812.4) + player.skills.addExperience(Skills.AGILITY, 2812.4) + player.skills.addExperience(Skills.CRAFTING, 2812.4) + player.skills.addExperience(Skills.FLETCHING, 2812.4) + player.skills.addExperience(Skills.WOODCUTTING, 2812.4) + player.questRepository.syncronizeTab(player) } override fun newInstance(`object`: Any?): Quest { @@ -49,4 +93,4 @@ class FremennikTrials : Quest("Fremennik Trials",64,63,3,347,0,1,10){ return this } -}*/ +} diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/KoscheiNPC.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/KoscheiNPC.kt new file mode 100644 index 000000000..345801b68 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/KoscheiNPC.kt @@ -0,0 +1,205 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.* +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.Entity +import core.game.node.entity.combat.BattleState +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.npc.AbstractNPC +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import org.rs09.consts.Items +import org.rs09.consts.NPCs +import rs09.game.world.GameWorld.Pulser +import rs09.game.world.repository.Repository + +/** + * Handles the Koschei npc. + * @author NixWigton + */ +class KoscheiNPC constructor(id: Int = 0, location: Location? = null, session: KoscheiSession? = null) : + AbstractNPC(id, location) { + + /** + * The session. + */ + val session: KoscheiSession? + + /** + * The Koschei type. + */ + var type: KoscheiType? + + /** + * If the fight has commenced. + */ + var isCommenced = false + + /** + * Constructs a new `KoscheiNPC` `Object`. + */ + init { + this.isWalks = true + this.session = session + this.isRespawn = false + type = KoscheiType.forId(id) + } + + override fun init() { + super.init() + Pulser.submit(KoscheiSpawnPulse(session?.player, this)) + } + + override fun handleTickActions() { + super.handleTickActions() + if (session == null) { + return + } + if (!session.player.isActive) { + clear() + return + } + if (isCommenced && !properties.combatPulse.isAttacking) { + properties.combatPulse.attack(session.player) + } + } + + override fun startDeath(killer: Entity) { + if (killer === session!!.player) { + if (type !== KoscheiType.FOURTH_FORM) { + type!!.transform(this, session!!.player) + } else { + session?.player?.sendMessage("Congratulations! You have completed the warriors trial!") + session?.player?.setAttribute("/save:fremtrials:thorvald-vote",true) + session?.player?.setAttribute("/save:fremtrials:votes", session?.player?.getAttribute("fremtrials:votes", 0) + 1) + session?.player?.removeAttribute("fremtrials:warrior-accepted") + addItemOrDrop(session?.player!!, Items.FREMENNIK_BLADE_3757, 1) + session.close() + } + return + } + super.startDeath(killer) + } + + override fun sendImpact(state: BattleState?) { + if (type == KoscheiType.FOURTH_FORM) { + if (session?.player?.skills?.lifepoints!! < 2) { + session.player.fullRestore() + properties.combatPulse.stop() + Pulser.submit(FightEndPulse(session.player, this)) + return + } else { + session.player.skills?.decrementPrayerPoints(session.player.skills?.prayerPoints!!) + } + } + super.sendImpact(state) + } + + override fun construct(id: Int, location: Location, vararg objects: Any): AbstractNPC { + return KoscheiNPC(id, location, null) + } + + override fun isAttackable(entity: Entity, style: CombatStyle, message: Boolean): Boolean { + if (session == null) { + return false + } + return session.player == entity + } + + override fun canSelectTarget(target: Entity): Boolean { + if (target is Player) { + if (target != session!!.player) { + return false + } + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.KOSCHEI_THE_DEATHLESS_1290, NPCs.KOSCHEI_THE_DEATHLESS_1291, NPCs.KOSCHEI_THE_DEATHLESS_1292, NPCs.KOSCHEI_THE_DEATHLESS_1293) + } + + /** + * Represents a Koschei type. + * @author NixWigton + */ + enum class KoscheiType(var npcId: Int, var appearMessage: String?, vararg var appearDialogues: String?) { + FIRST_FORM(NPCs.KOSCHEI_THE_DEATHLESS_1290, "You must prove yourself... now!"), + SECOND_FORM(NPCs.KOSCHEI_THE_DEATHLESS_1291, "This is only the beginning; you can't beat me!", "It seems you have some idea of combat after all,", "outerlander! I will not hold back so much this time!"), + THIRD_FORM(NPCs.KOSCHEI_THE_DEATHLESS_1292, "Foolish mortal; I am unstoppable.", "Impressive start... But now we fight for real!"), + FOURTH_FORM(NPCs.KOSCHEI_THE_DEATHLESS_1293, "Aaaaaaaarrgghhhh! The power!", "You show some skill at combat... I will hold back no", "longer! This time you lose your prayer however, and", "fight like a warrior!"); + + /** + * Transforms the new npc. + */ + fun transform(koschei: KoscheiNPC, player: Player) { + val newType = next() + koschei.lock() + player.properties.combatPulse.stop() + koschei.properties.combatPulse.stop() + koschei.walkingQueue.queue.clear() + koschei.animate(Animation(1057)) + koschei.type = newType + koschei.transform(newType.npcId) + Pulser.submit(KoscheiSpawnPulse(player, koschei)) + } + + /** + * Gets the next type. + * @return the type. + */ + operator fun next(): KoscheiType { + return values()[ordinal + 1] + } + + companion object { + /** + * Gets the Koschei type for the id. + * @param id the id. + * @return the Koschei type. + */ + fun forId(id: Int): KoscheiType? { + for (type in values()) { + if (type.npcId == id) { + return type + } + } + return null + } + } + } + + class KoscheiSpawnPulse(val player: Player?, val koschei: KoscheiNPC) : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when(counter++) { + 0 -> koschei.face(player).also { koschei.unlock(); player?.face(koschei) } + 1 -> if (koschei.type?.appearDialogues?.size!! > 0) { + player?.dialogueInterpreter?.sendDialogues(NPCs.KOSCHEI_THE_DEATHLESS_1291, FacialExpression.NEUTRAL, *koschei.type!!.appearDialogues) + } else { counter = 4 } + 4 -> koschei.attack(player).also { if (koschei.type?.appearMessage?.isNotEmpty() == true) { koschei.sendChat(koschei.type?.appearMessage) }} + } + return false + } + } + + class FightEndPulse(val player: Player?, val koschei: KoscheiNPC) : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when(counter++) { + 0 -> player?.lock().also { player?.animate(Animation(1332)).also { player?.sendMessage("Oh dear you are...") }} + 1 -> player?.setAttribute("/save:fremtrials:thorvald-vote",true).also { + player?.setAttribute("/save:fremtrials:votesplayer", player.getAttribute("fremtrials:votesplayer", 0) + 1); + player?.removeAttribute("fremtrials:warrior-accepted") + } + 3 -> player?.teleport(Location.create(2666,3694,1)).also { koschei.session?.close() } + 4 -> player?.sendMessage("...still alive somehow?") + 6 -> player?.dialogueInterpreter?.open(NPCs.THORVALD_THE_WARRIOR_1289, Repository.findNPC(NPCs.THORVALD_THE_WARRIOR_1289), this) + 7 -> player?.unlock().also { player?.sendMessage("Congratulations! You have passed the warrior's trial!") } + } + return false + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/KoscheiSession.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/KoscheiSession.kt new file mode 100644 index 000000000..92ecce793 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/KoscheiSession.kt @@ -0,0 +1,71 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.player.Player +import org.rs09.consts.NPCs + +/** + * Represents a session with Koschei. + * @author NixWigton + */ +class KoscheiSession( + /** + * The player. + */ + val player: Player +) { + /** + * The Koschei npc. + */ + private val koschei: KoscheiNPC = KoscheiNPC( + NPCs.KOSCHEI_THE_DEATHLESS_1290, + player.location?.transform(1,0,0), + this + ) + + /** + * Constructs a new `KoscheiSession` `Object`. + * @param player the player. + */ + init { + if (player.getExtension(KoscheiSession::class.java) != null) { + player.removeExtension(KoscheiSession::class.java) + } + player.addExtension(KoscheiSession::class.java, this) + } + + /** + * Starts the session. + */ + fun start() { + koschei.init() + player.unlock() + } + + /** + * Closes the session. + */ + fun close() { + koschei.clear() + player.removeExtension(KoscheiSession::class.java) + } + + companion object { + /** + * Creates the Koschei session. + * @param player the player. + * @return the session. + */ + fun create(player: Player): KoscheiSession { + return KoscheiSession(player) + } + + /** + * Gets the Koschei session. + * @param player the player. + * @return the session. + */ + fun getSession(player: Player): KoscheiSession { + return player.getExtension(KoscheiSession::class.java) + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/LalliDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/LalliDialogue.kt index 0e77e3458..d34371871 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/LalliDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/LalliDialogue.kt @@ -1,22 +1,58 @@ package rs09.game.content.quest.members.thefremenniktrials +import api.addItem +import api.inInventory +import api.removeItem import core.game.node.entity.player.Player import core.plugin.Initializable import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression +import core.game.node.item.Item +import org.rs09.consts.Items @Initializable class LalliDialogue(player: Player? = null) : DialoguePlugin(player){ override fun open(vararg args: Any?): Boolean { player?.let { - if (it.questRepository.getStage("Fremennik Trials") > 0) { - player("Hello there.").also { stage = 0; return true } + println(it.getAttribute("lalliEatStew", false)) + if (it.questRepository.isComplete("Fremennik Trials")){ + playerl(FacialExpression.NEUTRAL,"Hello there.") + stage = 100 + return true + } + if (it.getAttribute("lalliStewCabbageAdded", false)!! && it.getAttribute("lalliStewOnionAdded", false)!! && it.getAttribute("lalliStewPotatoAdded", false)!! && it.getAttribute("lalliStewRockAdded", false)!!){ + npcl(FacialExpression.OLD_NORMAL,"It am ready now?") + stage = 60 + return true + } + if(it.getAttribute("lalliStewCabbageAdded", false)!! || it.getAttribute("lalliStewOnionAdded", false)!! || it.getAttribute("lalliStewPotatoAdded", false)!! || it.getAttribute("lalliStewRockAdded", false)!!){ + npcl(FacialExpression.OLD_NORMAL,"It am ready now?") + stage = 58 + return true + } + if (it.getAttribute("lalliEatStew", false)!!){ + playerl(FacialExpression.NEUTRAL,"Hello there.") + stage = 65 + return true + } + if (it.getAttribute("hasWool", false)!!){ + playerl(FacialExpression.NEUTRAL,"Hello there.") + stage = 75 + return true } if (it.getAttribute("fremtrials:askeladden-talkedto", false)!!) { player("Hello there.") stage = 50 return true } + if(player.questRepository.isComplete("Fremennik Trials")){ + playerl(FacialExpression.HAPPY,"Hello there.") + stage = 100 + return true + } + if (it.questRepository.getStage("Fremennik Trials") > 0) { + player("Hello there.").also { stage = 0; return true } + } } return true } @@ -44,7 +80,7 @@ class LalliDialogue(player: Player? = null) : DialoguePlugin(player){ //Other human? 10 -> npc(FacialExpression.OLD_SNEAKY,"Human call itself Askeladden! It not trick Lalli. Lalli do","good deal with human! Stupid human get some dumb","wool, but did not get golden apples!").also { stage++ } - 11 -> player("I see... okay, well, bye!").also { player.setAttribute("/save:fremtrials:lalli-talkedto",true); stage++ } + 11 -> player("I see... okay, well, bye!").also { player.setAttribute("/save:fremtrials:lalli-talkedto",true); stage = 1000 } //Honest, you're clever 20 -> npc(FacialExpression.OLD_SNEAKY,"Me no believe you tell truth. Go away.").also { stage = 1000 } @@ -60,6 +96,63 @@ class LalliDialogue(player: Player? = null) : DialoguePlugin(player){ 55 -> player(FacialExpression.HALF_THINKING, "Hmm... So you're hungry? I think I will have the", "perfect thing for you to eat... I just need to get myself", "an onion, a potato, and a cabbage...").also { stage++ } 56 -> interpreter.sendDialogue("You have a cunning plan to trick this troll. You need your pet rock,", "a cabbage, a potato and an onion.").also { player.removeAttribute("fremtrials:fremtrials:lalli-talkedto");stage = 1000 } + 58 -> playerl(FacialExpression.NEUTRAL,"Not just yet...").also { stage = 1000 } + + 60 -> playerl(FacialExpression.HAPPY,"Indeed it is. Try it and see.").also { stage++ } + 61 -> npcl(FacialExpression.OLD_HAPPY,"Hmm... YUM! That are delicious! Me never know human know to make soup out of stone? It some special stone?").also { stage++ } + 62 -> playerl(FacialExpression.NEUTRAL,"Indeed it is. But I'm willing to trade it.").also { stage++ } + 63 -> npcl(FacialExpression.OLD_SNEAKY,"Let me think about that, me like to think.").also { + player.setAttribute("/save:lalliEatStew",true) + player.removeAttribute("lalliStewOnionAdded") + player.removeAttribute("lalliStewPotatoAdded") + player.removeAttribute("lalliStewCabbageAdded") + player.removeAttribute("lalliStewRockAdded") + stage = 1000 + } + + 65 -> npcl(FacialExpression.OLD_HAPPY,"Your soup very tasty, human! But me still not want trade golden apples for your stone. Me think pet rock get jealous.").also { stage++ } + 66 -> playerl(FacialExpression.ANGRY,"I. DON'T. WANT. ANY. GOLDEN. APPLES. ALL. I. WANT. IS. A. GOLDEN. FLEECE.").also { stage++ } + 67 -> npcl(FacialExpression.OLD_ALMOST_CRYING,"Gee, sorry human, all you have do is ask, me not need you to shout. You act like you think Lalli am stupid or something...").also { + if(player.inventory.isFull){ + stage = 68 + }else{ + stage = 70 + } + } + 68 -> npcl(FacialExpression.OLD_NORMAL,"Me would give you golden fleece if me think you have enough room in your inventory.").also { stage = 1000 } + 70 -> npcl(FacialExpression.OLD_HAPPY,"Here you go. Hah! Me trick you Human! All you got is worthless golden fleece! Me got very rare soup-making stone!").also { stage = 71 } + 71 -> playerl(FacialExpression.HAPPY,"Glad you're happy Lalli!").also { + player.inventory.add(Item(Items.GOLDEN_FLEECE_3693)) + player.setAttribute("/save:hasWool",true) + player.removeAttribute("lalliEatStew") + stage = 1000 + } + 75 -> npcl(FacialExpression.OLD_HAPPY,"Hah! How you like worthless golden fleece! Me very like rare soup-making stone!").also { stage++ } + 76 -> playerl(FacialExpression.HAPPY,"Oh it's great, thank you again for the fleece Lalli, I hope you're enjoying your soup").also { stage = 1000 } + + 100 -> npcl(FacialExpression.OLD_HAPPY,"Ha! Stupid human! You no get any golden apples! Even though me much like stone soup!").also { stage++ } + 101 -> playerl(FacialExpression.ASKING,"Can I please have some more golden wool?").also { stage++ } + 102 -> npcl(FacialExpression.OLD_HAPPY,"Me will sell you some golden wool, but me no sell you any golden apples!").also { stage++ } + 103 -> playerl(FacialExpression.HAPPY,"How much for the golden wool?").also { stage++ } + 104 -> npcl(FacialExpression.OLD_HAPPY,"Me want 1000 coins! You pay or go!").also { + stage = if(inInventory(player,Items.COINS_995,1000)){ + 105 + } + else 115 + } + 105 -> options("Pay","Don't pay").also { stage++ } + 106 -> when(buttonId){ + 1 -> playerl(FacialExpression.HAPPY,"Is that all? Here you go!").also { + removeItem(player,Item(Items.COINS_995,1000)) + addItem(player,Items.GOLDEN_FLEECE_3693) + stage++ + } + 2 -> npcl(FacialExpression.OLD_HAPPY,"You no pay, then you go! You no get any golden apples!").also { stage = 1000 } + } + 107 -> npcl(FacialExpression.OLD_HAPPY,"Ha! Stupid human think he buy golden apples, but he actually get stupid wool! Hahaha!").also { stage = 1000 } + + 115 -> playerl(FacialExpression.THINKING,"I don't even have that much cash on me...").also { stage++ } + 116 -> npcl(FacialExpression.OLD_NORMAL,"Well stupid bad trade human don't get no wool then! Or any golden apples!").also { stage = 1000 } 1000 -> end() } diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/LonghallStageZone.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/LonghallStageZone.kt new file mode 100644 index 000000000..65c87aaf6 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/LonghallStageZone.kt @@ -0,0 +1,41 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.Entity +import core.game.world.map.zone.MapZone +import core.game.world.map.zone.ZoneBorders +import core.game.world.map.zone.ZoneBuilder +import core.plugin.Initializable +import core.plugin.Plugin +import rs09.game.node.entity.player.diary.seers.MysteriousStatueZone + +@Initializable +class LonghallStageZone : MapZone("LonghallStageZone",true), Plugin { + + override fun newInstance(arg: Any?): LonghallStageZone { + ZoneBuilder.configure(this) + return this + } + + override fun configure() { + super.register(ZoneBorders(2655,3682,2662,3685)) + } + + override fun enter(e: Entity?): Boolean { + if (e != null && e.isPlayer) { + e.setAttribute("onStage",true) + } + return super.enter(e) + } + + override fun leave(e: Entity?, logout: Boolean): Boolean { + if (e != null && e.isPlayer) { + e.removeAttribute("onStage") + } + return super.leave(e, logout) + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ManniDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ManniDialogue.kt index c20afe869..6a6300058 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ManniDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ManniDialogue.kt @@ -1,9 +1,10 @@ package rs09.game.content.quest.members.thefremenniktrials +import api.addItem +import api.removeItem import core.game.node.entity.impl.Animator import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player -import core.game.node.entity.player.info.PlayerDetails import core.game.node.item.Item import core.game.system.task.Pulse import rs09.game.world.GameWorld @@ -12,6 +13,7 @@ import core.game.world.update.flag.context.Animation import core.plugin.Initializable import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression +import org.rs09.consts.Items @Initializable class ManniDialogue(player: Player? = null) : DialoguePlugin(player){ @@ -19,7 +21,32 @@ class ManniDialogue(player: Player? = null) : DialoguePlugin(player){ override fun open(vararg args: Any?): Boolean { curNPC = args[0] as? NPC if(player?.questRepository?.getStage("Fremennik Trials")!! > 0){ - if(player?.getAttribute("fremtrials:manni-accepted",false) == true) { + if(player?.inventory?.contains(3707, 1) == true){ + playerl(FacialExpression.HAPPY,"Hey. I got your cocktail for you.") + stage = 170 + return true + } + else if(player?.inventory?.contains(3706,1) == true){ + playerl(FacialExpression.ASKING,"So it doesn't bother you at all that you just gave up your place here for one drink?") + stage = 180 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"Is this trade item for you?") + stage = 165 + return true + } + else if(player?.getAttribute("sigmund-steps", 0) == 12){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find the longhall barkeeps' legendary cocktail, do you?") + stage = 162 + return true + } + else if(player?.getAttribute("sigmund-steps", 0) == 11){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a token to allow a seat at the champions table, do you?") + stage = 150 + return true + } + else if(player?.getAttribute("fremtrials:manni-accepted",false) == true) { if (player?.inventory?.containsItem(Item(3712)) == true || player?.inventory?.containsItem(Item(3711)) == true) { npc("Ah, I see you have your keg of beer. Are ye ready to", "drink against each other?") stage = 101 @@ -29,16 +56,25 @@ class ManniDialogue(player: Player? = null) : DialoguePlugin(player){ stage = 1000; return true } - } else if(player?.getAttribute("fremtrials:manni-vote",false) == true){ + } + else if(player?.getAttribute("fremtrials:manni-vote",false) == true){ npc("e have my vote!") stage = 1000 return true } + else if(player.questRepository.isComplete("Fremennik Trials")){ + playerl(FacialExpression.HAPPY,"Howdy!") + stage = 190 + return true + } player("Hello there!") stage = 0 return true - } else { - TODO("Uncertain what should go here") + } + else { + playerl(FacialExpression.HAPPY,"Hello there!") + stage = 200 + return true } } @@ -75,6 +111,52 @@ class ManniDialogue(player: Player? = null) : DialoguePlugin(player){ 103 -> {npc("As you wish outerlander; I will drink first, then you will","drink.");stage++} 104 -> {GameWorld.submit(DrinkingPulse(player,curNPC,player?.getAttribute("fremtrials:keg-mixed",false))); end()} + //Sigmund stuff + 150 -> npcl(FacialExpression.HAPPY,"As a matter of fact, I do. I have one right here. I earnt my place here at the longhall for surviving over 5000 battles and raiding parties.").also { stage++ } + 151 -> npcl(FacialExpression.HAPPY,"Due to my contribution to the tribe, I am now permitted to spend my days here in the longhall listening to the epic tales of the bard, and drinking beer.").also { stage++ } + 152 -> playerl(FacialExpression.HAPPY,"Cool. That sounds pretty sweet! So I guess you don't want to give it away?").also { stage++ } + 153 -> npcl(FacialExpression.SAD,"I think it sounds better than it actually is outerlander. I miss my glory days of combat on the battlefield.").also { stage++ } + 154 -> npcl(FacialExpression.SAD,"And to tell you the truth, the beer here isn't great, and the bards' music is lousy. I would happily give up my token if it were not for the one thing that keeps me here.").also { stage++ } + 155 -> npcl(FacialExpression.HAPPY,"Our barkeep is one of the best in the world, and has worked in taverns across the land. When she was younger, she experimented a lot with her drinks").also { stage++ } + 156 -> npcl(FacialExpression.HAPPY,"and invented a cocktail so alcoholic and tasty that it has become something of a legend to all who enjoy a drink.").also { stage++ } + 157 -> npcl(FacialExpression.SAD,"Unfortunately, she decided that cocktails were not a suitable drink for Fremennik warriors, and vowed to never again make it.").also { stage++ } + 158 -> npcl(FacialExpression.SAD,"I have been here every day since she returned, hoping that someday she might change her mind and I might try this legendary cocktail for myself. Alas, it has never come to pass...").also { stage++ } + 159 -> npcl(FacialExpression.SAD,"If you can persuade her to make me her legendary cocktail, I will be happy to never let another drop of alcohol pass my lips, and will give you my champions token.").also { stage++ } + 160 -> playerl(FacialExpression.THINKING,"That's all?").also { stage++ } + 161 -> npcl(FacialExpression.NEUTRAL,"That is all.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 162 -> npcl(FacialExpression.ANNOYED,"Uh... yes, the longhall barkeep has it. So could you get me my drink now please?").also { stage = 1000 } + + 165 -> npcl(FacialExpression.ANNOYED,"Not me, no.").also { stage = 1000 } + 170 -> npcl(FacialExpression.AMAZED,"...It is true! The legendary cocktail! I have waited for this day ever since I first started drinking!").also { + removeItem(player,3707) + addItem(player,3706) + stage++ + } + 171 -> npcl(FacialExpression.HAPPY,"Here outerlander, you may take my token. I will happily give up my place at the longhalls table of champions just for a taste of this exquisite beverage!").also { stage++ } + 172 -> playerl(FacialExpression.ASKING,"It's just a drink...").also { stage++ } + 173 -> npcl(FacialExpression.HAPPY,"No, it is an artform. A drink such as this should be appreciated, and admired.").also { stage++ } + 174 -> npcl(FacialExpression.HAPPY,"It is like a fine painting, or a tasteful sculpture. If what I hear is true, then all other drinks become like unpalatable water in comparison to this!").also { stage++ } + 175 -> playerl(FacialExpression.HAPPY,"I guess you're happy with the trade then!").also { stage = 1000 } + + 180 -> npcl(FacialExpression.HAPPY,"Ah, but it was not just any drink... It was the finest cocktail ever created! Now that I have tasted it, I need never drink again, for my tastebuds will never be so excited!").also { stage++ } + 181 -> playerl(FacialExpression.ASKING,"So it was nice?").also { stage++ } + 182 -> npcl(FacialExpression.HAPPY,"It was... exquisite!").also { stage++ } + 183 -> playerl(FacialExpression.ASKING,"What did it taste of, then?").also { stage++ } + 184 -> npcl(FacialExpression.HAPPY,"Mostly tomato juice.").also { stage = 1000 } + + 190 -> npcl(FacialExpression.HAPPY,"Hey! It's ${player.getAttribute("fremennikname","clyde smilers")}! Let me buy you a drink!").also { + addItem(player, Items.BEER_1917) + stage++ } + 191 -> npcl(FacialExpression.HAPPY,"There ya go! Anyone who can drink like you earns my respect!").also { stage = 1000 } + + 200 -> npcl(FacialExpression.HAPPY,"Do not think me rude outerlander, but our customs forbid me talking to you. All contact with outerlanders must be vetted by our chieftain, Brundt.").also { stage++ } + 201 -> playerl(FacialExpression.ASKING,"Where is this Brundt?").also { stage++ } + 202 -> npcl(FacialExpression.HAPPY,"He is standing just over there. He will speak for the tribe.").also { stage = 1000 } + + 1000 -> end() } return true diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/OlafTheBard.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/OlafTheBard.kt index 2fb7d7a21..df0131523 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/OlafTheBard.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/OlafTheBard.kt @@ -1,19 +1,64 @@ package rs09.game.content.quest.members.thefremenniktrials +import api.addItem +import api.removeItem import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression import core.game.node.entity.player.Player import core.plugin.Initializable @Initializable class OlafTheBard(player: Player? = null) : DialoguePlugin(player){ override fun open(vararg args: Any?): Boolean { - if(player?.getAttribute("fremtrials:olaf-accepted",false)!!){ + if(player.inventory.contains(3700,1)){ + playerl(FacialExpression.HAPPY,"Hello Olaf. Do you have a beautiful love song written for me?") + stage = 65 + } + else if(player.inventory.contains(3699,1)){ + playerl(FacialExpression.ASKING,"So you think this song is pretty good then?") + stage = 70 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"I've got a trade item; is it for you?") + stage = 75 + return true + } + else if(player?.getAttribute("sigmund-steps",0) == 3){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find some custom sturdy boots, do you?") + stage = 60 + return true + } + else if(player?.getAttribute("sigmund-steps",0)!! == 2){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a love ballad, do you?") + stage = 50 + return true + } + else if(player?.getAttribute("lyreConcertPlayed",false)!!){ + playerl(FacialExpression.HAPPY,"So can I rely on your vote with the council of elders in my favour?") + stage = 40 + return true + } + else if(player?.getAttribute("fremtrials:olaf-accepted",false)!!){ npc("I can't wait to see your performance.") stage = 1000 return true } - npc("Hello? Yes? You want something outerlander?") - stage = 0; + else if(player.questRepository.isComplete("Fremennik Trials")){ + npcl(FacialExpression.HAPPY,"Hello again to you, ${player.getAttribute("fremennikname","schlonko")}. Us bards should stick together, what can I do for you?") + stage = 98 + return true + } + else if(player.questRepository.hasStarted("Fremennik Trials")){ + npc("Hello? Yes? You want something outerlander?") + stage = 0 + return true + } + else{ + playerl(FacialExpression.HAPPY,"Hello there. So you're a bard?") + stage = 150 + return true + } return true } @@ -55,6 +100,57 @@ class OlafTheBard(player: Player? = null) : DialoguePlugin(player){ 28 -> npc("Is that clear enough, outerlander? Would you like me","to repeat anything?").also { stage++ } 29 -> player("No thanks. I think I've got it.").also { stage = 1000 } + 40 -> npcl(FacialExpression.HAPPY,"You have a truly poetic soul! Anyone who can compose such a beautiful epic, and then perform it so flawlessly can only bring good to our clan!").also { stage++ } + 41 -> playerl(FacialExpression.THINKING,"Erm... so that's a yes, then?").also { stage++ } + 42 -> npcl(FacialExpression.HAPPY,"Absolutely! We must collaborate together on a duet sometime, don't you think?").also { + player?.setAttribute("/save:fremtrials:olaf-vote",true) + player?.setAttribute("/save:fremtrials:votes",player.getAttribute("fremtrials:votes",0) + 1) + stage = 1000 + } + + + //Sigmund bullshit + 50 -> npcl(FacialExpression.HAPPY," Well, as official Fremennik bard, it falls within my remit to compose all music for the tribe. I am fully versed in all the various types of romantic music.").also { stage++ } + 51 -> playerl(FacialExpression.HAPPY,"Great! Can you write me one then?").also { stage++ } + 52 -> npcl(FacialExpression.THINKING,"Well... Normally I would be thrilled at the chance to show my skill as a poet in composing a seductively romantic ballad...").also { stage++ } + 53 -> playerl(FacialExpression.ANNOYED,"Let me guess; Here comes the 'but'.").also { stage++ } + 54 -> npcl(FacialExpression.SAD,"...but unfortunately I cannot concentrate fully upon my work recently.").also { stage++ } + 55 -> playerl(FacialExpression.ASKING,"Why is that then?").also { stage++ } + 56 -> npcl(FacialExpression.NEUTRAL,"It is these old worn out shoes of mine... As a bard I am expected to wander the lands, singing of the glorious battles of our warriors.").also { stage++ } + 57 -> npcl(FacialExpression.NEUTRAL,"If you can find me a pair of sturdy boots to replace these old worn out ones of mine, I will be happy to spend the time on composing you a romantic ballad.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 60 -> npcl(FacialExpression.ANNOYED,"I'm sorry outerlander... If I did, I would not trouble you to go and find them for me, would I?").also { stage = 1000 } + + 65 -> npcl(FacialExpression.HAPPY,"That depends outerlander... Do you have some new boots for me? My feet get so tired roaming the land...").also { stage++ } + 66 -> playerl(FacialExpression.HAPPY,"As a matter of fact - I do!").also { + removeItem(player,3700) + addItem(player,3699) + stage++ + } + 67 -> npcl(FacialExpression.HAPPY,"Oh! Superb! Those are great! They're just what I was looking for! Here, take this song with my compliments! It is one of my finest works yet!").also { stage = 1000 } + + 70 -> npcl(FacialExpression.HAPPY,"Ahhh.... outerlander... it is the most beautiful romantic ballad I have ever been inspired to write...").also { stage++ } + 71 -> npcl(FacialExpression.HAPPY,"Only a woman with a heart of icy stone could fail be to be moved by its beauty!").also { stage++ } + 72 -> playerl(FacialExpression.HAPPY,"Thanks! That sounds perfect!").also { stage = 1000 } + + 75 -> npcl(FacialExpression.HAPPY,"Only if it's a new pair of boots.").also { stage = 1000 } + + 98 -> options("I was wondering...","I forget now...").also { stage++ } + 99 -> when(buttonId){ + 1 -> playerl(FacialExpression.ASKING,"I was wondering... Can I learn to play my lyre again?").also { stage++ } + 2 -> playerl(FacialExpression.THINKING,"I forget now...").also { stage = 1000 } + } + + 100 -> npcl(FacialExpression.HAPPY, "Well that is an interesting question. Let me let you into a little secret. If you make another offering to the Fossegrimen you will learn a secret melody.").also { stage++ } + 101 -> playerl(FacialExpression.ASKING,"What kind of melody?").also { stage++ } + 102 -> npcl(FacialExpression.HAPPY,"It is the song of Rellekka. When you play it, it will bring you back to this town where you are in this world.").also { stage++ } + 103 -> npcl(FacialExpression.HAPPY,"We often go adventuring with bards for precisely this reason. No matter where we have ended up we can return safe and sound to home.").also { stage++ } + 104 -> playerl(FacialExpression.HAPPY,"Thanks, Olaf!").also { stage = 1000 } + + 150 -> npcl(FacialExpression.HAPPY,"I am afraid I cannot speak to outerlanders. Besides, I am busy composing an epic.").also { stage = 1000 } + 1000 -> end() } return true diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/PeerTheSeerDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/PeerTheSeerDialogue.kt new file mode 100644 index 000000000..610110617 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/PeerTheSeerDialogue.kt @@ -0,0 +1,255 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.* +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.interaction.`object`.BankingPlugin +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.plugin.Initializable +import core.tools.RandomFunction +import rs09.game.content.dialogue.DumpContainer +import kotlin.random.Random + +@Initializable +class PeerTheSeerDialogue(player: Player? = null) : DialoguePlugin(player) { + val predictionOne = arrayOf("one","two","three","four","five","six","seven","eight","ten") + val predictionTwo = arrayOf("black","blue","brown","cyan","green","pink","purple","red","yellow") + val predictionThree = arrayOf("fire giant","ghosts","giant","goblin","green dragon","hobgoblin","lesser demon","moss giant","ogre","zombie") + val predictionFour = arrayOf("Al Kharid","Ardougne","Burthorpe","Canifis","Catherby","Falador","Karamja","Varrock","The Wilderness","Yanille") + val predictionFive = arrayOf("battleaxe","crossbow","dagger","javelin","long sword","mace","scimitar","spear","warhammer") + val predictionSix = arrayOf("Agility","Cooking","Crafting","Fishing","Fletching","Herblore","Mining","Runecrafting","Thieving") + val PREDICTIONS = arrayOf( + "You will find luck today with the number ${predictionOne[RandomFunction.getRandom(8)]}.", + "The colour ${predictionTwo[RandomFunction.getRandom(8)]} will bring you luck this day.", + "The enemy called ${predictionThree[RandomFunction.getRandom(9)]} is your lucky totem this day.", + "The place called ${predictionFour[RandomFunction.getRandom(9)]} will be worth your time to visit.", + "The stars tell me that you should use a ${predictionFive[RandomFunction.getRandom(8)]} in combat today.", + "You would be wise to train the skill ${predictionSix[RandomFunction.getRandom(8)]}") + var prediction = RandomFunction.getRandom(5) + + override fun open(vararg args: Any?): Boolean { + if(player.inventory.contains(3710,1)){ + playerl(FacialExpression.HAPPY,"Can I have a weather forecast now please?") + stage = 15 + return true + } + else if(player.inventory.contains(3705,1)){ + playerl(FacialExpression.ASKING,"So, about this forecast...") + stage = 20 + return true + } + else if(player.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"I've got an item to trade but I don't know if it's for you.") + stage = 26 + return true + } + else if(player.getAttribute("sigmund-steps", 0) == 10){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a brave and powerful warrior to act as a bodyguard?") + stage = 8 + return true + } + else if(player.getAttribute("sigmund-steps", 0) == 9){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a weather forecast from the Fremennik Seer do you?") + stage = 1 + return true + } + else if(player.getAttribute("PeerStarted",false) && !player.inventory.isEmpty || !player.equipment.isEmpty){ + npcl(FacialExpression.SAD,"Uuuh... What was that dark presence I felt?") + stage = 100 + return true + } + else if(player.getAttribute("PeerStarted",false) && player.inventory.isEmpty && player.equipment.isEmpty){ + npcl(FacialExpression.SAD,"Uuuh... What was that dark presence I felt?") + stage = 110 + return true + } + else if(player.getAttribute("fremtrials:peer-vote",false)){ + npcl(FacialExpression.SAD,"Uuuh... What was that dark presence I felt?") + stage = 120 + return true + } + else if(player.questRepository.isComplete("Fremennik Trials")){ + npcl(FacialExpression.SAD,"Uuuh... What was that dark presence I felt?") + stage = 150 + return true + } + else if(player.questRepository.hasStarted("Fremennik Trials")){ + npcl(FacialExpression.SAD,"Uuuh... What was that dark presence I felt?") + stage = 50 + return true + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> npcl(FacialExpression.ANNOYED,"Er.... Yes, because I AM the Fremennik Seer.").also { stage++ } + 2 -> playerl(FacialExpression.ASKING,"Can I have a weather forecast then please?").also { stage++ } + 3 -> npcl(FacialExpression.THINKING,"You require a divination of the weather? This is a simple matter for me, but I will require something in return from you for this small service.").also { stage++ } + 4 -> playerl(FacialExpression.ASKING,"I knew you were going to say that...").also { stage++ } + 5 -> npcl(FacialExpression.HAPPY,"Do not fret, outerlander; it is a fairly simple matter. I require a bodyguard for protection. Find someone willing to offer me this service.").also { stage++ } + 6 -> playerl(FacialExpression.ASKING,"That's all?").also { stage++ } + 7 -> npcl(FacialExpression.HAPPY,"That is all.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 10 -> npcl(FacialExpression.ANNOYED,"If I did, then I would simply have asked them myself now, wouldn't I, outerlander?").also { stage = 1000 } + + 15 -> npcl(FacialExpression.ANNOYED,"I have already told you outerlander; You may have a reading from me when I have a signed contract from a warrior guaranteeing my protection.").also { stage++ } + 16 -> playerl(FacialExpression.HAPPY,"Yeah, I know; I have one right here from Thorvald.").also { + removeItem(player,3710) + addItem(player,3705) + stage++ + } + 17 -> npcl(FacialExpression.AMAZED,"You have not only persuaded one of the Fremennik to act as a servant to me, but you have enlisted the aid of mighty Thorvald himself???").also { stage++ } + 18 -> npcl(FacialExpression.HAPPY,"You may take this forecast with my blessing outerlander. You have offered me the greatest security I can imagine.").also { stage = 1000 } + + 20 -> npcl(FacialExpression.THINKING,"Yes, outerlander?").also { stage++ } + 21 -> playerl(FacialExpression.ASKING,"I still don't know why you didn't just let me have one anyway in the first place. Surely it means nothing to you?").also { stage++ } + 22 -> npcl(FacialExpression.THINKING,"That is not true, outerlander. Although I see glimpses of the future all of the time, using my powers brings the attention of the gods to me.").also { stage++ } + 23 -> npcl(FacialExpression.THINKING,"Some of the gods are spiteful and cruel, and I fear if I use my powers too much then I will meet with unpredictable accidents.").also { stage++ } + 24 -> npcl(FacialExpression.HAPPY,"This is why I needed protection.").also { stage++ } + 25 -> playerl(FacialExpression.THINKING,"Okay... I... think I understand...").also { stage = 1000 } + + 26 -> npcl(FacialExpression.ANNOYED,"Not me, I'm afraid.").also { stage++ } + + //The Seer's Trial + 50 -> npcl(FacialExpression.AMAZED,"!").also { stage++ } + 51 -> npcl(FacialExpression.HAPPY,"Ahem, sorry about that. Hello outerlander. What do you want?").also { stage++ } + 52 -> playerl(FacialExpression.ASKING,"Hello. I'm looking for members of the council of elders to vote for me to become a Fremennik.").also { stage++ } + 53 -> npcl(FacialExpression.THINKING,"Are you now? Well that is interesting. Usually outerlanders do not concern themselves with our ways like that.").also { stage++ } + 54 -> npcl(FacialExpression.HAPPY,"I am one of the members of the council of elders, and should you be able to prove to me that you have something to offer my clan I will vote in your favour at the next meeting.").also { stage++ } + 55 -> playerl(FacialExpression.ASKING,"How can I prove that to you?").also { stage++ } + 56 -> npcl(FacialExpression.HAPPY,"Well, I have but a simple test. This building behind me is my house. Inside I have constructed a puzzle.").also { stage++ } + 57 -> npcl(FacialExpression.HAPPY,"As a Seer to the clan, I value intelligence very highly, so you may think of it as an intelligence test of sorts.").also { stage++ } + 58 -> playerl(FacialExpression.THINKING,"An intelligence test? I thought barbarians were stupid!").also { stage++ } + 59 -> npcl(FacialExpression.ANNOYED,"That is the opinion that outerlanders usually hold of my people, it is true. But that is because people often confuse knowledge with wisdom.").also { stage++ } + 60 -> npcl(FacialExpression.ANNOYED,"My puzzle tests not what you know, but what you can work out. All members of our clan have been tested when they took their trials.").also { stage++ } + 61 -> playerl(FacialExpression.ASKING,"So what exactly does this puzzle consist of, then?").also { stage++ } + 62 -> npcl(FacialExpression.HAPPY,"Well, firstly you must enter my house with no items, weapons or armour. Then it is a simple matter of entering through one door and leaving by the other.").also { stage++ } + 63 -> playerl(FacialExpression.ASKING,"I can't take anything in there with me?").also { stage++ } + 64 -> npcl(FacialExpression.HAPPY,"That is correct outerlander. Everything you need to complete the puzzle you will find inside the building. Nothing more.").also { stage++ } + 65 -> npcl(FacialExpression.HAPPY,"So what say you outerlander? You think you have the wit to earn yourself my vote?").also { stage++ } + 66 -> options("Yes","No").also { stage++ } + 67 -> when(buttonId){ + 1 ->{ playerl(FacialExpression.HAPPY,"Yes, I accept your challenge, I have one small question, however...") + player?.setAttribute("/save:PeerStarted",true) + player?.setAttribute("/save:PeerRiddle", Random.nextInt(0,3)) + stage = 70 + } + 2 ->{ playerl(FacialExpression.HAPPY,"No, thinking about stuff isn't really my 'thing'. I'd rather go kill something. I'll find someone else to vote for me") + stage++ + } + } + //No to challenge + 68 -> npcl(FacialExpression.HAPPY,"As you wish, outerlander.").also { stage = 1000 } + + //Yes to challenge + 70 -> npcl(FacialExpression.ASKING,"Yes outerlander?").also { stage++ } + 71 -> playerl(FacialExpression.THINKING,"Well... you say I can bring nothing with me when I enter your house...").also { stage++ } + 72 -> npcl(FacialExpression.ANNOYED,"Yes outerlander??").also { stage++ } + 73 -> playerl(FacialExpression.THINKING,"Well...").also { stage++ } + 74 -> npcl(FacialExpression.ANGRY,"Yes, outerlander???").also { stage++ } + 75 -> playerl(FacialExpression.ASKING,"Where is the nearest bank?").also { stage++ } + 76 -> npcl(FacialExpression.HAPPY,"Ah, I see your problem outerlander. The nearest bank to here is the place known to outerlanders as the Seers Village.").also { stage++ } + 77 -> npcl(FacialExpression.HAPPY,"It is some way South. I do however have an alternative, should you wish to take it.").also { stage++ } + 78 -> playerl(FacialExpression.ASKING,"And what is that?").also { stage++ } + 79 -> npcl(FacialExpression.HAPPY,"I can store all the weapons, armour and items that you have upon you directly into your bank account.").also { stage++ } + 80 -> npcl(FacialExpression.HAPPY,"This will tax what little magic I possess however, so you will have to travel to the bank to withdraw them again.").also { stage++ } + 81 -> npcl(FacialExpression.HAPPY,"What say you outerlander? Do you wish me to do this for you?").also { stage++ } + 82 -> options("Yes","No").also { stage++ } + 83 -> when(buttonId){ + 1 -> { + val slotAmount = player.inventory.itemCount() + player.equipment.itemCount() + if (slotAmount < player.bank.freeSlots()){ + npcl(FacialExpression.HAPPY,"The task is done. I wish you luck with your test, outerlander.") + dumpContainer(player,player.inventory) + dumpContainer(player,player.equipment) + stage = 1000 + } + else { + npcl(FacialExpression.SAD,"I am sorry outerlander, the spell is not working. I believe you may have some objects that you cannot bank with you") + stage = 1000 + } + } + 2 -> playerl(FacialExpression.HAPPY,"No thanks. Nobody touches my stuff but me!").also { stage++ } + } + + //No to banking + 84 -> npcl(FacialExpression.HAPPY,"As you wish, outerlander. You may attempt my little task when you have deposited your equipment in the bank").also { + stage = 1000 + } + + //Yes to banking but cannot bank + 90 -> npcl(FacialExpression.SAD,"I am sorry outerlander, the spell is not working. I believe you may have some objects that you cannot bank with you").also { + stage = 1000 + } + + //Returning after accepting with items. + 100 -> npcl(FacialExpression.AMAZED,"!").also { stage++ } + 101 -> npcl(FacialExpression.HAPPY,"Ahem, sorry about that. Hello outerlander. What do you want?").also { stage++ } + 102 -> playerl(FacialExpression.ASKING,"So I can bring nothing with me when I enter your house?").also { stage++ } + 103 -> npcl(FacialExpression.HAPPY,"That is correct outerlander, but as I say, I can use my small skill in magic to send your items directly into your bank account from here.").also { stage++ } + 104 -> npcl(FacialExpression.HAPPY,"You will need to manually go to the bank to withdraw them again however.").also { stage++ } + 105 -> npcl(FacialExpression.HAPPY,"Would you like me to perform this small spell upon you, outerlander?").also { stage = 82 } + + //Returning after accepting without items. + 110 -> npcl(FacialExpression.AMAZED,"!").also { stage++ } + 111 -> npcl(FacialExpression.HAPPY,"Ahem, sorry about that. Hello outerlander. What do you want?").also { stage++ } + 112 -> playerl(FacialExpression.ASKING,"So I just have to enter by one door of your house, and leave by the other?").also { stage++ } + 113 -> npcl(FacialExpression.HAPPY,"That is correct outerlander. Be warned it is not as easy as it may at first sound...").also { stage = 1000 } + + //After completing the Seer's Trial. + 120 -> npcl(FacialExpression.AMAZED,"!").also { stage++ } + 121 -> npcl(FacialExpression.HAPPY,"Ahem, sorry about that.").also { stage++ } + 122 -> playerl(FacialExpression.HAPPY,"So you will vote for me at the council?").also { stage++ } + 123 -> npcl(FacialExpression.HAPPY,"Absolutely, outerlander. Your wisdom in passing my test marks you as worthy in my eyes.").also { stage = 1000 } + + + //After Fremennik Trials + 150 -> npcl(FacialExpression.AMAZED,"!").also { stage++ } + 151 -> npcl(FacialExpression.HAPPY,"Ahem, sorry about that.").also { + stage = if(player.achievementDiaryManager.getDiary(DiaryType.FREMENNIK).isComplete(0)){ + 200 + }else 152 + } + 152 -> playerl(FacialExpression.HAPPY,"Hello Peer.").also { stage++ } + 153 -> npcl(FacialExpression.HAPPY,"Greetings to you, brother ${player.getAttribute("fremennikname","dingle")}! What brings you to see me again?").also { stage++ } + 154 -> options("Can you tell my future?","Nothing really.").also{stage++} + 155 -> when(buttonId){ + 1 -> playerl(FacialExpression.ASKING,"I was wondering if you could give me a reading on my future...?").also { stage++ } + 2 -> playerl(FacialExpression.HAPPY,"Nothing really, I just stopped by to say hello").also { stage = 160 } + } + 156 -> npcl(FacialExpression.HAPPY,"Ah, you would like a prediction? I do not see that that would be so difficult... Wait a moment...").also { + stage++ + } + 157 -> npcl(FacialExpression.HAPPY,"Here is your prediction: ${PREDICTIONS[prediction]}").also { stage = 1000 } + + 160 -> npcl(FacialExpression.HAPPY,"Well, hello to you too!").also { stage = 1000 } + + + 200 -> options("Deposit service","Can you tell my future?","Nothing really.").also{ stage++ } + 201 -> when(buttonId){ + 1 -> playerl(FacialExpression.HAPPY,"Could you deposit some things for me, please?").also { stage++ } + 2 -> playerl(FacialExpression.ASKING,"I was wondering if you could give me a reading on my future...?").also { stage = 156 } + 3 -> playerl(FacialExpression.HAPPY,"Nothing really, I just stopped by to say hello").also { stage = 160 } + } + 202 -> npcl(FacialExpression.HAPPY,"Of course, ${player.getAttribute("fremennikname","dingle")}. I am always happy to aid those who have earned the right to wear Fremennik sea boots.").also { + BankingPlugin.BankDepositInterface() + stage = 1000 + } + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return PeerTheSeerDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1288) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/PoisonSalesman.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/PoisonSalesman.kt index d2166607d..ff96467af 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/PoisonSalesman.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/PoisonSalesman.kt @@ -28,14 +28,18 @@ class PoisonSalesman(player: Player? = null) : DialoguePlugin(player) { //Fremennik Trials 10 -> { - when (fremennikTrialsStage) { + /**when (fremennikTrialsStage) { 0 -> { npc("Come see me if you ever need low-alcohol beer!"); stage = END_DIALOGUE } + }*/ + if(fremennikTrialsStage == 0){ + npc("Come see me if you ever need low-alcohol beer!"); stage = END_DIALOGUE + } + else if(fremennikTrialsStage > 30){ + npc("Thanks for buying out all that low-alcohol beer!"); stage = END_DIALOGUE + } else if(fremennikTrialsStage > 0){ + npc("Howdy! You seem like someone with discerning taste!","Howsabout you try my brand new range of alcohol?"); stage++ } } -// if (fremennikTrialsStage == 0) -// else if(fremennikTrialsStage > 30) { npc("Thanks for buying out all that low-alcohol beer!"); stage = END_DIALOGUE } -// else if(fremennikTrialsStage > 0) { npc("Howdy! You seem like someone with discerning taste!","Howsabout you try my brand new range of alcohol?"); stage++ } - 11 -> { player("Didn't you used to sell poison?"); stage++ } 12 -> { npc("That I did indeed! Peter Potter's Patented","Multipurpose poison! A miracle of modern apothecarys!","My exclusive concoction has been test on..."); stage++ } 13 -> { player("Uh, yeah. I've already heard the sales pitch."); stage++ } @@ -83,8 +87,6 @@ class PoisonSalesman(player: Player? = null) : DialoguePlugin(player) { stage++ } 45 -> { npc("Well come back when you do!"); stage = END_DIALOGUE } - - END_DIALOGUE -> end() } return true diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SeerLockInterfaceListener.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SeerLockInterfaceListener.kt new file mode 100644 index 000000000..04ee4eb96 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SeerLockInterfaceListener.kt @@ -0,0 +1,166 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.sendMessage +import core.game.container.access.BitregisterAssembler +import rs09.game.interaction.InterfaceListener + +class SeerLockInterfaceListener : InterfaceListener() { + + override fun defineListeners() { + val LETTERONEBACK = 39 + val LETTERONEFORWARD = 40 + val LETTERTWOBACK = 35 + val LETTERTWOFORWARD = 36 + val LETTERTHREEBACK = 31 + val LETTERTHREEFORWARD = 32 + val LETTERFOURBACK = 27 + val LETTERFOURFORWARD = 28 + val ENTER = 1 + val EXIT = 2 + val DOORLOCKINTERFACE = 298 + val LETTERS = arrayOf("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") +// + onOpen(DOORLOCKINTERFACE){player, component -> + player.packetDispatch.sendVarcUpdate(618, 0) + player.packetDispatch.sendVarcUpdate(619, 0) + player.packetDispatch.sendVarcUpdate(620, 0) + player.packetDispatch.sendVarcUpdate(621, 0) + BitregisterAssembler.send(player,298,2,0,1, BitregisterAssembler(0)) + player.setAttribute("riddle-letter-one",0) + player.setAttribute("riddle-letter-two",0) + player.setAttribute("riddle-letter-three",0) + player.setAttribute("riddle-letter-four",0) + return@onOpen true + } +// + onClose(DOORLOCKINTERFACE){player, component -> + player.removeAttribute("riddle-letter-one") + player.removeAttribute("riddle-letter-two") + player.removeAttribute("riddle-letter-three") + player.removeAttribute("riddle-letter-four") + return@onClose true + } +// + on(DOORLOCKINTERFACE){player, component, opcode, buttonID, slot, itemID -> + when(buttonID){ + LETTERONEBACK ->{ + if(player.getAttribute("riddle-letter-one",0) == 0){ + player.setAttribute("riddle-letter-one",25) + } + else{ + (player.incrementAttribute("riddle-letter-one",-1)) + } + } + LETTERONEFORWARD ->{ + if(player.getAttribute("riddle-letter-one",0) == 25){ + player.setAttribute("riddle-letter-one",0) + } + else{ + (player.incrementAttribute("riddle-letter-one",1)) + } + } + LETTERTWOBACK ->{ + if(player.getAttribute("riddle-letter-two",0) == 0){ + player.setAttribute("riddle-letter-two",25) + } + else{ + (player.incrementAttribute("riddle-letter-two",-1)) + } + } + LETTERTWOFORWARD ->{ + if(player.getAttribute("riddle-letter-two",0) == 25){ + player.setAttribute("riddle-letter-two",0) + } + else{ + (player.incrementAttribute("riddle-letter-two",1)) + } + } + LETTERTHREEBACK ->{ + if(player.getAttribute("riddle-letter-three",0) == 0){ + player.setAttribute("riddle-letter-three",25) + } + else{ + (player.incrementAttribute("riddle-letter-three",-1)) + } + } + LETTERTHREEFORWARD ->{ + if(player.getAttribute("riddle-letter-three",0) == 25){ + player.setAttribute("riddle-letter-three",0) + } + else{ + (player.incrementAttribute("riddle-letter-three",1)) + } + } + LETTERFOURBACK ->{ + if(player.getAttribute("riddle-letter-four",0) == 0){ + player.setAttribute("riddle-letter-four",25) + } + else{ + (player.incrementAttribute("riddle-letter-four",-1)) + } + } + LETTERFOURFORWARD ->{ + if(player.getAttribute("riddle-letter-four",0) == 25){ + player.setAttribute("riddle-letter-four",0) + } + else{ + (player.incrementAttribute("riddle-letter-four",1)) + } + } + ENTER -> { + val letterOne = LETTERS[player.getAttribute("riddle-letter-one", 0)] + val letterTwo = LETTERS[player.getAttribute("riddle-letter-two", 0)] + val letterThree = LETTERS[player.getAttribute("riddle-letter-three", 0)] + val letterFour = LETTERS[player.getAttribute("riddle-letter-four", 0)] + when (player.getAttribute("PeerRiddle", 0)) { + 0 -> { + if (letterOne == "L" && letterTwo == "I" && letterThree == "F" && letterFour == "E") { + sendMessage(player, "You have solved the riddle!") + player.removeAttribute("PeerRiddle") + player.setAttribute("/save:riddlesolved", true) + player.interfaceManager.close() + } else { + sendMessage(player, "You have failed to solve the riddle.") + player.interfaceManager.close() + } + } + 1 -> { + if (letterOne == "M" && letterTwo == "I" && letterThree == "N" && letterFour == "D") { + sendMessage(player, "You have solved the riddle!") + player.removeAttribute("PeerRiddle") + player.setAttribute("/save:riddlesolved", true) + player.interfaceManager.close() + } else { + sendMessage(player, "You have failed to solve the riddle.") + player.interfaceManager.close() + } + } + 2 -> { + if (letterOne == "T" && letterTwo == "I" && letterThree == "M" && letterFour == "E") { + sendMessage(player, "You have solved the riddle!") + player.removeAttribute("PeerRiddle") + player.setAttribute("/save:riddlesolved", true) + player.interfaceManager.close() + } else { + sendMessage(player, "You have failed to solve the riddle.") + player.interfaceManager.close() + } + } + 3 -> { + if (letterOne == "W" && letterTwo == "I" && letterThree == "N" && letterFour == "D") { + sendMessage(player, "You have solved the riddle!") + player.removeAttribute("PeerRiddle") + player.setAttribute("/save:riddlesolved", true) + player.interfaceManager.close() + } else { + sendMessage(player, "You have failed to solve the riddle.") + player.interfaceManager.close() + } + } + } + } + } + return@on true + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SeersHouseListeners.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SeersHouseListeners.kt new file mode 100644 index 000000000..4ae59aa3a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SeersHouseListeners.kt @@ -0,0 +1,1097 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.* +import core.game.content.global.action.ClimbActionHandler +import core.game.content.global.action.DoorActionHandler +import core.game.node.entity.impl.Animator +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.audio.Audio +import core.game.node.scenery.Scenery +import core.game.node.scenery.SceneryBuilder +import core.game.world.map.Location +import core.game.world.map.zone.ZoneBorders +import core.game.world.update.flag.context.Animation +import org.rs09.consts.Items +import rs09.game.content.dialogue.DialogueFile +import rs09.game.interaction.InteractionListener +import rs09.tools.stringtools.RED + +class SeersHouseListeners : InteractionListener() { + + val WESTDOOR = 4165 + val EASTDOOR = 4166 + val WESTLADDER = 4163 + val EASTLADDER = 4164 + val WESTTRAPDOOR = getScenery(2631, 3663, 2)!! + val EASTTRAPDOOR = getScenery(2636, 3663, 2)!! + val TAP = 4176 + val COOKINGRANGE = 4172 + val DRAIN = 4175 + val CUPBOARD = 4178 + val BALANCECHEST = 4170 + val UNICORNHEAD = 4181 + val SOUTHBOXES = 4183 + val CHEST = intArrayOf (4167,4168) + val SOUTHCRATES = 4186 + val EASTCRATES = 4185 + val EASTBOXES = 4184 + val FROZENTABLE = 4169 + val BOOKCASE = 4171 + val BULLSHEAD = 4182 + val MURAL = 4179 + + val OLDREDDISK = Items.OLD_RED_DISK_9947 + val WOODENDISK = Items.WOODEN_DISK_3744 + val REDHERRING = Items.RED_HERRING_3742 + val BLUETHREAD = Items.THREAD_3719 + val PICK = Items.PICK_3720 + val SHIPTOY = Items.SHIP_TOY_3721 + val MAGNET = Items.MAGNET_3718 + val REDGOOP = Items.STICKY_RED_GOOP_3746 + val REDDISK = Items.RED_DISK_3743 + val VASELID = Items.VASE_LID_3737 + val VASE = Items.VASE_3734 + val FULLVASE = Items.VASE_OF_WATER_3735 + val FROZENVASE = Items.FROZEN_VASE_3736 + val SEALEDEMPTYVASE = Items.SEALED_VASE_3738 + val SEALEDFULLVASE = Items.SEALED_VASE_3739 + val FROZENKEY = Items.FROZEN_KEY_3741 + val SEERSKEY = Items.SEERS_KEY_3745 + val EMPTYBUCKET = Items.EMPTY_BUCKET_3727 + val ONEFIFTHBUCKET = Items.ONE_5THS_FULL_BUCKET_3726 + val TWOFIFTHBUCKET = Items.TWO_5THS_FULL_BUCKET_3725 + val THREEFIFTHBUCKET = Items.THREE_5THS_FULL_BUCKET_3724 + val FOURFIFTHBUCKET = Items.FOUR_5THS_FULL_BUCKET_3723 + val FULLBUCKET = Items.FULL_BUCKET_3722 + val FROZENBUCKET = Items.FROZEN_BUCKET_3728 + val EMPTYJUG = Items.EMPTY_JUG_3732 + val ONETHIRDJUG = Items.ONE_THIRDRDS_FULL_JUG_3731 + val TWOTHIRDJUG = Items.TWO_THIRDSRDS_FULL_JUG_3730 + val FULLJUG = Items.FULL_JUG_3729 + val FROZENJUG = Items.FROZEN_JUG_3733 + + val JUGS = intArrayOf( + Items.EMPTY_JUG_3732, + Items.ONE_THIRDRDS_FULL_JUG_3731, + Items.TWO_THIRDSRDS_FULL_JUG_3730, + Items.FULL_JUG_3729 + ) + + val BUCKETS = intArrayOf( + Items.EMPTY_BUCKET_3727, + Items.ONE_5THS_FULL_BUCKET_3726, + Items.TWO_5THS_FULL_BUCKET_3725, + Items.THREE_5THS_FULL_BUCKET_3724, + Items.FOUR_5THS_FULL_BUCKET_3723, + Items.FULL_BUCKET_3722 + ) + + val DISKS = intArrayOf( + Items.OLD_RED_DISK_9947, + Items.RED_DISK_3743 + ) + + val EASTZONE = ZoneBorders(2635, 3662, 2637, 3664, 2) + + val WESTZONE = ZoneBorders(2630, 3662, 2632, 3664, 2) + + override fun defineListeners() { + + on(WESTDOOR,SCENERY,"open"){player,node -> + if(!player.getAttribute("PeerStarted",false)){ + sendDialogue(player,"You should probably talk to the owner of this home.") + } + else if(player.getAttribute("PeerRiddle",5) < 5){ + player.dialogueInterpreter.open(DoorRiddleDialogue(player), Scenery(WESTDOOR,node.location)) + } + else if(player.getAttribute("riddlesolved",false)){ + if(player.location.x == 2631){ + player.inventory.clear() + DoorActionHandler.handleAutowalkDoor(player,node.asScenery()) + }else{ + DoorActionHandler.handleAutowalkDoor(player,node.asScenery()) + } + DoorActionHandler.handleAutowalkDoor(player,node.asScenery()) + } + return@on true + } + + on(WESTLADDER, SCENERY,"Climb-up") { player, node -> + ClimbActionHandler.climb(player, Animation(828), Location.create(2631, 3664, 2)) + return@on true + } + + on(WESTTRAPDOOR.id, SCENERY,"Climb-down") { player, node -> + if(player.location.x < 2634){ + ClimbActionHandler.climb(player, Animation(828), Location.create(2631, 3664, 0)) + } + else if(player.location.x > 2634){ + ClimbActionHandler.climb(player, Animation(828), Location.create(2636, 3664, 0)) + } + return@on true + } + + on(WESTTRAPDOOR.id, SCENERY,"Close") { player, node -> + SceneryBuilder.replace(node.asScenery(), node.asScenery().transform(4174)) + return@on true + } + + on(WESTTRAPDOOR.id, SCENERY,"Open") { player, node -> + SceneryBuilder.replace(node.asScenery(), node.asScenery().transform(4173)) + return@on true + } + + on(EASTTRAPDOOR.id, SCENERY,"Open") { player, node -> + SceneryBuilder.replace(node.asScenery(), node.asScenery().transform(4173)) + return@on true + } + + on(EASTTRAPDOOR.id, SCENERY,"Close") { player, node -> + SceneryBuilder.replace(node.asScenery(), node.asScenery().transform(4174)) + return@on true + } + + on(EASTTRAPDOOR.id, SCENERY,"Climb-down") { player, node -> + if(player.location.x > 2634){ + ClimbActionHandler.climb(player, Animation(828), Location.create(2636, 3664, 0)) + } + return@on true + } + + on(EASTLADDER, SCENERY,"Climb-Up") { player, node -> + ClimbActionHandler.climb(player, Animation(828), Location.create(2636, 3664, 2)) + return@on true + } + + on(CUPBOARD,SCENERY,"Search") { player, node -> + sendMessage(player,"You search the cupboard...") + if(player.inventory.contains(EMPTYBUCKET,1)){ + sendMessage(player,"You find nothing of interest.") + } + else{ + addItem(player,EMPTYBUCKET) + sendMessage(player,"You find a bucket with a number five painted on it.") + } + return@on true + } + + on(BALANCECHEST, SCENERY,"Open") { player, node -> + sendDialogue(player,"This chest is securely locked shut. There is some kind of balance attached to the lock, and a number four is painted just above it.") + return@on true + } + + on(BOOKCASE, SCENERY,"Search") { player, node -> + sendMessage(player,"You search the bookcase...") + if(player.inventory.contains(REDHERRING,1)){ + sendMessage(player,"You find nothing of interest.") + } + else{ + addItem(player,REDHERRING) + sendMessage(player,"Hidden behind some old books, you find a red herring.") + } + return@on true + } + + on(SOUTHBOXES, SCENERY,"Search"){ player, node -> + sendMessage(player,"You search the boxes...") + if(player.inventory.contains(BLUETHREAD,1)){ + sendMessage(player,"You find nothing of interest.") + } + else{ + addItem(player,BLUETHREAD) + sendMessage(player,"You find some thread hidden inside.") + } + return@on true + } + + on(CHEST, SCENERY,"Open"){ player, node -> + SceneryBuilder.replace(node.asScenery(), node.asScenery().transform(4168)) + return@on true + } + + on(CHEST, SCENERY,"Close"){ player, node -> + SceneryBuilder.replace(node.asScenery(), node.asScenery().transform(4167)) + return@on true + } + + on(CHEST, SCENERY,"Search"){ player, node -> + sendMessage(player,"You search the chest...") + if(player.inventory.contains(EMPTYJUG,1)){ + sendMessage(player,"You find nothing of interest.") + } + else{ + addItem(player,EMPTYJUG) + sendMessage(player,"You find a jug with a number three painted on it") + } + return@on true + } + + on(EASTCRATES, SCENERY,"Search") { player, node -> + sendMessage(player,"You search the crates...") + if(player.inventory.contains(PICK,1)){ + sendMessage(player,"You find nothing of interest.") + } + else{ + addItem(player,PICK) + sendMessage(player,"You find a small pick hidden inside.") + } + return@on true + } + + on(SOUTHCRATES, SCENERY,"Search") { player, node -> + sendMessage(player,"You search the crates...") + if(player.inventory.contains(SHIPTOY,1)){ + sendMessage(player,"You find nothing of interest.") + } + else{ + addItem(player,SHIPTOY) + sendMessage(player,"You findd a toy ship hidden inside") + } + return@on true + } + + on(SOUTHBOXES, SCENERY,"Search") { player, node -> + sendMessage(player,"You search the boxes...") + if(player.inventory.contains(MAGNET,1)){ + sendMessage(player,"You find nothing of interest.") + } + else{ + addItem(player,MAGNET) + sendMessage(player,"You find a magnet hidden inside.") + } + return@on true + } + + on(SOUTHBOXES, SCENERY,"Search") { player, node -> + sendMessage(player,"You search the boxes...") + if(player.inventory.contains(MAGNET,1)){ + sendMessage(player,"You find nothing of interest.") + } + else{ + addItem(player,MAGNET) + sendMessage(player,"You find a magnet hidden inside.") + } + return@on true + } + + on(BULLSHEAD, SCENERY,"Study") { player, node -> + player.dialogueInterpreter.open(BullHeadDialogue(player)) + return@on true + } + + on(UNICORNHEAD, SCENERY,"Study") { player, node -> + player.dialogueInterpreter.open(UnicornHeadDialogue(player)) + return@on true + } + + onUseWith(SCENERY,REDHERRING,COOKINGRANGE) { player, used, with -> + player.animate(Animation(883,Animator.Priority.HIGH)) + player.audioManager.send(Audio(2577, 1, 1)) + removeItem(player,REDHERRING) + addItem(player,REDGOOP) + sendDialogue(player,"As you cook the herring on the stove, the colouring on it peels off separately as a red sticky goop...") + return@onUseWith true + } + + onUseWith(ITEM,REDGOOP,WOODENDISK) { player, used, with -> + removeItem(player,WOODENDISK) + addItem(player,REDDISK) + sendMessage(player,"You coat the wooden coin with the sticky red goop.") + return@onUseWith true + } + + on(MURAL, SCENERY,"Study") { player, node -> + sendMessage(player,"The mural feels like something is missing.") + return@on true + } + + onUseWith(SCENERY,TAP,*BUCKETS) { player, _, bucket -> + when(bucket.id){ + 3727 ->{ + removeItem(player,EMPTYBUCKET) + addItem(player,FULLBUCKET) + sendMessage(player,"You fill the bucket from the tap.") + return@onUseWith true + } + ONEFIFTHBUCKET ->{ + removeItem(player,ONEFIFTHBUCKET) + addItem(player,FULLBUCKET) + sendMessage(player,"You fill the bucket from the tap.") + } + TWOFIFTHBUCKET ->{ + removeItem(player,TWOFIFTHBUCKET) + addItem(player,FULLBUCKET) + sendMessage(player,"You fill the bucket from the tap.") + } + THREEFIFTHBUCKET ->{ + removeItem(player,THREEFIFTHBUCKET) + addItem(player,FULLBUCKET) + sendMessage(player,"You fill the bucket from the tap.") + } + FOURFIFTHBUCKET ->{ + removeItem(player,FOURFIFTHBUCKET) + addItem(player,FULLBUCKET) + sendMessage(player,"You fill the bucket from the tap.") + } + FULLBUCKET ->{ + sendMessage(player,"The bucket is already full!") + } + else -> sendMessage(player,"FUCKFUCKFUCKFUCK") + } + return@onUseWith true + } + + onUseWith(SCENERY,TAP,*JUGS) { player, used, with -> + when(with.id){ + EMPTYJUG ->{ + removeItem(player,EMPTYJUG) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug from the tap.") + } + ONETHIRDJUG ->{ + removeItem(player,ONETHIRDJUG) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug from the tap.") + } + TWOTHIRDJUG ->{ + removeItem(player,TWOTHIRDJUG) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug from the tap.") + } + FULLJUG ->{ + sendMessage(player,"The jug is already full!") + } + } + return@onUseWith true + } + + onUseWith(SCENERY,DRAIN,*BUCKETS) { player, used, with -> + when(with.id){ + EMPTYBUCKET ->{ + sendMessage(player,"The bucket is already empty!") + } + ONEFIFTHBUCKET ->{ + removeItem(player,ONEFIFTHBUCKET) + addItem(player,EMPTYBUCKET) + sendMessage(player,"You empty the bucket down the drain.") + } + TWOFIFTHBUCKET ->{ + removeItem(player,TWOFIFTHBUCKET) + addItem(player,EMPTYBUCKET) + sendMessage(player,"You empty the bucket down the drain.") + } + THREEFIFTHBUCKET ->{ + removeItem(player,THREEFIFTHBUCKET) + addItem(player,EMPTYBUCKET) + sendMessage(player,"You empty the bucket down the drain.") + } + FOURFIFTHBUCKET ->{ + removeItem(player,FOURFIFTHBUCKET) + addItem(player,EMPTYBUCKET) + sendMessage(player,"You empty the bucket down the drain.") + } + FULLBUCKET ->{ + removeItem(player,FULLBUCKET) + addItem(player,EMPTYBUCKET) + sendMessage(player,"You empty the bucket down the drain.") + } + } + return@onUseWith true + } + + onUseWith(SCENERY,DRAIN,*JUGS) { player, used, with -> + when(with.id){ + EMPTYJUG ->{ + sendMessage(player,"The jug is already empty!") + } + ONETHIRDJUG ->{ + removeItem(player,ONETHIRDJUG) + addItem(player,EMPTYJUG) + sendMessage(player,"You empty the jug down the drain.") + } + TWOTHIRDJUG ->{ + removeItem(player,TWOTHIRDJUG) + addItem(player,EMPTYJUG) + sendMessage(player,"You empty the jug down the drain.") + } + FULLJUG ->{ + removeItem(player,FULLJUG) + addItem(player,EMPTYJUG) + sendMessage(player,"You empty the jug down the drain.") + } + } + return@onUseWith true + } + + onUseWith(ITEM,REDGOOP,WOODENDISK) { player, _, _ -> + removeItem(player,REDGOOP) + removeItem(player,WOODENDISK) + addItem(player,REDDISK) + return@onUseWith true + } + + onUseWith(SCENERY,BALANCECHEST, FOURFIFTHBUCKET) { player, used, with -> + removeItem(player,FOURFIFTHBUCKET) + addItem(player,VASE) + sendMessage(player,"You place the bucket on the scale.") + sendMessage(player,"It is a perfect counterweight and balances precisely.") + sendMessage(player,"You take a strange looking vase out of the chest.") + return@onUseWith true + } + + onUseWith(SCENERY,MURAL,*DISKS) { player, used, with -> + when(with.id){ + REDDISK ->{ + if(player.getAttribute("olddiskplaced",false)){ + removeItem(player,REDDISK) + addItem(player,VASELID) + sendDialogue(player,"You put the red disk into the empty hole on the mural. It is a perfect fit! The centre of the mural appears to have become loose.") + } + else if(player.getAttribute("reddiskplaced",false)){ + sendMessage(player,"You already have a disk in that spot") + } + else{ + removeItem(player, REDDISK) + sendMessage(player,"You put the red disk into the empty hold on the mural.") + sendMessage(player, "It's a perfect fit!") + player.setAttribute("reddiskplaced",true) + } + } + OLDREDDISK -> { + if(player.getAttribute("reddiskplaced", false)) { + removeItem(player, OLDREDDISK) + addItem(player, VASELID) + sendDialogue(player, "You put the red disk into the empty hole on the mural. It is a perfect fit! The centre of the mural appears to have become loose.") + } + else if(player.getAttribute("olddiskplaced", false)) { + sendMessage(player, "You already have a disk in that spot") + } + else{ + removeItem(player, OLDREDDISK) + sendMessage(player, "You put the red disk into the empty hold on the mural.") + sendMessage(player, "It's a perfect fit!") + player.setAttribute("olddiskplaced", true) + } + } + } + return@onUseWith true + } + + onUseWith(SCENERY,BALANCECHEST,*BUCKETS) { player, used, with -> + when(with.id){ + EMPTYBUCKET ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the bucket on the scale") + sendMessage(player,"It is too light to balance it properly") + } + ONEFIFTHBUCKET ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the bucket on the scale") + sendMessage(player,"It is too light to balance it properly") + } + TWOFIFTHBUCKET ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the bucket on the scale") + sendMessage(player,"It is too light to balance it properly") + } + THREEFIFTHBUCKET ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the bucket on the scale") + sendMessage(player,"It is too light to balance it properly") + } + FOURFIFTHBUCKET ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the bucket on the scale") + sendMessage(player,"It is a perfect counterweight and balances precisely.") + sendMessage(player,"You take a strange looking vase out of the chest.") + addItem(player,VASE) + } + FULLBUCKET ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the bucket on the scale") + sendMessage(player,"It is too heavy to balance it properly") + } + } + return@onUseWith true + } + + onUseWith(SCENERY,BALANCECHEST,*JUGS) { player, used, with -> + when(with.id){ + EMPTYJUG ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the jug on the scale") + sendMessage(player,"It is too light to balance it properly") + } + ONETHIRDJUG ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the jug on the scale") + sendMessage(player,"It is too light to balance it properly") + } + TWOTHIRDJUG ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the jug on the scale") + sendMessage(player,"It is too light to balance it properly") + } + FULLJUG ->{ + player.animate(Animation(883,Animator.Priority.HIGH)) + sendMessage(player,"You place the jug on the scale") + sendMessage(player,"It is too light to balance it properly") + } + } + return@onUseWith true + } + + onUseWith(SCENERY,FROZENTABLE,*BUCKETS) { player, used, with -> + when(with.id){ + EMPTYBUCKET -> sendMessage(player,"Your empty bucket gets very cold on the icy table.") + FULLBUCKET -> { + player.animate(Animation(883,Animator.Priority.HIGH)) + removeItem(player,FULLBUCKET) + addItem(player,FROZENBUCKET) + sendMessage(player,"They icy table immediately freezes the water in your bucket.") + } + } + return@onUseWith true + } + + onUseWith(SCENERY,FROZENTABLE, *JUGS) { player, used, with -> + when(with.id){ + EMPTYJUG -> sendMessage(player,"Your empty jug gets very cold on the icy table.") + FULLJUG -> { + player.animate(Animation(883,Animator.Priority.HIGH)) + removeItem(player,FULLJUG) + addItem(player,FROZENJUG) + sendMessage(player,"The icy table immediately freezes the water in your jug.") + } + } + return@onUseWith true + } + + onUseWith(ITEM,BUCKETS,*JUGS) { player, used, with -> + when(used.id){ + ONEFIFTHBUCKET -> { + when(with.id){ + EMPTYJUG ->{ + removeItem(player,ONEFIFTHBUCKET) + removeItem(player,EMPTYJUG) + addItem(player,EMPTYBUCKET) + addItem(player,ONETHIRDJUG) + sendMessage(player,"You empty the bucket into the jug") + } + ONETHIRDJUG ->{ + removeItem(player,ONEFIFTHBUCKET) + removeItem(player,ONETHIRDJUG) + addItem(player,EMPTYBUCKET) + addItem(player,TWOTHIRDJUG) + sendMessage(player,"You empty the bucket into the jug") + } + TWOTHIRDJUG ->{ + removeItem(player,ONEFIFTHBUCKET) + removeItem(player,TWOTHIRDJUG) + addItem(player,EMPTYBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + FULLJUG -> sendMessage(player,"The jug is already full!") + } + } + TWOFIFTHBUCKET -> { + when(with.id){ + EMPTYJUG ->{ + removeItem(player,TWOFIFTHBUCKET) + removeItem(player,EMPTYJUG) + addItem(player,EMPTYBUCKET) + addItem(player,TWOTHIRDJUG) + sendMessage(player,"You empty the bucket into the jug") + } + ONETHIRDJUG ->{ + removeItem(player,TWOFIFTHBUCKET) + removeItem(player,ONETHIRDJUG) + addItem(player,EMPTYBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + TWOTHIRDJUG ->{ + removeItem(player,TWOFIFTHBUCKET) + removeItem(player,TWOTHIRDJUG) + addItem(player,ONEFIFTHBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + FULLJUG ->sendMessage(player,"The jug is already full!") + } + } + THREEFIFTHBUCKET -> { + when(with.id){ + EMPTYJUG ->{ + removeItem(player,THREEFIFTHBUCKET) + removeItem(player,EMPTYJUG) + addItem(player,EMPTYBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + ONETHIRDJUG ->{ + removeItem(player,THREEFIFTHBUCKET) + removeItem(player,ONETHIRDJUG) + addItem(player,ONEFIFTHBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + TWOTHIRDJUG ->{ + removeItem(player,THREEFIFTHBUCKET) + removeItem(player,TWOTHIRDJUG) + addItem(player,TWOFIFTHBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + FULLJUG ->sendMessage(player,"The jug is already full!") + } + } + FOURFIFTHBUCKET -> { + when(with.id){ + EMPTYJUG ->{ + removeItem(player,FOURFIFTHBUCKET) + removeItem(player,EMPTYJUG) + addItem(player,ONEFIFTHBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + ONETHIRDJUG ->{ + removeItem(player,FOURFIFTHBUCKET) + removeItem(player,ONETHIRDJUG) + addItem(player,TWOFIFTHBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + TWOTHIRDJUG ->{ + removeItem(player,FOURFIFTHBUCKET) + removeItem(player,TWOTHIRDJUG) + addItem(player,THREEFIFTHBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + FULLJUG ->sendMessage(player,"The jug is already full!") + } + } + FULLBUCKET -> { + when(with.id){ + EMPTYJUG ->{ + removeItem(player,FULLBUCKET) + removeItem(player,EMPTYJUG) + addItem(player,TWOFIFTHBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + ONETHIRDJUG ->{ + removeItem(player,FULLBUCKET) + removeItem(player,ONETHIRDJUG) + addItem(player,THREEFIFTHBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + TWOTHIRDJUG ->{ + removeItem(player,FULLBUCKET) + removeItem(player,TWOTHIRDJUG) + addItem(player,FOURFIFTHBUCKET) + addItem(player,FULLJUG) + sendMessage(player,"You fill the jug to the brim.") + } + FULLJUG ->sendMessage(player,"The jug is already full!") + } + } + } + return@onUseWith true + } + + onUseWith(ITEM,JUGS,*BUCKETS) { player, used, with -> + when(used.id){ + ONETHIRDJUG->{ + when(with.id){ + EMPTYBUCKET ->{ + removeItem(player,ONETHIRDJUG) + removeItem(player,EMPTYBUCKET) + addItem(player,EMPTYJUG) + addItem(player,ONEFIFTHBUCKET) + sendMessage(player,"You empty the jug into the bucket.") + } + ONEFIFTHBUCKET ->{ + removeItem(player,ONETHIRDJUG) + removeItem(player,ONEFIFTHBUCKET) + addItem(player,EMPTYJUG) + addItem(player,TWOFIFTHBUCKET) + sendMessage(player,"You empty the jug into the bucket.") + } + TWOFIFTHBUCKET ->{ + removeItem(player,ONETHIRDJUG) + removeItem(player,TWOFIFTHBUCKET) + addItem(player,EMPTYJUG) + addItem(player,THREEFIFTHBUCKET) + sendMessage(player,"You empty the jug into the bucket.") + } + THREEFIFTHBUCKET ->{ + removeItem(player,ONETHIRDJUG) + removeItem(player,THREEFIFTHBUCKET) + addItem(player,EMPTYJUG) + addItem(player,FOURFIFTHBUCKET) + sendMessage(player,"You empty the jug into the bucket.") + } + FOURFIFTHBUCKET ->{ + removeItem(player,ONETHIRDJUG) + removeItem(player,FOURFIFTHBUCKET) + addItem(player,EMPTYJUG) + addItem(player,FULLBUCKET) + sendMessage(player,"You fill the bucket to the brim.") + } + FULLBUCKET -> sendMessage(player,"The bucket is already full!") + } + } + TWOTHIRDJUG->{ + when(with.id){ + EMPTYBUCKET ->{ + removeItem(player,TWOTHIRDJUG) + removeItem(player,EMPTYBUCKET) + addItem(player,TWOFIFTHBUCKET) + addItem(player,EMPTYJUG) + sendMessage(player,"You empty the jug into the bucket.") + } + ONEFIFTHBUCKET ->{ + removeItem(player,TWOTHIRDJUG) + removeItem(player,ONEFIFTHBUCKET) + addItem(player,THREEFIFTHBUCKET) + addItem(player,EMPTYJUG) + sendMessage(player,"You empty the jug into the bucket.") + } + TWOFIFTHBUCKET ->{ + removeItem(player,TWOTHIRDJUG) + removeItem(player,TWOFIFTHBUCKET) + addItem(player,FOURFIFTHBUCKET) + addItem(player,EMPTYJUG) + sendMessage(player,"You empty the jug into the bucket.") + } + THREEFIFTHBUCKET ->{ + removeItem(player,TWOTHIRDJUG) + removeItem(player,THREEFIFTHBUCKET) + addItem(player,FULLBUCKET) + addItem(player,EMPTYJUG ) + sendMessage(player,"You fill the bucket to the brim.") + } + FOURFIFTHBUCKET ->{ + removeItem(player,TWOTHIRDJUG) + removeItem(player,FOURFIFTHBUCKET) + addItem(player,FULLBUCKET) + addItem(player,ONETHIRDJUG) + sendMessage(player,"You fill the bucket to the brim.") + } + FULLBUCKET -> sendMessage(player,"The bucket is already full!") + } + } + FULLJUG->{ + when(with.id){ + EMPTYBUCKET ->{ + removeItem(player,FULLJUG) + removeItem(player,EMPTYBUCKET) + addItem(player,THREEFIFTHBUCKET) + addItem(player,EMPTYJUG) + sendMessage(player,"You empty the jug into the bucket.") + } + ONEFIFTHBUCKET ->{ + removeItem(player,FULLJUG) + removeItem(player,ONEFIFTHBUCKET) + addItem(player,FOURFIFTHBUCKET) + addItem(player,EMPTYJUG) + sendMessage(player,"You empty the jug into the bucket.") + } + TWOFIFTHBUCKET ->{ + removeItem(player,FULLJUG) + removeItem(player,TWOFIFTHBUCKET) + addItem(player,FULLBUCKET) + addItem(player,EMPTYJUG) + sendMessage(player,"You fill the bucket to the brim.") + } + THREEFIFTHBUCKET ->{ + removeItem(player,FULLJUG) + removeItem(player,THREEFIFTHBUCKET) + addItem(player,FULLBUCKET) + addItem(player,ONETHIRDJUG) + sendMessage(player,"You fill the bucket to the brim.") + } + FOURFIFTHBUCKET ->{ + removeItem(player,FULLJUG) + removeItem(player,FOURFIFTHBUCKET) + addItem(player,FULLBUCKET) + addItem(player,TWOTHIRDJUG) + sendMessage(player,"You fill the bucket to the brim.") + } + FULLBUCKET -> sendMessage(player,"The bucket is already full!") + } + } + } + return@onUseWith true + } + + on(VASE,ITEM,"Shake") { player, node -> + sendDialogue(player,"You shake the strangely shaped Vase. From the sound of it there is something metallic inside, but the neck of th vase is too narrow for it to come out.") + return@on true + } + + onUseWith(ITEM,PICK,VASE) { player, used, with -> + sendMessage(player,"The pick wouldn't be strong enough to break the vase open.") + return@onUseWith true + } + + onUseWith(ITEM,MAGNET,VASE) { player, used, with -> + sendMessage(player,"You use the magnet on the vase. The metallic object inside moves.") + sendMessage(player,"The neck of the vase is too thin for thee object to come out of the vase.") + return@onUseWith true + } + + onUseWith(SCENERY,TAP,VASE) { player, used, with -> + removeItem(player,VASE) + addItem(player,FULLVASE) + sendMessage(player,"You fill the strange looking vase with water.") + return@onUseWith true + } + + onUseWith(ITEM,FULLJUG,VASE) { player, used, with -> + removeItem(player,FULLJUG) + removeItem(player,VASE) + addItem(player,EMPTYJUG) + addItem(player,FULLVASE) + sendMessage(player,"You fill the vase with water.") + return@onUseWith true + } + + on(FULLVASE,ITEM,"Shake") { player, node -> + sendDialogue(player,"You shake the strangely shaped vase. The water inside it sloshes a little. Some spills out of the neck of the vase.") + return@on true + } + + onUseWith(ITEM,VASE,VASELID) { player, used, with -> + removeItem(player,VASE) + removeItem(player,VASELID) + addItem(player,SEALEDEMPTYVASE) + sendMessage(player,"You screw the lid on tightly.") + return@onUseWith true + } + + onUseWith(ITEM,FULLVASE,VASELID) { player, used, with -> + removeItem(player,FULLVASE) + removeItem(player,VASELID) + addItem(player,SEALEDFULLVASE) + sendMessage(player,"You screw the lid on tightly.") + return@onUseWith true + } + + on(SEALEDEMPTYVASE,ITEM,"Remove-lid") { player, node -> + removeItem(player,SEALEDEMPTYVASE) + addItem(player,VASE) + addItem(player,VASELID) + sendMessage(player,"You unscrew the lid from the vase.") + return@on true + } + + on(SEALEDFULLVASE,ITEM,"Remove-lid") { player, node -> + removeItem(player,SEALEDFULLVASE) + addItem(player,VASE) + addItem(player,VASELID) + sendMessage(player,"You unscrew the lid from the vase.") + return@on true + } + + onUseWith(SCENERY,FROZENTABLE, FULLVASE) { player, used, with -> + player.animate(Animation(883,Animator.Priority.HIGH)) + removeItem(player,VASE) + addItem(player,FROZENVASE) + sendMessage(player,"The icy table immediately freezes the water in your vase.") + return@onUseWith true + } + + onUseWith(SCENERY,FROZENTABLE, SEALEDFULLVASE) { player, used, with -> + player.animate(Animation(883,Animator.Priority.HIGH)) + removeItem(player,SEALEDFULLVASE) + addItem(player,FROZENKEY) + sendMessage(player,"The water expands as it freezes, and shatters the vase.") + sendMessage(player,"You are left with a key encased in ice.") + return@onUseWith true + } + + onUseWith(SCENERY,COOKINGRANGE, FROZENBUCKET) { player, used, with -> + player.animate(Animation(883,Animator.Priority.HIGH)) + player.audioManager.send(Audio(2577, 1, 1)) + removeItem(player,FROZENBUCKET) + addItem(player,EMPTYBUCKET) + sendMessage(player,"You place the frozen bucket on the range. The ice turns to steam.") + return@onUseWith true + } + + onUseWith(SCENERY,COOKINGRANGE, FROZENJUG) { player, used, with -> + player.animate(Animation(883,Animator.Priority.HIGH)) + player.audioManager.send(Audio(2577, 1, 1)) + removeItem(player,FROZENJUG) + addItem(player,EMPTYJUG) + sendMessage(player,"You place the frozen jug on the range. The ice turns to steam.") + return@onUseWith true + } + + onUseWith(SCENERY,COOKINGRANGE, FROZENVASE) { player, used, with -> + player.animate(Animation(883,Animator.Priority.HIGH)) + player.audioManager.send(Audio(2577, 1, 1)) + removeItem(player,FROZENVASE) + addItem(player,VASE) + sendMessage(player,"You place the frozen vase on the range. The ice turns into steam.") + return@onUseWith true + } + + onUseWith(SCENERY,COOKINGRANGE, FROZENKEY) { player, used, with -> + player.animate(Animation(883,Animator.Priority.HIGH)) + player.audioManager.send(Audio(2577, 1, 1)) + removeItem(player,FROZENKEY) + addItem(player,SEERSKEY) + sendMessage(player,"The heat of the range melts the ice around the key.") + return@onUseWith true + } + + on(EASTDOOR, SCENERY,"Open") { player, node -> + if(player.inventory.contains(SEERSKEY,1)){ + player.setAttribute("/save:housepuzzlesolved",true) + player.inventory.clear() + DoorActionHandler.handleAutowalkDoor(player,node.asScenery()) + player.setAttribute("/save:fremtrials:peer-vote",true) + player.setAttribute("/save:fremtrials:votes",player.getAttribute("fremtrials:votes",0) + 1) + sendNPCDialogue(player,1288,"Incredible! To have solved my puzzle so quickly! I have no choice but to vote in your favour!") + } + else sendMessage(player,"This door is locked tightly shut.") + return@on true + } + + } +} + +class BullHeadDialogue(player:Player) : DialogueFile() { + + private val WOODENDISK = Items.WOODEN_DISK_3744 + + val p = player + + override fun handle(componentID: Int, buttonID: Int) { + when(stage){ + 0 -> sendDialogue(p,"You notice there is something unusual about the right eye of this bulls' head...").also { + if(p.inventory.contains(WOODENDISK,1)){ + stage = 10 + }else stage = 1 + } + 1 -> sendDialogue(p,"It is not an eye at all, but some kind of disk made of wood. You take it from the head").also { + addItem(p,WOODENDISK) + stage = 1000 + } + 10 -> sendMessage(p,"It's unusual because you've already taken it!").also { stage = 1000 } + 1000 -> end() + } + } +} + +class UnicornHeadDialogue(player:Player) : DialogueFile() { + + private val OLDREDDISK = Items.OLD_RED_DISK_9947 + + val p = player + + override fun handle(componentID: Int, buttonID: Int) { + when(stage){ + 0 -> sendDialogue(p,"You notice there is something unusual about the left eye of this unicorn head...").also { + if(p.inventory.contains(OLDREDDISK,1)){ + stage = 10 + }else stage = 1 + } + 1 -> sendDialogue(p,"It is not an eye at all, but some kind of redd coloured disk. You take it from the head").also { + addItem(p,OLDREDDISK) + stage = 1000 + } + 10 -> sendMessage(p,"It's unusual because you've already taken it!").also { stage = 1000 } + 1000 -> end() + } + } +} + +class DoorRiddleDialogue(player: Player) : DialogueFile() { + + private val RIDDLEONE = arrayOf( + "My first is in the well, but not at sea.", + "My second in 'I', but not in 'me'.", + "My third is in flies, but insects not found.", + "My last is in earth, but not in the ground.", + "My whole when stolen from you, caused you death.", + "What am I?" + ) + + private val RIDDLETWO = arrayOf( + "My first is in mage, but not in wizard.", + "My second in goblin, and also in lizard.", + "My third is in night, but not in the day.", + "My last is in fields, but not in the hay.", + "My whole is the most powerful tool you will ever possess.", + "What am I?" + ) + + private val RIDDLETHREE = arrayOf( + "My first is in water, and also in tea.", + "My second in fish, but not in the sea.", + "My third in mountains, but not underground.", + "My last is in strike, but not in pound.", + "My whole crushes mountains, drains rivers, and destroys civilisations.", + "All that live fear my passing.", + "What am I?" + ) + + private val RIDDLEFOUR = arrayOf( + "My first is in wizard, but not in a mage.", + "My second in jail, but not in a cage.", + "My third is in anger, but not in a rage.", + "My last in a drawing, but not on a page.", + "My whole helps to make bread, let birds fly and boats sail.", + "What am I?" + ) + + private val RIDDLEANSWER = arrayOf("LIFE","MIND","TIME","WIND") + + val p = player + + val riddle = when(p.getAttribute("PeerRiddle",0)){ + 0 -> RIDDLEONE + 1 -> RIDDLETWO + 2 -> RIDDLETHREE + 3 -> RIDDLEFOUR + else -> RIDDLEONE + } + + var init = true + + override fun handle(componentID: Int, buttonID: Int) { + if(init){ + stage = 1 + init = false + } + when(stage){ + 1 -> sendDialogue(player!!,"There is a combination lock on this door. Above the lock you can see that there is a metal plaque with a riddle on it.").also { stage = 5 } + 5 -> options("Read the riddle","Solve the riddle","Forget it").also { stage = 10 } + 10 -> when(buttonID){ + 1 -> dialogue(riddle[0],riddle[1],riddle[2],riddle[3]).also { stage = 20 } + 2 -> { + openInterface(p,298) + end() + } + 3 -> end() + } + 15 ->{ + dialogue(riddle[0],riddle[1],riddle[2],riddle[3]) + stage = 20 + } + 20 -> if(riddle.contentEquals(RIDDLETHREE)){ + dialogue(riddle[4],riddle[5],riddle[6]).also { stage = 1000 } + }else{ + dialogue(riddle[4],riddle[5]).also { stage = 1000 } + } + 1000 -> end() + } + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt index 57bf7d8ef..2533d9c3e 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt @@ -1,15 +1,43 @@ package rs09.game.content.quest.members.thefremenniktrials +import api.addItem +import api.removeItem import core.game.node.entity.player.Player import core.game.node.entity.player.info.PlayerDetails import core.game.node.item.Item import core.plugin.Initializable import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression @Initializable class SigliTheHuntsman(player: Player? = null) : DialoguePlugin(player){ override fun open(vararg args: Any?): Boolean { - if(player?.getAttribute("fremtrials:sigli-vote",false)!!){ + if(player?.inventory?.contains(3702,1) == true){ + npcl(FacialExpression.HAPPY,"Greetings outerlander.") + stage = 165 + return true + } + else if(player?.inventory?.contains(3701,1) == true){ + playerl(FacialExpression.ASKING,"So you really don't mind giving this away to me?") + stage = 170 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"I have an item to trade.") + stage = 175 + return true + } + if(player?.getAttribute("sigmund-steps", 0) == 6){ + npcl(FacialExpression.HAPPY,"Greetings outerlander.") + stage = 160 + return true + } + else if(player?.getAttribute("sigmund-steps", 0) == 5){ + npcl(FacialExpression.HAPPY,"Greetings outerlander.") + stage = 150 + return true + } + else if(player?.getAttribute("fremtrials:sigli-vote",false)!!){ npc("You have my vote!") stage = 1000 return true @@ -19,9 +47,21 @@ class SigliTheHuntsman(player: Player? = null) : DialoguePlugin(player){ stage = 100 return true } - npc("What do you want outerlander?") - stage = 0 - return true + else if(player.questRepository.isComplete("Fremennik Trials")){ + playerl(FacialExpression.HAPPY,"Hello again Sigli.") + stage = 180 + return true + } + else if(player.questRepository.hasStarted("Fremennik Trials")){ + npc("What do you want outerlander?") + stage = 0 + return true + } + else{ + npcl(FacialExpression.HAPPY,"I do not speak to outerlanders. If you have anything of import to say, go and speak to the Chieftain.") + stage = 1000 + return true + } } override fun handle(interfaceId: Int, buttonId: Int): Boolean { @@ -64,12 +104,43 @@ class SigliTheHuntsman(player: Player? = null) : DialoguePlugin(player){ //Draugen killed 100 -> player("Thanks!").also { player.removeAttribute("fremtrials:draugen-killed"); - player.setAttribute("fremtrials:sigli-vote",true) + player.setAttribute("/save:fremtrials:sigli-vote",true) player?.setAttribute("/save:fremtrials:votes",player.getAttribute("fremtrials:votes",0) + 1) player?.inventory?.remove(Item(3697)) stage = 1000 } + 150 -> playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a map to unspoiled hunting grounds, do you?").also { stage++ } + 151 -> npcl(FacialExpression.HAPPY,"Well, of course I do. I wouldn't be much of a huntsman if I didn't know where to find my prey now, would I outerlander?").also { stage++ } + 152 -> playerl(FacialExpression.ASKING,"No, I guess not. So can I have it?").also { stage++ } + 153 -> npcl(FacialExpression.ANNOYED,"Directions to my hunting grounds could mean the end of my livelihood. The only way I would be prepared to give them up would be...").also { stage++ } + 154 -> playerl(FacialExpression.THINKING,"What? Power? Money? Women? Wine?").also { stage++ } + 155 -> npcl(FacialExpression.HAPPY,"...a new string for my hunting bow. Not just any bowstring; I need a custom bowstring, balanced for my bow precisely to keep my hunt competitive.").also { stage++ } + 156 -> npcl(FacialExpression.HAPPY,"Only in this way would I allow the knowledge of my hunting grounds to be passed on to strangers.").also { stage++ } + 157 -> playerl(FacialExpression.THINKING,"So where would I get that?").also { stage++ } + 158 -> npcl(FacialExpression.HAPPY,"I have no idea. But then again, I'm happy with my old bowstring and being the only person who knows where my hunting ground is.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 160 -> playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a finely balanced custom bowstring, do you?").also { stage++ } + 161 -> npcl(FacialExpression.ANNOYED,"If I knew I would not have asked you to go and get me one, now would I?").also { stage = 1000 } + + 165 -> playerl(FacialExpression.HAPPY,"Here. I have your bowstring. Give me your map to the hunting grounds.").also { + removeItem(player,3702) + addItem(player,3701) + stage++ + } + 166 -> npcl(FacialExpression.HAPPY,"Well met, outerlander. I see some hunting potential within you. Here, take my map, I was getting too dependent on it for my skill anyway.").also { stage = 1000 } + + 170 -> npcl(FacialExpression.HAPPY,"No outerlander... it is hard to explain. That map makes my role as huntsman too easy. I fear my skills are becoming dulled.").also { stage++ } + 171 -> npcl(FacialExpression.HAPPY,"Now I must track my prey once more. To begin again from scratch... I feel this may keep me sharp.").also { stage = 1000 } + + 175 -> npcl(FacialExpression.ANNOYED,"Not the one I want, outerlander.").also { stage = 1000 } + + 180 -> npcl(FacialExpression.HAPPY,"Hello again to you ${player.getAttribute("fremennikname","spinky")}. How goes the hunt?").also { stage++ } + 181 -> playerl(FacialExpression.ASKING,"They hunt? I've already done your task! That's why I'm a Fremennik now!").also { stage++ } + 182 -> npcl(FacialExpression.HAPPY,"You think so do you? The Draugen is always out there, just as I and my hunters are always on its trail to keep it at bay. The hunt will never end until I do.").also { stage = 1000 } + 1000 -> end() } return true diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SigmundDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SigmundDialogue.kt new file mode 100644 index 000000000..19a801bf4 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SigmundDialogue.kt @@ -0,0 +1,146 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.addItem +import api.removeItem +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import org.rs09.consts.Items + +@Initializable +class SigmundDialogue (player: Player? = null) : DialoguePlugin(player) { + + private val QUEST_ITEMS = intArrayOf(3709,3707,3706,3710,3705,3704,3703,3702,3701,3708,3700,3699,3698) + + val gender = if(player?.isMale == true){ + "brother" + }else "sister" + + val fName = player?.getAttribute("fremennikname","uhhh fucking uhhh geoff lol") + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + if(player.questRepository.isComplete("Fremennik Trials")){ + playerl(FacialExpression.HAPPY,"Hello there!") + stage = 50 + return true + } + else if(!player.questRepository.hasStarted("Fremennik Trials")){ + playerl(FacialExpression.HAPPY,"Hello there!") + stage = 60 + return true + } + if(player?.inventory?.contains(3698,1) == true){ + playerl(FacialExpression.HAPPY,"Here's that flower you wanted.") + stage = 30 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true && !player.inventory.containsAtLeastOneItem(QUEST_ITEMS)){ + npcl(FacialExpression.ASKING,"So... how goes it outerlander? Did you manage to obtain my flower for me yet? Or do you lack the necessary merchanting skills?") + stage = 35 + return true + } + if(player?.getAttribute("sigmund-started",false)!!){ + playerl(FacialExpression.HAPPY,"Hello there!") + stage = 25 + return true + } + else if(!player?.getAttribute("fremtrials:sigmund-vote",false)!!){ + playerl(FacialExpression.HAPPY,"Hello there!") + stage = 1 + return true + } + else if(player?.getAttribute("fremtrials:sigmund-vote",false) == true){ + playerl(FacialExpression.HAPPY,"Hello there!") + stage = 40 + return true + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> npcl(FacialExpression.NEUTRAL,"Hello outlander.").also { stage++ } + 2 -> playerl(FacialExpression.NEUTRAL,"Are you a member of the council?").also { stage++ } + 3 -> npcl(FacialExpression.NEUTRAL,"That I am outlander; it is a position that brings my family and I pride.").also { stage++ } + 4 -> playerl(FacialExpression.NEUTRAL,"I was wondering if I can count on your vote at the council of elders?").also { stage++ } + 5 -> npcl(FacialExpression.THINKING,"You wish to become a Fremennik? I may be persuaded to swing my vote to your favor, but you will first need to do a little task for me.").also { stage++ } + 6 -> playerl(FacialExpression.ANNOYED,"How did I know it wouldn't be that simple for your vote?").also { stage++ } + 7 -> npcl(FacialExpression.NEUTRAL,"Calm yourself outerlander. It is but a small task really... I simply require a flower.").also { stage++ } + 8 -> playerl(FacialExpression.ASKING,"A flower? What's the catch?").also { stage++ } + 9 -> npcl(FacialExpression.NEUTRAL,"The catch? Well, it is not just any flower. Someone in this town has an extremely unique flower from a far off land that they picked up on their travels.").also { stage++ } + 10 -> npcl(FacialExpression.NEUTRAL,"I would like you to demonstrate your merchanting skills to me by persuading them to part with it, and then give it to me for my vote.").also { stage++ } + 11 -> playerl(FacialExpression.THINKING,"Well... I guess that doesn't sound too hard.").also { stage++ } + 12 -> npcl(FacialExpression.HAPPY,"Excellent! You will obtain this flower for me, then?").also { stage++ } + 13 -> options("Yes","No").also { stage++ } + 14 -> when(buttonId){ + 1 -> playerl(FacialExpression.ASKING,"Okay. I don't think this will be too difficult. Any suggestions on where to start looking for this flower?").also { + player?.setAttribute("/save:sigmund-started",true) + player?.setAttribute("/save:sigmund-steps",1) + stage++ } + 2 -> playerl(FacialExpression.ANNOYED,"You know what? No. This all sounds like a lot of hassle to me, and frankly I just can't be bothered with it right now. I'll go get someone else to vote for me.").also { stage = 20 } + } + 15 -> npcl(FacialExpression.THINKING,"Ah, well outerlander, if I knew where to start looking I would simply do it myself!").also { stage++ } + 16 -> playerl(FacialExpression.ANNOYED,"No help at ALL?").also { stage++ } + 17 -> npcl(FacialExpression.NEUTRAL,"We are a very insular clan, so I would not expect you to have to leave this town to find whatever you need.").also { stage = 1000 } + + //No + 20 -> npcl(FacialExpression.NEUTRAL,"As you wish outlander. If you change your mind, come and see me again; I am very interested in getting my hands on that flower").also { stage = 1000 } + + 25 -> npcl(FacialExpression.ASKING,"So... how goes it outerlander? Did you manage to obtain my flower for me yet? Or do you lack the necessary merchanting skills?").also { stage++ } + 26 -> playerl(FacialExpression.ASKING,"I'm still working on it... Do you have any suggestion where to start looking for it?").also { stage++ } + 27 -> npcl(FacialExpression.THINKING," I suggest you ask around the other Fremennik in the town. A good merchant will find exactly what their customer needs somewhere.").also { stage = 1000 } + + 30 -> npcl(FacialExpression.AMAZED,"Incredible! Your merchanting skills might even match my own! I have no choice but to recommend you to the council of elders!").also { + removeItem(player,3698) + player?.removeAttribute("sigmund-steps") + player?.removeAttribute("sigmund-started") + player?.removeAttribute("sigmundreturning") + player?.setAttribute("/save:fremtrials:votes",player.getAttribute("fremtrials:votes",0) + 1) + player?.setAttribute("/save:fremtrials:sigmund-vote",true) + stage = 1000 + } + + 35 -> playerl(FacialExpression.ASKING,"I'm still working on it... Do you have any suggestion where to start looking for it?").also { stage++ } + 36 -> npcl(FacialExpression.ASKING,"I suggest you ask around the other Fremennik in the town. A good merchant will find exactly what their customer needs somewhere.").also { stage++ } + 37 -> playerl(FacialExpression.ASKING,"I was making some trades, but then I lost the goods...").also { stage++ } + 38 -> npcl(FacialExpression.THINKING,"Hmmm... well try and start again at the beginning. And try to be more careful of your wares in future.").also { + addItem(player, Items.PROMISSORY_NOTE_3709) + stage = 1000 } + + 40 -> npcl(FacialExpression.HAPPY,"Hello again outerlander! I am amazed once more at your apparent skill at merchanting!").also { stage++ } + 41 -> playerl(FacialExpression.HAPPY,"So I can count on your vote at the council of elders?").also { stage++ } + 42 -> npcl(FacialExpression.HAPPY,"Absolutely, outerlander. Your merchanting skills will be a real boon to the Fremennik.").also { stage = 1000 } + + 50 -> npcl(FacialExpression.HAPPY,"Greetings again $gender $fName! What can I do for you this day?").also { stage++ } + 51 -> options("Can I see your wares?","Nothing thanks").also { stage++ } + 52 -> when(buttonId){ + 1 -> playerl(FacialExpression.HAPPY,"Can I see your wares?").also { stage++ } + 2 -> playerl(FacialExpression.HAPPY,"Nothing thanks").also { stage = 55 } + } + 53 -> npcl(FacialExpression.HAPPY,"Certainly, $fName.").also { + npc.openShop(player) + stage = 1000 + } + + 55 -> npcl(FacialExpression.HAPPY,"Well, feel free to stop by anytime you wish $fName. You are always welcome here!").also { stage = 1000 } + + 60 -> npcl(FacialExpression.HAPPY,"Hello outerlander. By the laws of our tribe, I am afraid I may not speak to you without the express permission of the chieftain.").also { stage++ } + 61 -> playerl(FacialExpression.ASKING,"Where would I find him?").also { stage++ } + 62 -> npcl(FacialExpression.HAPPY,"In the longhall, outerlander.").also { stage = 1000 } + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return SigmundDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1282) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SkulgrimenDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SkulgrimenDialogue.kt new file mode 100644 index 000000000..475e67318 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SkulgrimenDialogue.kt @@ -0,0 +1,103 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.addItem +import api.removeItem +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +@Initializable +class SkulgrimenDialogue(player: Player? = null) : DialoguePlugin(player) { + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + if(player?.inventory?.contains(3703,1) == true){ + playerl(FacialExpression.HAPPY,"Hi there. I got your fish, so can I have that bowstring for Sigli now?") + stage = 20 + return true + } + else if(player?.inventory?.contains(3702,1) == true){ + playerl(FacialExpression.ASKING,"So about this bowstring... was it hard to make or something?") + stage = 25 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"Is this trade item for you?") + stage = 26 + return true + } + if(player?.getAttribute("sigmund-steps", 0) == 7){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find an exotic and extremely odd fish, do you?") + stage = 15 + return true + } + else if(player?.getAttribute("sigmund-steps", 0) == 6){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a finely balanced custom bowstring, do you?") + stage = 1 + return true + } + else if(player.questRepository.isComplete("Fremennik Trials")){ + npcl(FacialExpression.HAPPY,"Hello again, ${player.getAttribute("fremennikname","ringo")}. Come to see what's for sale?") + stage = 1001 + return true + } + else{ + playerl(FacialExpression.HAPPY,"Hello!") + stage = 100 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> npcl(FacialExpression.THINKING,"Aye, I have a few in stock. What would an outerlander be wanting with equipment like that?").also { stage++ } + 2 -> playerl(FacialExpression.HAPPY,"It's for Sigli. It needs to be weighted precisely to suit his hunting bow.").also { stage++ } + 3 -> npcl(FacialExpression.HAPPY,"For Sigli eh? Well, I made his bow in the first place, so I'll be able to select the right string for you... just one small problem.").also { stage++ } + 4 -> playerl(FacialExpression.THINKING,"What's that?").also { stage++ } + 5 -> npcl(FacialExpression.THINKING,"This string you'll be wanting... Very special it is. Take a lot of time to recreate. Not sure you have the cash for it.").also { stage++ } + 6 -> playerl(FacialExpression.THINKING,"Then maybe you'll accept something else...?").also { stage++ } + 7 -> npcl(FacialExpression.HAPPY,"Heh. Good thinking outerlander. Well, it's true, there is more to life than just making money. Making weapons is good money, but it's not why I do it. I'll tell you what.").also { stage++ } + 8 -> npcl(FacialExpression.HAPPY,"I heard a rumour that one of the fishermen down by the docks caught some weird looking fish as they were fishing the other day. From what I hear this fish is unique.").also { stage++ } + 9 -> npcl(FacialExpression.HAPPY,"From what I hear this fish is unique. Nobody's ever seen its like before. This intrigues me. I'd like to have it for myself.").also { stage++ } + 10 -> npcl(FacialExpression.HAPPY,"Make a good trophy. You get me that fish, I give you the bowstring. What do you say? We got a deal?").also { stage++ } + 11 -> playerl(FacialExpression.HAPPY,"Sounds good to me.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 15 -> npcl(FacialExpression.EXTREMELY_SHOCKED,"What? There's another one?").also { stage++ } + 16 -> playerl(FacialExpression.ANNOYED,"Er... no, it's the one for you that I'm looking for...").also { stage++ } + 17 -> npcl(FacialExpression.ANNOYED,"Ah. I see. I already told you. Some guy down by the docks was bragging. Best ask there, I reckon.").also { stage = 1000 } + + 20 -> npcl(FacialExpression.HAPPY,"Ohh... That's a nice fish. Very pleased. Here. Take the bowstring. You fulfilled agreement. Only fair I do same. Good work outerlander.").also { + removeItem(player,3703) + addItem(player,3702) + stage++ + } + 21 -> playerl(FacialExpression.HAPPY,"Thanks!").also { stage = 1000 } + + 25 -> npcl(FacialExpression.HAPPY,"Not hard. Just a trick to it. Takes skill to learn, but when learnt, easy. Sigli will be happy. Finest bowstring on continent. Will suit his needs perfectly.").also { stage = 1000 } + + 26 -> npcl(FacialExpression.ANNOYED,"Not for me, I'm afraid.").also { stage = 1000 } + + 100 -> npcl(FacialExpression.HAPPY,"Sorry. I can't sell weapons to outerlanders. Wouldn't be right. Against our beliefs.").also { stage = 1000 } + + 1000 -> end() + 1001 ->{ + end() + npc.openShop(player) + } + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin{ + return SkulgrimenDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1303) + } + +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.kt index 8c8c33f94..82e195038 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.kt @@ -1,13 +1,43 @@ package rs09.game.content.quest.members.thefremenniktrials +import api.addItem +import api.removeItem import core.game.node.entity.player.Player import core.game.node.entity.player.info.PlayerDetails import core.plugin.Initializable import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression @Initializable class SwensenTheNavigator(player: Player? = null) : DialoguePlugin(player){ + val gender = if (player?.isMale == true){"brother"} else "sister" + val fName = player?.getAttribute("fremennikname","doug hug'em") override fun open(vararg args: Any?): Boolean { + if(player?.inventory?.contains(3705,1) == true){ + playerl(FacialExpression.HAPPY,"I would like your map of fishing spots.") + stage = 120 + return true + } + else if(player?.inventory?.contains(3704,1) == true){ + playerl(FacialExpression.ASKING,"If this map of fishing spots is so valuable, why did you give it away to me so easily?") + stage = 125 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"I have a trade item here.") + stage = 130 + return true + } + if(player?.getAttribute("sigmund-steps", 0) == 9){ + npcl(FacialExpression.HAPPY,"Greetings outerlander.") + stage = 115 + return true + } + else if(player?.getAttribute("sigmund-steps", 0) == 8){ + npcl(FacialExpression.HAPPY,"Greetings outerlander.") + stage = 105 + return true + } if(player?.getAttribute("fremtrials:maze-complete",false) == true){ npc("Outerlander! You have finished my maze!","I am genuinely impressed!") stage = 100 @@ -17,9 +47,21 @@ class SwensenTheNavigator(player: Player? = null) : DialoguePlugin(player){ stage = 1000 return true } - player("Hello!") - stage = 0 - return true + else if(player.questRepository.isComplete("Fremennik Trials")){ + playerl(FacialExpression.HAPPY,"Hello!") + stage = 140 + return true + } + else if(player.questRepository.hasStarted("Fremennik Trials")){ + player("Hello!") + stage = 0 + return true + } + else{ + playerl(FacialExpression.HAPPY,"Hello!") + stage = 145 + return true + } } override fun handle(interfaceId: Int, buttonId: Int): Boolean { @@ -56,6 +98,45 @@ class SwensenTheNavigator(player: Player? = null) : DialoguePlugin(player){ stage = 1000 } + //Sigmund subquest + 105 -> playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a map of deep sea fishing spots do you?").also { stage++ } + 106 -> npcl(FacialExpression.HAPPY,"Hmmm? Why of course! As the navigator for the Fremennik I keep all of our maps secure right here.").also { stage++ } + 107 -> playerl(FacialExpression.HAPPY,"Great! Can I have it?").also { stage++ } + 108 -> npcl(FacialExpression.ANNOYED,"Have it? Just like that? I think not outerlander. This map shows all of the prime fishing locations nearby. It is very valuable to our clan. I am afraid I can not just give it away.").also { stage++ } + 109 -> playerl(FacialExpression.THINKING,"Perhaps I can trade you something for it?").also { stage++ } + 110 -> npcl(FacialExpression.ANNOYED,"A trade? For a map of the best fishing spots in a hundred leagues? I will trade it for no less than a weather forecast from our Seer.").also { stage++ } + 111 -> npcl(FacialExpression.THINKING,"As a navigator, the weather is extremely important for plotting the best course. Unfortunately the Seer is always too busy to help me with a forecast.").also { stage++ } + 112 -> playerl(FacialExpression.ASKING,"Where could I get a weather forecast from then?").also { stage++ } + 113 -> npcl(FacialExpression.ANNOYED,"I just told you: from the Seer. You will need to persuade him to take the time to make a forecast somehow.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 115 -> playerl(FacialExpression.THINKING,"I don't suppose you have any idea where I could find a weather forecast from the Fremennik Seer do you?").also { stage++ } + 116 -> npcl(FacialExpression.ANNOYED,"Uh... from the Seer perhaps?").also { stage = 1000 } + + 120 -> npcl(FacialExpression.ANNOYED,"I have already told you outerlander; I will not exchange it for anything other than a divination on the weather from our seer himself!").also { stage++ } + 121 -> playerl(FacialExpression.HAPPY,"What, like this one I have here?").also { stage++ } + 122 -> npcl(FacialExpression.AMAZED,"W-what...? I don't believe it! How did you...?").also { stage++ } + 123 -> npcl(FacialExpression.HAPPY,"I suppose it doesn't matter, you have my gratitude outerlander! With this forecast I will be able to plan a safe course for our next raiding expedition!").also { + removeItem(player,3705) + addItem(player,3704) + stage++ + } + 124 -> npcl(FacialExpression.HAPPY,"Here, outerlander; you may take my map of local fishing patterns with my gratitude!").also { stage = 1000 } + + 125 -> npcl(FacialExpression.HAPPY,"Hmmm? Well, firstly it will be of value to our entire clan, so I have lost nothing from giving it to you.").also { stage++ } + 126 -> npcl(FacialExpression.HAPPY,"The other reason is of course that I have already memorised it, so I can make myself another copy whenever I want!").also { stage = 1000 } + + 130 -> npcl(FacialExpression.ANNOYED,"It isn't for me, I'm afraid.").also { stage = 1000 } + + 140 -> npcl(FacialExpression.HAPPY,"Greetings to you $gender $fName. How fare you today?").also { stage++ } + 141 -> playerl(FacialExpression.HAPPY,"I am fine thanks Swensen. How are you doing?").also { stage++ } + 142 -> npcl(FacialExpression.HAPPY,"I am fine too!").also { stage = 1000 } + + 145 -> npcl(FacialExpression.HAPPY,"Hello outerlander. This is my home, I would be grateful if you would leave.").also { stage++ } + 146 -> playerl(FacialExpression.THINKING,"Oh. Okay.").also { stage++ } + 147 -> npcl(FacialExpression.HAPPY,"I am sorry outerlander, I will not offer you hospitality until my Chieftain has vouched for your honesty. This is our way.").also { stage = 1000 } + 1000 -> end() } return true diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/TFTInteractionListeners.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/TFTInteractionListeners.kt index d2c781728..4b934dee1 100644 --- a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/TFTInteractionListeners.kt +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/TFTInteractionListeners.kt @@ -1,22 +1,32 @@ package rs09.game.content.quest.members.thefremenniktrials +import api.* +import core.game.container.impl.EquipmentContainer.SLOT_WEAPON import core.game.content.dialogue.FacialExpression -import core.game.node.scenery.Scenery +import core.game.content.global.action.ClimbActionHandler +import core.game.content.global.action.DoorActionHandler import core.game.node.entity.impl.Animator import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.entity.skill.Skills import core.game.node.entity.skill.gather.SkillingTool import core.game.node.item.Item +import core.game.node.scenery.Scenery import core.game.system.task.Pulse import core.game.world.map.Location import core.game.world.map.RegionManager import core.game.world.update.flag.context.Animation import core.game.world.update.flag.context.Graphics +import core.net.packet.PacketRepository +import core.net.packet.context.MusicContext +import core.net.packet.out.MusicPacket import org.rs09.consts.Items import org.rs09.consts.NPCs import org.rs09.primextends.getNext import org.rs09.primextends.isLast import rs09.game.interaction.InteractionListener +import rs09.game.system.config.ItemConfigParser import rs09.game.world.GameWorld import rs09.game.world.GameWorld.Pulser @@ -39,6 +49,17 @@ class TFTInteractionListeners : InteractionListener(){ val KNIFE = Items.KNIFE_946 val TREE_BRANCH = Items.BRANCH_3692 val LYRE_IDs = intArrayOf(14591,14590,6127,6126,6125,3691,3690) + val THORVALD_LADDER = 34286 + val THORVALD_LADDER_LOWER = 4188 + val LALLIS_STEW = 4149 + val UNSTRUNG_LYRE = Items.UNSTRUNG_LYRE_3688 + val GOLDEN_FLEECE = Items.GOLDEN_FLEECE_3693 + val GOLDEN_WOOL = Items.GOLDEN_WOOL_3694 + val LONGHALL_BACKDOOR = 4148 + val SHOPNPCS = intArrayOf(NPCs.YRSA_1301,NPCs.SKULGRIMEN_1303,NPCs.THORA_THE_BARKEEP_1300,NPCs.SIGMUND_THE_MERCHANT_1282,NPCs.FISH_MONGER_1315) + val SPINNING_WHEEL_IDS = intArrayOf(2644,4309,8748,20365,21304,25824,26143,34497,36970,37476) + val STEW_INGREDIENT_IDS = intArrayOf(Items.POTATO_1942,Items.ONION_1957,Items.CABBAGE_1965,Items.PET_ROCK_3695) + var FREMENNIK_HELMS = intArrayOf(Items.ARCHER_HELM_3749, Items.BERSERKER_HELM_3751, Items.WARRIOR_HELM_3753, Items.FARSEER_HELM_3755/*, Items.HELM_OF_NEITIZNOT_10828 Should this be included?*/) override fun defineListeners() { @@ -88,12 +109,74 @@ class TFTInteractionListeners : InteractionListener(){ return@onUseWith true } + onUseWith(SCENERY,LALLIS_STEW,*STEW_INGREDIENT_IDS){player,_,stewIngredient -> + when(stewIngredient.id){ + Items.ONION_1957 -> { + sendDialogue(player,"You added an onion to the stew") + player.setAttribute("/save:lalliStewOnionAdded",true) + removeItem(player,Items.ONION_1957) + } + Items.POTATO_1942 -> { + sendDialogue(player,"You added a potato to the stew") + player.setAttribute("/save:lalliStewPotatoAdded",true) + removeItem(player,Items.POTATO_1942) + } + Items.CABBAGE_1965 -> { + sendDialogue(player,"You added a cabbage to the stew") + player.setAttribute("/save:lalliStewCabbageAdded",true) + removeItem(player,Items.CABBAGE_1965) + } + Items.PET_ROCK_3695 -> { + sendDialogue(player,"You added your dear pet rock to the stew") + player.setAttribute("/save:lalliStewRockAdded",true) + removeItem(player,Items.PET_ROCK_3695) + } + } + return@onUseWith true + } + + onUseWith(SCENERY,SPINNING_WHEEL_IDS,GOLDEN_FLEECE){player,_,item -> + animate(player,896) + sendDialogue(player,"You spin the Golden Fleece into a ball of Golden Wool") + removeItem(player,GOLDEN_FLEECE) + addItem(player,Items.GOLDEN_WOOL_3694) + return@onUseWith true + } + + onUseWith(ITEM,UNSTRUNG_LYRE,GOLDEN_WOOL){player,lyre,wool -> + if(player.getSkills().getLevel(Skills.FLETCHING) >= 25){ + animate(player,1248) + removeItem(player,Items.GOLDEN_WOOL_3694) + removeItem(player,Items.UNSTRUNG_LYRE_3688) + addItem(player,Items.LYRE_3689) + sendDialogue(player,"You string the Lyre with the Golden Wool.") + } + else{ + sendDialogue(player,"You need 25 fletching to do this!") + } + return@onUseWith true + } + + on(LONGHALL_BACKDOOR, SCENERY,"open"){player,door -> + if(player.getAttribute("LyreEnchanted",false)){ + sendNPCDialogue(player,1278,"Yeah you're good to go through. Olaf tells me you're some kind of outerlander bard here on tour. I doubt you're worse than Olaf is.") + DoorActionHandler.handleAutowalkDoor(player,door.asScenery()) + } + else if(player.getAttribute("lyreConcertPlayed")){ + DoorActionHandler.handleAutowalkDoor(player,door.asScenery()) + } + return@on true + } + on(LYRE_IDs,ITEM,"play"){player,lyre -> - if(player.questRepository?.getStage("Fremennik Trials")!! < 20){ + if(player.getAttribute("onStage",false) && player.getAttribute("lyreConcertPlayed",false) == false){ + Pulser.submit(LyreConcertPulse(player,lyre.id)) + } + else if(player.questRepository?.getStage("Fremennik Trials")!! < 20 || !player.questRepository?.isComplete("Fremennik Trials")!!){ player.sendMessage("You lack the knowledge to play this.") return@on true } - if(LYRE_IDs.isLast(lyre.id)){ + else if(LYRE_IDs.isLast(lyre.id)){ player.sendMessage("Your lyre is out of charges!") } else { player.inventory?.remove(lyre.asItem()) @@ -140,12 +223,74 @@ class TFTInteractionListeners : InteractionListener(){ return@on true } - on(SWAYING_TREE,SCENERY,"chop down"){ player, _ -> + on(THORVALD_LADDER, SCENERY, "climb-down") { player, _ -> + if (player.questRepository.isComplete("Fremennik Trials") || player.getAttribute("fremtrials:thorvald-vote",false)!!) { + player.sendMessage("You have no reason to go back down there.") + return@on true + } else if (!player.getAttribute("fremtrials:warrior-accepted",false)!!) { + player.dialogueInterpreter?.sendDialogues(NPCs.THORVALD_THE_WARRIOR_1289, FacialExpression.ANGRY, + "Outerlander... do not test my patience. I do not take", + "kindly to people wandering in here and acting as though", + "they own the place." + ) + return@on true + } else if (hasEquippableItems(player)) { + player.dialogueInterpreter?.sendDialogues(NPCs.THORVALD_THE_WARRIOR_1289, FacialExpression.ANGRY, + "You may not enter the battleground with any armour", + "or weaponry of any kind." + ) + player.dialogueInterpreter.addAction { player, buttonId -> + player.dialogueInterpreter?.sendDialogues(NPCs.THORVALD_THE_WARRIOR_1289, FacialExpression.ANGRY, + "If you need to place your equipment into your bank", + "account, I recommend that you speak to the seer. He", + "knows a spell that will do that for you." + ) + } + return@on true + } + + ClimbActionHandler.climb(player, Animation(828), Location.create(2671, 10099, 2)) + Pulser.submit(KoscheiPulse(player)) + return@on true + } + + on(THORVALD_LADDER_LOWER, SCENERY, "climb-up") { player, _ -> + ClimbActionHandler.climb(player, Animation(828), Location.create(2666, 3694, 0)) + return@on true + } + + on(SWAYING_TREE,SCENERY,"cut-branch"){ player, _ -> SkillingTool.getHatchet(player)?.let { Pulser.submit(ChoppingPulse(player)).also { return@on true } } player.sendMessage("You need an axe which you have the woodcutting level to use to do this.") return@on true } + + on(SHOPNPCS,NPC,"Trade") { player, npc -> + if(player.questRepository.isComplete("Fremennik Trials")){ + npc.asNpc().openShop(player) + } + else { + when(npc.id){ + NPCs.THORA_THE_BARKEEP_1300 -> sendMessage(player,"Only Fremenniks may buy drinks here.") + NPCs.SKULGRIMEN_1303 -> sendMessage(player,"Only Fremenniks may purchase weapons and armour here.") + NPCs.SIGMUND_THE_MERCHANT_1282 -> sendMessage(player,"Only Fremenniks may trade with this merchant.") + NPCs.YRSA_1301 -> sendMessage(player,"Only Fremenniks may buy clothes here.") + NPCs.FISH_MONGER_1315 -> sendMessage(player,"Only Fremenniks may purchase fish here.") + } + } + return@on true + } + + for(id in FREMENNIK_HELMS){ + onEquip(id){ player, _ -> + if(!player.questRepository.isComplete("Fremennik Trials")){ + sendMessage(player, "You must have completed The Fremennik Trials to equip this.") + return@onEquip false + } + return@onEquip true + } + } } class destRoom(val swx: Int, val swy: Int, val nex: Int, val ney: Int) @@ -167,6 +312,28 @@ class TFTInteractionListeners : InteractionListener(){ return obj.location } + fun hasEquippableItems(player: Player?): Boolean { + val container = arrayOf(player!!.inventory, player.equipment) + for (c in container) { + for (i in c.toArray()) { + if (i == null) { + continue + } + if (i.name.toLowerCase().contains(" rune")) { + return true + } + var slot: Int = i.definition.getConfiguration(ItemConfigParser.EQUIP_SLOT, -1) + if (slot == -1 && i.definition.getConfiguration(ItemConfigParser.WEAPON_INTERFACE, -1) != -1) { + slot = SLOT_WEAPON + } + if (slot >= 0) { + return true + } + } + } + return false + } + class spiritPulse(val player: Player?, val fish: Int) : Pulse(){ var counter = 0 val npc = NPC(1273,player?.location) @@ -184,7 +351,9 @@ class TFTInteractionListeners : InteractionListener(){ 395 -> player?.inventory?.add(Item(6127)) } 6 -> player?.unlock() - 10 -> npc.clear().also { return true } + 10 -> npc.clear().also { + player?.setAttribute("/save:LyreEnchanted",true) + return true } } return false } @@ -201,6 +370,100 @@ class TFTInteractionListeners : InteractionListener(){ } } + class LyreConcertPulse(val player: Player?, val Lyre: Int) : Pulse(){ + val GENERIC_LYRICS = arrayOf( + "${player?.name?.capitalize()} is my name,", + "I haven't much to say", + "But since I have to sing this song.", + "I'll just go ahead and play." + ) + val CHAMPS_LYRICS = arrayOf( + "The thought of lots of questing,", + "Leaves some people unfulfilled,", + "But I have done my simple best, in", + "Entering the Champions Guild." + ) + val HEROES_LYRICS = arrayOf( + "When it comes to fighting", + "I hit my share of zeroes", + "But I'm well respected at", + "the Guild reserved for Heroes," + ) + val LEGENDS_LYRICS = arrayOf( + "I cannot even start to list", + "The amount of foes I've killed.", + "I will simply tell you this:", + "I've joined the Legends' Guild!" + ) + val SKILLS = mutableListOf(Skills.SKILL_NAME) + var counter = 0 + val questPoints = player?.questRepository?.points + val champGuild = player?.getAchievementDiaryManager()?.hasCompletedTask(DiaryType.VARROCK, 1, 1)?: false + val legGuild = questPoints!! >= 111 + val heroGuild = questPoints!! >= 5 + val masteredAmount = player?.getSkills()?.masteredSkills!! > 0 + var SKILLNAME = getMasteredSkills(player!!) + + val SKILLER_LYRICS = if(masteredAmount){arrayOf( + "When people speak of training,", + "Some people think they're fine.", + "But they just all seem jealous that", + "My ${SKILLNAME.random()}'s ninety-nine!" + )} else arrayOf("Pee pee poo poo pee","I really have to pee","If you sing this song","Let me know that this is what you see") + + val LYRICS = if(masteredAmount){ + println(masteredAmount) + SKILLER_LYRICS + } else if(legGuild){ + LEGENDS_LYRICS + }else if(heroGuild){ + HEROES_LYRICS + }else if(champGuild){ + CHAMPS_LYRICS + }else{GENERIC_LYRICS} + + override fun pulse(): Boolean { + when(counter++){ + 0 -> { + player?.lock() + animate(player!!,1318,true) + } + 2 -> { + animate(player!!,1320,true) + PacketRepository.send(MusicPacket::class.java, MusicContext(player, 165, true)) + } + 4 -> { + animate(player!!,1320,true) + PacketRepository.send(MusicPacket::class.java, MusicContext(player, 164, true)) + sendChat(player,LYRICS[0]) + } + 6 -> { + animate(player!!,1320,true) + PacketRepository.send(MusicPacket::class.java, MusicContext(player, 164, true)) + sendChat(player,LYRICS[1]) + } + 8 -> { + animate(player!!,1320,true) + PacketRepository.send(MusicPacket::class.java, MusicContext(player, 164, true)) + sendChat(player,LYRICS[2]) + } + 10 ->{ + animate(player!!,1320,true) + PacketRepository.send(MusicPacket::class.java, MusicContext(player, 163, true)) + sendChat(player,LYRICS[3]) + } + 12 ->{ + player?.setAttribute("/save:lyreConcertPlayed",true) + player?.removeAttribute("LyreEnchanted") + player?.inventory?.remove(Item(Lyre)) + addItem(player!!,3689) + player?.unlock() + } + } + return false + } + } + class BranchFletchingPulse(val player: Player?) : Pulse(){ var counter = 0 override fun pulse(): Boolean { @@ -223,4 +486,15 @@ class TFTInteractionListeners : InteractionListener(){ return false } } + + class KoscheiPulse(val player: Player) : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when(counter++) { + 0 -> player.sendMessage("Explore this battleground and find your foe...") + 20 -> KoscheiSession.create(player).start().also { return true } + } + return false + } + } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ThoraDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ThoraDialogue.kt new file mode 100644 index 000000000..dd1f68177 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ThoraDialogue.kt @@ -0,0 +1,129 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.map.Location +import core.plugin.Initializable +import org.rs09.consts.Items + +@Initializable +class ThoraDialogue(player: Player? = null) : DialoguePlugin(player){ + val fName = player?.getAttribute("fremennikname","name jeff") + var curNPC: NPC? = NPC(0, Location(0,0,0)) + override fun open(vararg args: Any?): Boolean { + curNPC = args[0] as? NPC + npc = args[0] as NPC + if(player.inventory.contains(3707,1)){ + playerl(FacialExpression.ASKING,"Thanks for making me this cocktail. Why don't you make them anymore normally?") + stage = 35 + } + else if(player.inventory.contains(3709,1)){ + playerl(FacialExpression.HAPPY,"Hi! Can I please have one of your legendary cocktails now?") + stage = 25 + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"I'm trying to remember who I was meant to give this trade item to.") + stage = 30 + } + else if(player?.getAttribute("sigmund-steps", 0) == 13){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a written promise from Askeladden to stay out of the Longhall?") + stage = 20 + } + else if(player?.getAttribute("sigmund-steps", 0) == 12){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find the longhall barkeeps' legendary cocktail, do you?") + stage = 1 + } + else if(player.questRepository.isComplete("Fremennik Trials")){ + npcl(FacialExpression.HAPPY,"Hello again, $fName. I suppose you want a drink? Or are you going to try another scam with that terrible Askeladden again?") + stage = 50 + } + else{ + playerl(FacialExpression.HAPPY,"Hello there.") + stage = 60 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> npcl(FacialExpression.AMAZED,"How did you hear about that? I didn't think anybody knew about that.").also { stage++ } + 2 -> npcl(FacialExpression.HAPPY,"Well, it is true that in my younger years as a barkeep, I wandered the lands trying various alcoholic delicacies.").also { stage++ } + 3 -> npcl(FacialExpression.HAPPY,"Do know how many different types of alcohol there are here in Gielinor? Lots!").also { stage++ } + 4 -> npcl(FacialExpression.HAPPY,"Well, anyway, I used a fusion of various drinks from all around the world to create the greatest cocktail ever made!").also { stage++ } + 5 -> npcl(FacialExpression.HAPPY,"Of course, when my wander lust was gone, and I returned to Rellekka to serve as barkeep here, I gave all that up.").also { stage++ } + 6 -> playerl(FacialExpression.ASKING,"But you still remember how to make it, right?").also { stage++ } + 7 -> npcl(FacialExpression.HAPPY,"Of course.").also { stage++ } + 8 -> playerl(FacialExpression.ASKING,"And you have all the ingredients here? I don't need to go chasing round the world for obscure ingredients to make it?").also { stage++ } + 9 -> npcl(FacialExpression.ASKING,"No, I have them all here. Why?").also { stage++ } + 10 -> playerl(FacialExpression.ASKING,"Can you make me your legendary cocktail then?").also { stage++ } + 11 -> npcl(FacialExpression.SAD,"I would rather not; it is a reminder of a life I left behind when I came back.").also { stage++ } + 12 -> playerl(FacialExpression.ASKING,"Any way I could change your mind?").also { stage++ } + 13 -> npcl(FacialExpression.THINKING,"You need this to become a Fremennik, right? Well, you seem okay for an outerlander, it would be a shame to see you fail. You know Askeladden?").also { stage++ } + 14 -> playerl(FacialExpression.THINKING,"That kid outside? Sure.").also { stage++ } + 15 -> npcl(FacialExpression.ANGRY,"He is nothing but a pest. He keeps sneaking in and stealing beer.").also { stage++ } + 16 -> npcl(FacialExpression.ANGRY,"I shudder to think what he will be like when he has passed his trial of manhood, and is allowed in here legitimately.").also { stage++ } + 17 -> npcl(FacialExpression.ANGRY,"If you can get him to sign a contract promising that he will NEVER EVER EVER darken my doorway here again, you get the drink.").also { stage++ } + 18 -> playerl(FacialExpression.ASKING,"Any idea how I can get him to do that?").also { stage++ } + 19 -> npcl(FacialExpression.HAPPY,"Knowing that little horror, he'll probably be willing to in exchange for some cash. You should go ask him yourself though.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 20 -> npcl(FacialExpression.ANNOYED,"Well, as I say, you should talk to him about that. Knowing the little runt as I do though He'll probably do it for the cash.").also {stage++} + + 25 -> npcl(FacialExpression.AMAZED,"What?!?! I can't believe you... Let me look at that... Askeladden would NEVER... Gosh. It looks legitimate.").also { + player?.inventory?.remove(Item(Items.PROMISSORY_NOTE_3709)) + player?.inventory?.add(Item(Items.LEGENDARY_COCKTAIL_3707)) + player?.setAttribute("/save:sigmundreturning",true) + stage++ + } + 26 -> npcl(FacialExpression.HAPPY,"Here you go, on the house! You have made my life SO much easier! Knowing that little monster won't be bugging me in here all the time anymore!").also { stage++ } + 27 -> npcl(FacialExpression.HAPPY,"That little weasel will have to abide by this written promise that Askeladden can never ever enter the Longhall again! He can't get round this one!").also { stage++ } + 28 -> playerl(FacialExpression.SUSPICIOUS,"Uh... yeah... yeah, you probably won't see someone called Askeladden coming in here...").also { stage = 1000 } + + 30 -> npcl(FacialExpression.NEUTRAL,"If it's not the note from Askeladden it isn't me, I'm afraid.").also { stage = 1000 } + + 35 -> npcl(FacialExpression.SAD,"Ah... when I gave up my travels across the world many years back, to return to my expected role as longhall barkeep,").also { stage++ } + 36 -> npcl(FacialExpression.SAD,"as my mother, and her mother, were before me, I gave up a lot of the freedom I had found in the outside world.").also { stage++ } + 37 -> npcl(FacialExpression.SAD,"I know it is our custom to shun outerlanders and their ways, but I didn't find them as bad as the stories say.").also { stage++ } + 38 -> npcl(FacialExpression.SAD,"Sometimes I feel as though we Fremennik live in a prison that we have constructed for ourselves,").also { stage++ } + 39 -> npcl(FacialExpression.SAD,"and that WE are the outerlanders, out here on the edge of the world...").also { stage++ } + 40 -> npcl(FacialExpression.SAD,"I'm sorry, I think it is part of the job of Longhall barkeep to get philosophical about things ocassionally.").also { stage++ } + 41 -> npcl(FacialExpression.HAPPY,"I wish you all the best of luck with your trials, outerlander.").also { stage++ } + 42 -> npcl(FacialExpression.HAPPY,"When you have finished, perhaps you will come back here, and we can share a drink over tales of the outside world?").also { stage++ } + 43 -> playerl(FacialExpression.HAPPY,"Thanks, I'd like that.").also { stage = 1000 } + + 50 -> playerl(FacialExpression.THINKING,"Scam? Oh... You mean his promise to not come in here anymore?").also { stage++ } + 51 -> npcl(FacialExpression.ANNOYED,"Yes. Yes I do. I should have never trusted him not to come in here, even with that written promise. Anyway, do you want a drink or not?").also { stage++ } + 52 -> options("Yes please","No thanks").also { stage++ } + 53 -> when(buttonId){ + 1 -> playerl(FacialExpression.HAPPY,"Yes please").also { + npc.openShop(player) + stage = 1000 + } + 2 -> playerl(FacialExpression.HAPPY,"No thanks.").also { stage++ } + } + 54 -> npcl(FacialExpression.HAPPY,"Okay then.").also { stage = 1000 } + + 60 -> npcl(FacialExpression.HAPPY,"Hello yourself, outerlander. A little out of the way up here, aren't you?").also { stage++ } + 61 -> npcl(FacialExpression.HAPPY,"I would love to stop and chat with you, but unfortunately we have a custom that no Fremennik may speak with the outerlanders without the permission of our chieftain. Don't take it personally.").also { stage++ } + 62 -> npcl(FacialExpression.HAPPY,"The Chieftain is stood just over there, his name is Brundt. I suggest you go and introduce yourself.").also { stage++ } + 63 -> npcl(FacialExpression.ASKING,"You wouldn't want to go making any enemies because you weren't aware of our customs now, would you?").also { stage++ } + 64 -> playerl(FacialExpression.THINKING,"No, I guess not. Thanks anyway.").also { stage++ } + 65 -> npcl(FacialExpression.HAPPY,"Not a problem, outerlander. It's always nice to see a new face in the long hall; it happens so rarely.").also { stage = 1000 } + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ThoraDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1300) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ThorvaldDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ThorvaldDialogue.kt new file mode 100644 index 000000000..37ca65c1a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/ThorvaldDialogue.kt @@ -0,0 +1,216 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.addItem +import api.removeItem +import core.game.node.entity.impl.Animator +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.game.node.item.Item +import core.game.system.task.Pulse +import rs09.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import org.rs09.consts.Items +import org.rs09.consts.NPCs + +@Initializable +class ThorvaldDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + if(player?.inventory?.contains(3706,1) == true){ + playerl(FacialExpression.HAPPY,"I would like your contract to offer your services as a bodyguard.") + stage = 215 + return true + } + else if(player?.inventory?.contains(3710,1) == true){ + playerl(FacialExpression.ASKING,"You didn't take much persuading to 'lower' yourself to a bodyguard.") + stage = 220 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"Is this item for you?") + stage = 214 + return true + } + else if(player?.getAttribute("sigmund-steps", 0) == 11){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find the token to allow your seat at the champions table?") + stage = 211 + return true + } + else if(player?.getAttribute("sigmund-steps", 0) == 10){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a brave and powerful warrior to act as a bodyguard?") + stage = 200 + return true + } + else if (args.size > 1) { + npcl(FacialExpression.FRIENDLY, "Hahaha! Well fought outerlander! Now come down from there, you have passed my trial with flying colours!") + stage = 150 + return true + } + else if (player?.questRepository?.isComplete("Fremennik Trials")!!) { + playerl(FacialExpression.FRIENDLY, "Howdy Thorvald!") + stage = 0 + return true + } + else if(player!!.getAttribute("fremtrials:thorvald-vote", false)!!){ + playerl(FacialExpression.FRIENDLY, "So can I count on your vote at the council of elders now Thorvald?") + stage = 160 + return true + } + else if(player.questRepository.isComplete("Fremennik Trials")){ + playerl(FacialExpression.HAPPY,"Howdy Thorvald!") + stage = 250 + return true + } + else if(!player.questRepository.hasStarted("Fremennik Trials")){ + npcl(FacialExpression.ANNOYED, "Leave me be, outerlander. I have nothing to say to the likes of you.") + stage = 1000 + return true + } + else if (!player!!.getAttribute("fremtrials:thorvald-vote", false)!!) { + if (player!!.getAttribute("fremtrials:warrior-accepted", false)!!) { + options("What do I have to do again?", "Who is my opponent?", "Can't I do something else?") + stage = 100 + return true + } else { + playerl(FacialExpression.FRIENDLY, "Hello!") + stage = 60 + return true + } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + //After Fremennik Trials + 0 -> npcl(FacialExpression.FRIENDLY, "And greetings to you too. It is good to see new blood entering the Fremennik; we gain our strength by bringing new warriors into the tribe.").also { stage = 1000 } + + //Warrior Trial + 60 -> npcl(FacialExpression.NEUTRAL, "Hello yourself, outerlander. What brings you to dare speak to a mighty Fremennik warrior such as myself?").also { stage++ } + 61 -> playerl(FacialExpression.HALF_ASKING, "Erm... are you a member of the council?").also { stage++ } + 62 -> npcl(FacialExpression.NEUTRAL, "The Fremennik council of elders? Why, of course I am. I am recognised as one the clans mightiest warriors.").also { stage++ } + 63 -> npcl(FacialExpression.HALF_ASKING, "What is it to you outerlander?").also { stage++ } + 64 -> playerl(FacialExpression.NEUTRAL, "Well... I was wondering if you could vote for me to become a Fremennik.").also { stage++ } + 65 -> npcl(FacialExpression.LAUGH, "An outerlander wishes to become a Fremennik!?!? Ha! That is priceless!").also { stage++ } + 66 -> npcl(FacialExpression.NEUTRAL, "Well, let us say that I am not totally against this concept. As a warrior, I appreciate the value of brave and powerful warriors to our clan, and even though you may be an outerlander,").also { stage++ } + 67 -> npcl(FacialExpression.NEUTRAL, "I will not hold this against you if you can prove yourself to be fierce of heart in a combat situation to me.").also { stage++ } + 68 -> playerl(FacialExpression.NEUTRAL, "So how can I prove that? You want to fight me? Come on then, bring it on! Right here, right now, buddy!").also { stage++ } + 69 -> npcl(FacialExpression.LOUDLY_LAUGHING, "Hahahahaha! You certainly show some spirit for an outerlander!").also { stage++ } + 70 -> npcl(FacialExpression.NEUTRAL, "But spirit does not always make a good warrior. It takes both skill and spirit to be so. I have a test that I give all Fremenniks on their path to be a member of the clan.").also { stage++ } + 71 -> npcl(FacialExpression.NEUTRAL, "My test will challenge both your combat prowess and your bravery equally. Should you pass it you will earn my vote at the council, and more importantly my respect for you as a warrior.").also { stage++ } + 72 -> npcl(FacialExpression.HALF_ASKING, "So what say you, outerlander? Are you prepared for the battle?").also { stage++ } + 73 -> options("Yes", "No").also { stage++ } + 74 -> when(buttonId){ + 1 -> playerl(FacialExpression.EVIL_LAUGH, "Am I prepared? I'll show you what combat's all about, you big sissy barbarian type guy!").also { player.setAttribute("/save:fremtrials:warrior-accepted",true); stage = 80 } + 2 -> playerl(FacialExpression.NEUTRAL, "No thanks, I'm pretty sure that I can find someone else to vote for me.").also { stage = 90 } + } + //Yes + 80 -> npcl(FacialExpression.LAUGH, "Hahahahaha! I'm beginning to like you already, outerlander!").also { stage++ } + 81 -> npcl(FacialExpression.NEUTRAL, "Then allow me to present you with my challenge; This ladder here will take you to a place of combat. I have placed a special warrior down there to challenge you.").also { stage++ } + 82 -> npcl(FacialExpression.NEUTRAL, "Battle him to the death, and you will pass my challenge. If at any point you wish to leave combat, simply climb back up the ladder, to leave that place. If you leave you will of course fail the test.").also { stage++ } + 83 -> npcl(FacialExpression.NEUTRAL, "You may retry my test in the future if you fail, but you must stay down there until the death if you wish for my vote at the council. You must defeat him three times to prove that you are worthy.").also { stage++ } + 84 -> npcl(FacialExpression.NEUTRAL, "The fourth time that you fight him will be to the death, so do not show cowardice.").also { stage++ } + 85 -> playerl(FacialExpression.EVIL_LAUGH, "Is that all? It will be easy!").also { stage++ } + 86 -> npcl(FacialExpression.NEUTRAL, "No, there is one more important rule; You may not enter the battleground with any armour or weaponry of any kind.").also { stage++ } + 87 -> npcl(FacialExpression.NEUTRAL, "If you need to place your equipment into your bank account, I recommend that you speak to the seer, who knows a spell that will do that for you.").also { stage = 1000 } + + //No thanks + 90 -> npcl(FacialExpression.NEUTRAL, "Hmm, not so brave after all, outerlander? Perhaps it is for the best. I doubt you have what it takes to pass my challenge.").also { stage = 1000 } + + //Warrior Trial Accepted Not Completed + 100 -> when(buttonId){ + 1 -> playerl(FacialExpression.HALF_ASKING, "So what do I have to do to earn your vote at the council again?").also { stage = 110 } + 2 -> playerl(FacialExpression.HALF_ASKING, "So, who is my opponent?").also { stage = 120 } + 3 -> playerl(FacialExpression.HALF_ASKING, "I don't really like fighting that much... Isn't there something else I can do to earn your vote at the council of elders?").also { stage = 130 } + } + //What do I have to do again? + 110 -> npcl(FacialExpression.NEUTRAL, "I will not offer my vote to anybody whose bravery in combat I do not trust completely. You must go down that ladder and fight your foe to the death.").also { stage = 1000 } + + //Who is my opponent? + 120 -> npcl(FacialExpression.NEUTRAL, "Ah, a wise question before entering combat. His name is Koschei the deathless. He is something of a mystery, even to us.").also { stage++ } + 121 -> npcl(FacialExpression.NEUTRAL, "On one of our regular raiding parties, our longship discovered a man in the frozen waters far north-east of here. We took him aboard our ship, thinking he must be dead.").also { stage++ } + 122 -> npcl(FacialExpression.NEUTRAL, "To our amazement he was perfectly healthy, even though he must have been in those deadly icey waters for many weeks.").also { stage++ } + 123 -> npcl(FacialExpression.NEUTRAL, "He has no memory of who he is, or how he came to be there, except for his own name: Koschei. We named him 'The Deathless' because he is seemingly unkillable!").also { stage++ } + 124 -> npcl(FacialExpression.NEUTRAL, "Any combat technique used against him, he learns instantly! He also apparently can heal himself from any wound at will!").also { stage++ } + 125 -> npcl(FacialExpression.NEUTRAL, "When he attacks, his weapon moves like a whirlwind! He can hide his combat level from his opponents at will as well!").also { stage++ } + 126 -> npcl(FacialExpression.NEUTRAL, "He is truly a horribly fierce opponent to face! I am only glad that he has chosen to stay here with us!").also { stage++ } + 127 -> npcl(FacialExpression.NEUTRAL, "The daylight makes him feel weak, so we have built him his own battleground beneath this building, where he can train his fiercesome skills without being disturbed.").also { stage++ } + 128 -> playerl(FacialExpression.LAUGH, "But he can't REALLY be unkillable...").also { stage++ } + 129 -> playerl(FacialExpression.SUSPICIOUS, "...can he?").also { stage++ } + 130 -> npcl(FacialExpression.NEUTRAL, "Some say he cannot die, for he has hidden his heart outside of his body to be kept forever safe in a duck egg.").also { stage++ } + 131 -> npcl(FacialExpression.NEUTRAL, "Others say he has been cursed by the gods to wander this land forever, never knowing any peace in his life, but only combat.").also { stage++ } + 132 -> npcl(FacialExpression.NEUTRAL, "Some claim that the sword he carries is the source of all his power, and if he should lose it, then exactly one minute later, he will turn back into his true form; A weakened, lame, old man.").also { stage++ } + 133 -> playerl(FacialExpression.HALF_ASKING, "And what do you believe?").also { stage++ } + 134 -> npcl(FacialExpression.NEUTRAL, "I believe you shouldn't look a gift horse in the mouth. He is a fearfully powerful warrior, but more importantly; He is on OUR side, not against us.").also { stage++ } + 135 -> npcl(FacialExpression.NEUTRAL, "He is content testing the battle skills of anyone taking their Fremennik trials of manhood, and I am content knowing that should an enemy ever invade").also { stage++ } + 136 -> npcl(FacialExpression.NEUTRAL, "our town, while our warriors are out on a raiding party, Koschei will be able to hold off ANY invader long enough for us to make our return.").also { stage = 1000} + + //Can't I do something else? + 140 -> npcl(FacialExpression.FRIENDLY, "Yes of course outerlander! If you bring me five raw sardines then I will vote for you instead!").also { stage++ } + 141 -> playerl(FacialExpression.EXTREMELY_SHOCKED, "REALLY?!?!?").also { stage++ } + 142 -> npcl(FacialExpression.LOUDLY_LAUGHING, "HAHAHAHAHAHA! No, of course not! You are stupid, even by outerlander standards!").also { stage++ } + 143 -> npcl(FacialExpression.NEUTRAL, "If you want my vote, you must pass my trial. It is as simple as that.").also { stage = 1000 } + + //Warrior Trial Completed - after the fight + 150 -> playerl(FacialExpression.NEUTRAL, "But... I don't understand... I did not manage to beat Koschei...").also { stage++ } + 151 -> npcl(FacialExpression.NEUTRAL, "I did not say you had to, outerlander! All I asked was that you fought to the death! And you did! The death was your own!").also { stage++ } + 152 -> npcl(FacialExpression.NEUTRAL, "I was not interested in how strong you are! I was interested in how BRAVE you are!").also { stage++ } + 153 -> npcl(FacialExpression.NEUTRAL, "You fought a superior enemy to your very last breath - THAT is bravery.").also { stage++ } + 154 -> npcl(FacialExpression.NEUTRAL, "I would be honoured to represent you to the council as worthy of being a Fremennik after watching that superb battle!").also { stage = 1000 } + + //Warrior Trial Completed + 160 -> npcl(FacialExpression.NEUTRAL, "Absolutely! I watched the entire battle, and was extremely impressed with your bravery in combat!").also { stage = 1000 } + + //Sigmund stuff + 200 -> npcl(FacialExpression.ANNOYED,"Know you not who I am outerlander? There are none more brave or powerful than me amongst all the Fremennik!").also { stage++ } + 201 -> npcl(FacialExpression.ANGRY,"The role of bodyguard is below me, as a noble warrior. You might as well ask me to babysit the children!").also { stage++ } + 202 -> playerl(FacialExpression.THINKING,"Is there no way you would do this for me?").also { stage++ } + 203 -> npcl(FacialExpression.ANNOYED,"There is but one way outerlander. Since I was steeled in battle, I have dreamt of earning my place at the Champions Table in the Long Hall.").also { stage++ } + 204 -> npcl(FacialExpression.ANNOYED,"It is a tradition amongst us that the bravest and strongest are honoured with a table of champions to drink and feast all that they can in our Long Hall.").also { stage++ } + 205 -> npcl(FacialExpression.ANNOYED,"Unfortunately, there are only a fixed number of places available at the table, and these places were all filled many moons ago by others.").also { stage++ } + 206 -> npcl(FacialExpression.ANNOYED,"Although my worthiness is undeniable, the only way I may take my place is if one of those already there die, or give up their place to me voluntarily.").also { stage++ } + 207 -> playerl(FacialExpression.THINKING,"So you want me to go kill one of them off for you? Make it look like an accident?").also { stage++ } + 208 -> npcl(FacialExpression.EXTREMELY_SHOCKED,"WHAT? No, no, not at all! I am shocked you would suggest such a thing!").also { stage++ } + 209 -> npcl(FacialExpression.THINKING,"If you can persuade one of the Revellers to give up their Champions' Token to you so that I might take their place, you may have my contract as a bodyguard.").also { stage++ } + 210 -> playerl(FacialExpression.HAPPY,"Okay, I'll see what I can do.").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 211 -> npcl(FacialExpression.HAPPY,"You will need to persuade one of the revellers in the Long Hall to give up their token, and their place, in deference to my own worthiness somehow.").also { stage = 1000 } + + 214 -> npcl(FacialExpression.ANNOYED,"I'm afraid not, outerlander.").also { stage = 1000 } + + 215 -> npcl(FacialExpression.ANGRY,"Oh you would, would you outerlander? I have already told you, I will not demean myself with such a baby sitting job until I can sit in the Longhall with pride.").also { stage++ } + 216 -> playerl(FacialExpression.HAPPY,"It's a good thing I have the Champions' Token right here then, isn't it?").also { stage++ } + 217 -> npcl(FacialExpression.HAPPY,"Ah... well this is a different matter. With that token I can claim my rightful place as a champion in the Long hall!").also { stage++ } + 218 -> npcl(FacialExpression.HAPPY,"Here outerlander, I can suffer the indignity of playing babysitter if it means that I can then revel with my warrior equals in the Long Hall afterwards!").also { + removeItem(player,3706) + addItem(player,3710) + stage++ + } + 219 -> npcl(FacialExpression.HAPPY,"Here outerlander, take this contract; I will fulfill it to my utmost.").also { stage = 1000 } + + 220 -> npcl(FacialExpression.HAPPY,"You misunderstand, outerlander. Normally I will only battle for a noble cause, but have never been recognised as a true champion here.").also { stage++ } + 221 -> npcl(FacialExpression.HAPPY,"With this Champion's token, I can stand alongside my warrior brethren in the Long Hall, and revel in the glories of past victories together!").also { stage = 1000 } + + 250 -> npcl(FacialExpression.HAPPY,"And greetings to you too. It is good to see new blood entering the Fremennik; we gain our strength by bringing new warriors into the tribe.").also { stage = 1000 } + + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ThorvaldDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(NPCs.THORVALD_THE_WARRIOR_1289) + } + +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/YrsaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/YrsaDialogue.kt new file mode 100644 index 000000000..8564bae56 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/thefremenniktrials/YrsaDialogue.kt @@ -0,0 +1,105 @@ +package rs09.game.content.quest.members.thefremenniktrials + +import api.addItem +import api.removeItem +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +@Initializable +class YrsaDialogue(player: Player? = null) : DialoguePlugin(player) { + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + if(player?.inventory?.contains(3708,1) == true){ + playerl(FacialExpression.HAPPY,"Hello. Can I have those boots now? Here is a written statement from Brundt outlining future tax burdens upon Fremennik merchants and shopkeepers for the year.") + stage = 15 + return true + } + else if(player?.inventory?.contains(3700,1) == true){ + playerl(FacialExpression.ASKING,"Hey, these shoes look pretty comfy. Think you could make me a pair like them?") + stage = 20 + return true + } + else if(player?.getAttribute("sigmundreturning",false) == true){ + playerl(FacialExpression.ASKING,"I have this trade item but I can't remember who it's for") + stage = 25 + return true + } + if(player?.getAttribute("sigmund-steps",0) == 4){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find a guarantee of a reduction on sales taxes, do you?") + stage = 10 + return true + } + else if(player?.getAttribute("sigmund-steps",0) == 3){ + playerl(FacialExpression.ASKING,"I don't suppose you have any idea where I could find some custom sturdy boots, do you?") + stage = 1 + return true + } + else if(player.questRepository.isComplete("Fremennik Trials")){ + npcl(FacialExpression.HAPPY,"Welcome to my clothes shop. I can change your shoes, or I've got a fine selection of clothes for sale.") + stage = 30 + //Uncomment this out when we got the shoe shop up and running + //npcl(FacialExpression.HAPPY,"Welcome to my clothes shop. I can change your shows, or I've got a fine selection of clothes for sale") + return true + } + else { + playerl(FacialExpression.HAPPY,"Hello!") + stage = 35 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 1 -> npcl(FacialExpression.THINKING,"Well, I don't usually have many shoes in stock here in my little clothes shop... I will be able to make you up a pair if you are really desperate though?").also { stage++ } + 2 -> playerl(FacialExpression.NEUTRAL,"They're not for me... I need them for Olaf.").also { stage++ } + 3 -> npcl(FacialExpression.ANGRY,"Oh, that foolish bard... Why didn't he just ask me to make him some? It is his stupid pride, I believe! I will tell you what I will do outlander.").also { stage++ } + 4 -> npcl(FacialExpression.ASKING,"I know that you must have the ear of the chieftain for him to consider you as worthy of becoming a Fremennik by trial.").also { stage++ } + 5 -> npcl(FacialExpression.HAPPY,"I will make you a pair of sturdy boots for Olaf if you will persuade him to reduce the sales tax placed upon all Fremennik shopkeepers. It does nothing but hurt my business now.").also { stage++ } + 6 -> playerl(FacialExpression.NEUTRAL,"Okay, I will see what I can do").also { + player?.incrementAttribute("sigmund-steps",1) + stage = 1000 + } + 10 -> npcl(FacialExpression.NEUTRAL,"Yes I do outerlander. Only the Chieftain may permit such a thing. Talk to him.").also { stage = 1000 } + + 15 -> npcl(FacialExpression.HAPPY,"Certainly! Let me have a look at what he has written here, just give me a moment...").also { + removeItem(player,3708) + addItem(player,3700) + stage++ + } + 16 -> npcl(FacialExpression.HAPPY,"Yes, that all appears in order. Tell Olaf to come to me next time for shoes!").also { stage = 1000 } + + 20 -> npcl(FacialExpression.HAPPY,"Maybe if you pass your trial and become a full fledged member of the Fremennik...").also { stage = 1000 } + + 25 -> npcl(FacialExpression.ANNOYED,"Not me, I'm afraid.").also { stage = 1000 } + + 30 -> options("I'd like to buy some clothes","Nothing, thanks.").also { stage++ } + 31 -> when(buttonId){ + 1 -> playerl(FacialExpression.HAPPY,"I'd like to buy some clothes").also { + npc.openShop(player) + stage = 1000 + } + 2 -> playerl(FacialExpression.HAPPY,"Nothing, thanks.").also { stage++ } + } + 32 -> npcl(FacialExpression.HAPPY,"As you wish.").also { stage = 1000 } + + 35 -> npcl(FacialExpression.HAPPY,"I'm sorry outerlander, I cannot sell you any clothes. Our customs forbid it.").also { stage = 1000 } + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return YrsaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1301) + } + + +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/DrinkBlamishOilListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/DrinkBlamishOilListener.kt new file mode 100644 index 000000000..443b20f93 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/item/DrinkBlamishOilListener.kt @@ -0,0 +1,15 @@ +package rs09.game.interaction.item + +import api.* +import org.rs09.consts.Items +import rs09.game.interaction.InteractionListener + +class DrinkBlamishOilListener : InteractionListener() { + + override fun defineListeners() { + on(Items.BLAMISH_OIL_1582, ITEM, "drink"){player, _ -> + sendPlayerDialogue(player, "You know... I'd really rather not.") + return@on true + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/withitem/OilFishingRodListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/withitem/OilFishingRodListener.kt new file mode 100644 index 000000000..0fb70022e --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/item/withitem/OilFishingRodListener.kt @@ -0,0 +1,49 @@ +package rs09.game.interaction.item.withitem + +import api.* +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import org.rs09.consts.Items +import rs09.game.interaction.InteractionListener + +class OilFishingRodListener : InteractionListener() { + override fun defineListeners() { + onUseWith(ITEM, Items.BLAMISH_OIL_1582, Items.FISHING_ROD_307) {player, used, with -> + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 1 -> { + removeItem(player, used.asItem()) && removeItem(player, with.asItem()) + addItem(player, Items.VIAL_229) + addItem(player, Items.OILY_FISHING_ROD_1585) + sendMessage(player, "You rub the oil into the fishing rod.") + } + } + return false + } + }) + return@onUseWith true + } + + onUseWith(ITEM, Items.THIN_SNAIL_3363, Items.PESTLE_AND_MORTAR_233) {player, used, with -> + if (player.inventory.contains(Items.SAMPLE_BOTTLE_3377, 1)) { + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 0 -> player.animator.animate(Animation(364)) + 3 -> { + removeItem(player, Items.THIN_SNAIL_3363) + removeItem(player, Items.SAMPLE_BOTTLE_3377) + addItem(player, Items.BLAMISH_SNAIL_SLIME_1581) + } + } + return false + } + }) + } + return@onUseWith true + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/withitem/PoisonedWeaponListeners.kt b/Server/src/main/kotlin/rs09/game/interaction/item/withitem/PoisonedWeaponListeners.kt new file mode 100644 index 000000000..d7209e2b3 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/item/withitem/PoisonedWeaponListeners.kt @@ -0,0 +1,100 @@ +package rs09.game.interaction.item.withitem + +import api.* +import core.game.node.item.Item +import org.rs09.consts.Items +import rs09.game.interaction.InteractionListener +import kotlin.collections.toIntArray +import kotlin.math.min + +class PoisonedWeaponListeners : InteractionListener() { + override fun defineListeners() { + val poisons = intArrayOf(Items.WEAPON_POISON_187, Items.WEAPON_POISON_PLUS_5937, Items.WEAPON_POISON_PLUS_PLUS_5940) + val poisonableItems = PoisonSets.itemMap.keys.toIntArray() + val poisonedItems = PoisonSets.itemMap.values.toIntArray() + + onUseWith(ITEM, poisons, *poisonableItems){player, used, with -> + val index = poisons.indexOf(used.id) + val product = PoisonSets.itemMap[with.id]!![index] + val amt = min(5, with.asItem().amount) + + if(removeItem(player, Item(with.id, amt))) { + removeItem(player, used.id) //Mico's Code. See: https://gitlab.com/skelsoft/redwings/-/issues/13 + addItemOrDrop(player, product, amt) + addItemOrDrop(player, Items.VIAL_229) + sendMessage(player, "You poison the ${with.name.toLowerCase()}.") + } + return@onUseWith true + } + + onUseWith(ITEM, Items.CLEANING_CLOTH_3188, *poisonedItems) {player, _, with -> + val base = PoisonSets.getBase(with.id) ?: return@onUseWith false + val amt = min(5, with.asItem().amount) + removeItem(player, Item(with.id, amt)) + addItemOrDrop(player, base, amt) + return@onUseWith true + } + } + + //below enum copied from old file, some data is probably wrong. + internal enum class PoisonSets(val base: Int, val p: Int, val pp: Int, val ppp: Int){ + BRONZE_ARROW(882, 883, 5616, 5622), + IRON_ARROW(884, 885, 5617, 5623), + STEEL_ARROW(886, 887, 5618, 5624), + MITHRIL_ARROW(888, 889, 5619, 5625), + ADAMANT_ARROW(890, 891, 5620, 5626), + RUNE_ARROW(892, 893, 5621, 5627), + + IRON_KNIFE(863, 871, 5655, 5662), + BRONZE_KNIFE(864, 870, 5654, 5661), + STEEL_KNIFE(865, 872, 5656, 5663), + MITHRIL_KNIFE(866, 873, 5657, 5664), + ADAMANT_KNIFE(867, 875, 5659, 5666), + RUNE_KNIFE(868, 876, 5660, 5667), + BLACK_KNIFE(869, 874, 5658, 5665), + + BRONZE_DART(806, 812, 5628, 5635), + IRON_DART(807, 813, 5629, 5636), + STEEL_DART(808, 814, 5630, 5637), + BLACK_DART(3093, 3094, 5631, 5638), + MITHRIL_DART(809, 815, 5632, 5639), + ADAMANT_DART(810, 816, 5633, 5640), + + RUNE_DART(811, 817, 5634, 5641), + IRON_JAVELIN(825, 831, 5641, 5648), + BRONZE_JAVELIN(826, 832, 5642, 5649), + STEEL_JAVELIN(827, 833, 5643, 5650), + MITHRIL_JAVELIN(828, 834, 5644, 5651), + ADAMANT_JAVELIN(829, 835, 5645, 5652), + RUNE_JAVELIN(830, 836, 5646, 5653), + + IRON_DAGGER(1203, 1219, 5668, 5686), + BRONZE_DAGGER(1205, 1221, 5670, 5688), + STEEL_DAGGER(1207, 1223, 5672, 5690), + MITHRIL_DAGGER(1209, 1225, 5674, 5692), + ADAMANT_DAGGER(1211, 1227, 5676, 5694), + RUNE_DAGGER(1213, 1229, 5678, 5696), + DRAGON_DAGGER(1215, 1231, 5680, 5698), + BLACK_DAGGER(1217, 1233, 5682, 5700), + + BRONZE_SPEAR(1237, 1251, 5704, 5618), + IRON_SPEAR(1239, 1253, 5706, 5620), + STEEL_SPEAR(1241, 1255, 5708, 5622), + MITHRIL_SPEAR(1243, 1257, 5710, 5624), + ADAMANT_SPEAR(1245, 1259, 5712, 5626), + RUNE_SPEAR(1247, 1261, 5714, 5628), + DRAGON_SPEAR(1249, 1263, 5716, 5730), + BLACK_SPEAR(4580, 4582, 5734, 5636); + + companion object { + val itemMap = values().map { it.base to intArrayOf(it.p,it.pp,it.ppp) }.toMap() + + fun getBase(poisoned: Int) : Int? { + for ((base,set) in itemMap.entries) { + if (set.contains(poisoned)) return base + } + return null + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/withnpc/ArchaeologicalExpertListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/withnpc/ArchaeologicalExpertListener.kt new file mode 100644 index 000000000..dfa9cd1d2 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/item/withnpc/ArchaeologicalExpertListener.kt @@ -0,0 +1,50 @@ +package rs09.game.interaction.item.withnpc + +import api.openDialogue +import core.game.node.entity.npc.NPC +import org.rs09.consts.Items +import org.rs09.consts.NPCs +import rs09.game.content.dialogue.region.examcentre.ArchaeologistcalExpertUsedOnDialogueFile +import rs09.game.interaction.InteractionListener + +open class ArchaeologicalExpertListener() : InteractionListener() { + val staff = Items.ANCIENT_STAFF_4675 + val unidentifiedLiquid = Items.UNIDENTIFIED_LIQUID_702 + val nitroglycerin = Items.NITROGLYCERIN_703 + val ammoniumNitrate = Items.AMMONIUM_NITRATE_701 + val nuggets = Items.NUGGETS_680 + val needle = Items.NEEDLE_1733 + val rottenApple = Items.ROTTEN_APPLE_1984 + val brokenGlass = Items.BROKEN_GLASS_1469 + val brokenArrow = Items.BROKEN_ARROW_687 + val panningTray = Items.PANNING_TRAY_677 + val bones = Items.BONES_526 + val buttons = Items.BUTTONS_688 + val crackedSample = Items.CRACKED_SAMPLE_674 + val oldTooth = Items.OLD_TOOTH_695 + val rustySword = Items.RUSTY_SWORD_686 + val brokenStaff = Items.BROKEN_STAFF_689 + val brokenArmour = Items.BROKEN_ARMOUR_698 + val damagedArmour = Items.DAMAGED_ARMOUR_697 + val ceramicRemains = Items.CERAMIC_REMAINS_694 + val beltBuckle = Items.BELT_BUCKLE_684 + val animalSkull = Items.ANIMAL_SKULL_671 + val specialCup = Items.SPECIAL_CUP_672 + val teddy = Items.TEDDY_673 + val stoneTablet = Items.STONE_TABLET_699 + + val items = intArrayOf(staff, unidentifiedLiquid, nitroglycerin, ammoniumNitrate, nuggets, needle, rottenApple, + brokenGlass, brokenArrow, panningTray, bones, buttons, crackedSample, oldTooth, rustySword, brokenStaff, brokenArmour, + damagedArmour, ceramicRemains, beltBuckle, animalSkull, specialCup, teddy, stoneTablet) + + val archy = NPCs.ARCHAEOLOGICAL_EXPERT_619 + + val lol = arrayOf(Items) + + override fun defineListeners() { + onUseWith(NPC, items, archy) { + player, used, with -> openDialogue(player, ArchaeologistcalExpertUsedOnDialogueFile(used.id)) + return@onUseWith false + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/withnpc/ZooknockListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/withnpc/ZooknockListener.kt new file mode 100644 index 000000000..c3318123a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/item/withnpc/ZooknockListener.kt @@ -0,0 +1,29 @@ +package rs09.game.interaction.item.withnpc + +import api.openDialogue +import core.game.node.entity.npc.NPC +import org.rs09.consts.Items +import org.rs09.consts.NPCs +import rs09.game.content.dialogue.region.examcentre.ArchaeologistcalExpertUsedOnDialogueFile +import rs09.game.content.dialogue.region.examcentre.ZooknockDialogueFile +import rs09.game.interaction.InteractionListener + +open class ZooknockListener() : InteractionListener() { + val goldBar = Items.GOLD_BAR_2357 + val monkeyAmuletMould = Items.MAMULET_MOULD_4020 + val monkeyDentures = Items.MONKEY_DENTURES_4006 + + + val items = intArrayOf(goldBar, monkeyDentures, monkeyAmuletMould) + + val zooknock = NPCs.ZOOKNOCK_1425 + + val lol = arrayOf(Items) + + override fun defineListeners() { + onUseWith(NPC, items, zooknock) { + player, used, with -> openDialogue(player, ZooknockDialogueFile(used.id)) + return@onUseWith false + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/npc/NPCTalkListener.kt b/Server/src/main/kotlin/rs09/game/interaction/npc/NPCTalkListener.kt index 0537b31b7..fd97dae38 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/npc/NPCTalkListener.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/npc/NPCTalkListener.kt @@ -28,7 +28,7 @@ class NPCTalkListener : InteractionListener() { return@on true } - on(NPC,"talk-to","talk"){player,node -> + on(NPC,"talk-to","talk","talk to"){player,node -> val npc = node.asNpc() if(RandomEvents.randomIDs.contains(node.id)){ if(player.antiMacroHandler.event == null || player.antiMacroHandler.event!!.id != node.id){ diff --git a/Server/src/main/kotlin/rs09/game/interaction/object/dialogues/CrateDialogues.kt b/Server/src/main/kotlin/rs09/game/interaction/object/dialogues/CrateDialogues.kt new file mode 100644 index 000000000..adf904d82 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/object/dialogues/CrateDialogues.kt @@ -0,0 +1,163 @@ +package rs09.game.interaction.`object`.dialogues + +import api.* +import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.player.link.TeleportManager +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.tools.RandomFunction +import org.rs09.consts.Items +import rs09.game.content.dialogue.DialogueFile +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit + +/** + * @author qmqz + */ + +class CrateDialogues(val it: Int) : DialogueFile() { + + private val MMDungeon2 = Location.create(2804, 9168, 0) + + override fun handle(interfaceId: Int, buttonId: Int) { + when (it) { + 0 -> when (stage) { + 0 -> sendItemDialogue(player!!, Items.MAMULET_MOULD_4020, "The crate is full of ... monkey amulet moulds!").also { stage++ } + 1 -> player!!.dialogueInterpreter.sendOptions("Do you wish to take one?", "Yes", "No").also { stage++ } + 2 -> when (buttonId) { + 1 -> { + addItemOrDrop(player!!, Items.MAMULET_MOULD_4020) + end() + } + 2 -> end() + } + } + + 1 -> when (stage) { + 0 -> sendItemDialogue(player!!, Items.THREAD_1734, "The crate is full of ... crafting thread.").also { stage++ } + 1 -> player!!.dialogueInterpreter.sendOptions("Do you wish to take one?", "Yes", "No").also { stage++ } + 2 -> when (buttonId) { + 1 -> { + addItemOrDrop(player!!, Items.THREAD_1734) + end() + } + 2 -> end() + } + } + + 2 -> when (stage) { + 0 -> sendItemDialogue(player!!, Items.MONKEY_DENTURES_4006, "The crate is full of ... magical monkey talking dentures!").also { stage++ } + 1 -> player!!.dialogueInterpreter.sendOptions("Do you wish to take one?", "Yes", "No").also { stage++ } + 2 -> when (buttonId) { + 1 -> { + addItemOrDrop(player!!, Items.MONKEY_DENTURES_4006) + end() + } + 2 -> end() + } + } + + 3 -> when (stage) { + 0 -> sendItemDialogue(player!!, Items.BANANA_1963, "The crate is full of ... bananas.").also { stage++ } + 1 -> player!!.dialogueInterpreter.sendOptions("Do you wish to take one?", "Yes", "No").also { stage++ } + 2 -> when (buttonId) { + 1 -> { + addItemOrDrop(player!!, Items.BANANA_1963) + end() + } + 2 -> end() + } + } + + 4 -> when (stage) { + 0 -> sendDialogue( + player!!, + "You find a hole in the floor under the crate! All you can see is the faint glimmer of light from extremely far below." + ).also { stage++ } + 1 -> player!!.dialogueInterpreter.sendOptions( + "Would you like to go down?", + "Yes, I'm sure.", + "No, not yet." + ).also { stage++ } + 2 -> when (buttonId) { + 1 -> sendDialogue(player!!, "You begin to lower yourself into the hole...").also { stage = 10 } + 2 -> end() + } + 10 -> { + end() + openInterface(player!!, 120) + player!!.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 3 -> teleport(player!!, MMDungeon2, TeleportManager.TeleportType.INSTANT) + } + return false + } + }) + monkeyMadnessGoIntoBasementDamage() + } + } + + 5 -> when (stage) { + 0 -> sendItemDialogue(player!!, Items.TINDERBOX_590, "The crate is full of ... tinderboxes.").also { stage++ } + 1 -> player!!.dialogueInterpreter.sendOptions("Do you wish to take one?", "Yes", "No").also { stage++ } + 2 -> when (buttonId) { + 1 -> { + addItemOrDrop(player!!, Items.TINDERBOX_590) + end() + } + 2 -> end() + } + } + + 6 -> when (stage) { + 0 -> sendItemDialogue(player!!, Items.EYE_OF_GNOME_4008, "The crate is full of ... slimy gnome eyes!").also { stage++ } + 1 -> player!!.dialogueInterpreter.sendOptions("Do you wish to take one?", "Yes", "No").also { stage++ } + 2 -> when (buttonId) { + 1 -> { + addItemOrDrop(player!!, Items.EYE_OF_GNOME_4008) + end() + } + 2 -> end() + } + } + + 7 -> when (stage) { + 0 -> sendItemDialogue(player!!, Items.HAMMER_2347, "The crate is full of ... hammers.").also { stage++ } + 1 -> player!!.dialogueInterpreter.sendOptions("Do you wish to take one?", "Yes", "No").also { stage++ } + 2 -> when (buttonId) { + 1 -> { + addItemOrDrop(player!!, Items.HAMMER_2347) + end() + } + 2 -> end() + } + } + + + + } + } + + private fun monkeyMadnessGoIntoBasementDamage() { + Executors.newSingleThreadScheduledExecutor().schedule({ + if (player!!.location.isInRegion(MMDungeon2.regionId)) { + player!!.interfaceManager.close() + openInterface(player!!, 170) + + player!!.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 3 -> player!!.impactHandler.manualHit(player, RandomFunction.random(0, player!!.skills.lifepoints / 2), ImpactHandler.HitsplatType.NORMAL) + } + return false + } + }) + } else { + monkeyMadnessGoIntoBasementDamage() + } + }, 1, TimeUnit.SECONDS) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/object/objects/CrateHandler.kt b/Server/src/main/kotlin/rs09/game/interaction/object/objects/CrateHandler.kt new file mode 100644 index 000000000..8aa99d13e --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/object/objects/CrateHandler.kt @@ -0,0 +1,125 @@ +package rs09.game.interaction.`object`.objects + +import api.openDialogue +import api.sendMessage +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import rs09.game.interaction.InteractionListener +import rs09.game.interaction.`object`.dialogues.CrateDialogues + +/** + * @author qmqz + */ + +class CrateHandler : InteractionListener() { + + private val monkeyAmuletMouldCrate = 4724 + private val threadCrate = 4718 + private val monkeyTalkingDentures = 4715 + private val bananaCrate = 4723 + private val monkeyMadnessEntranceDown = 4714 + private val tinderboxCrate = 4719 + private val slimyGnomeEyesCrate = 4716 + private val hammersCrate = 4726 + + override fun defineListeners() { + //searching crates with monkey amulet moulds + on(monkeyAmuletMouldCrate, SCENERY, "search") { player, node -> + player.animator.animate(Animation(536)) + sendMessage(player, "You search the crate.") + openDialogue(player!!, CrateDialogues(0)) + return@on true + } + + on(threadCrate, SCENERY, "search") { player, node -> + sendMessage(player, "You search the crate.") + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 3 -> openDialogue(player!!, CrateDialogues(1)) + } + return false + } + }) + return@on true + } + + on(monkeyTalkingDentures, SCENERY, "search") { player, node -> + sendMessage(player, "You search the crate.") + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 3 -> openDialogue(player!!, CrateDialogues(2)) + } + return false + } + }) + return@on true + } + + on(bananaCrate, SCENERY, "search") { player, node -> + sendMessage(player, "You search the crate.") + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 3 -> openDialogue(player!!, CrateDialogues(3)) + } + return false + } + }) + return@on true + } + + on(monkeyMadnessEntranceDown, SCENERY, "search") { player, node -> + sendMessage(player, "You search the crate.") + openDialogue(player!!, CrateDialogues(4)) + return@on true + } + + on(tinderboxCrate, SCENERY, "search") { player, node -> + sendMessage(player, "You search the crate.") + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 3 -> openDialogue(player!!, CrateDialogues(5)) + } + return false + } + }) + return@on true + } + + on(slimyGnomeEyesCrate, SCENERY, "search") { player, node -> + sendMessage(player, "You search the crate.") + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 3 -> openDialogue(player!!, CrateDialogues(6)) + } + return false + } + }) + return@on true + } + + on(hammersCrate, SCENERY, "search") { player, node -> + sendMessage(player, "You search the crate.") + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 3 -> openDialogue(player!!, CrateDialogues(7)) + } + return false + } + }) + return@on true + } + + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/questhall/MountedGlory.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/questhall/MountedGlory.kt new file mode 100644 index 000000000..4e19fb457 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/construction/decoration/questhall/MountedGlory.kt @@ -0,0 +1,63 @@ +package rs09.game.node.entity.skill.construction.decoration.questhall + +import api.teleport +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import rs09.game.interaction.InteractionListener +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit + +class MountedGlory : InteractionListener() { + + val MOUNTED_GLORY = 13523 + + val TELEPORTS = arrayOf( + Location.create(3087, 3495, 0), + Location.create(2919, 3175, 0), + Location.create(3104, 3249, 0), + Location.create(3304, 3124, 0) + ) + + override fun defineListeners() { + on(MOUNTED_GLORY, SCENERY,"Edgeville") { player, _ -> + mountedGloryTeleport(player,0) + return@on true + } + + on(MOUNTED_GLORY, SCENERY,"Karamja") { player, _ -> + mountedGloryTeleport(player,1) + return@on true + } + + on(MOUNTED_GLORY, SCENERY,"Draynor Village") { player, _ -> + mountedGloryTeleport(player,2) + return@on true + } + + on(MOUNTED_GLORY, SCENERY,"Al Kharid") { player, _ -> + mountedGloryTeleport(player,3) + return@on true + } + } + private fun mountedGloryTeleport(player : Player, int : Int) { + Executors.newSingleThreadScheduledExecutor().schedule({ + player.pulseManager.run(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 1 -> { + player.lock(5) + player.visualize(Animation(714), Graphics(308, 100, 50)) + player.audioManager.send(200) + } + 4 -> player.animator.reset().also { teleport(player, TELEPORTS[int]) } + } + return false + } + }) + }, 0, TimeUnit.SECONDS) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CompostBin.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CompostBin.kt index 22de2f6b1..bb6445952 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CompostBin.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CompostBin.kt @@ -2,6 +2,7 @@ package rs09.game.node.entity.skill.farming import api.* import core.game.node.entity.player.Player +import core.game.node.entity.player.link.audio.Audio import core.game.node.entity.skill.Skills import core.game.node.item.Item import core.tools.RandomFunction @@ -25,12 +26,14 @@ class CompostBin(val player: Player, val bin: CompostBins) { fun close() { isClosed = true + player.audioManager.send(2428) finishedTime = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(RandomFunction.random(35,50).toLong()) updateBit() } fun open(){ isClosed = false + player.audioManager.send(2429) updateBit() } @@ -45,6 +48,7 @@ class CompostBin(val player: Player, val bin: CompostBins) { isSuperCompost = true isClosed = false } + player.audioManager.send(Audio (2443, 1, 1)) updateBit() if(isSuperCompost) rewardXP(player, Skills.FARMING, 8.5) else rewardXP(player, Skills.FARMING, 4.5) @@ -108,6 +112,8 @@ class CompostBin(val player: Player, val bin: CompostBins) { remaining } else item.amount for(i in 0 until amount) { + + player.audioManager.send(2441) addItem(item.id) } } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CropHarvester.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CropHarvester.kt index 4936498d2..f64b759a1 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CropHarvester.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/CropHarvester.kt @@ -6,6 +6,7 @@ import core.game.interaction.OptionHandler import core.game.node.Node import core.game.node.entity.npc.familiar.GiantEntNPC import core.game.node.entity.player.Player +import core.game.node.entity.player.link.audio.Audio; import core.game.node.entity.skill.Skills import core.game.node.item.Item import core.game.system.task.Pulse @@ -66,11 +67,18 @@ class CropHarvester : OptionHandler() { Items.MAGIC_SECATEURS_7409 -> Animation(7228) else -> Animation(0) } + val sound = when(requiredItem){ + Items.SPADE_952 -> Audio(1470, 1, 1) + Items.SECATEURS_5329 -> Audio(2437, 1, 1) + Items.MAGIC_SECATEURS_7409 -> Audio(2437, 1, 1) + else -> Audio(0) + } if(!player.inventory.containsItem(Item(requiredItem))){ player.sendMessage("You lack the needed tool to harvest these crops.") return true } player.animator.animate(anim) + player.audioManager.send(sound) delay = 2 player.inventory.add(reward) player.skills.addExperience(Skills.FARMING,plantable.harvestXP) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/DigUpPatchDialogue.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/DigUpPatchDialogue.kt index 9be3aed76..e36c8c4fa 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/DigUpPatchDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/DigUpPatchDialogue.kt @@ -2,6 +2,7 @@ package rs09.game.node.entity.skill.farming import core.game.content.dialogue.DialoguePlugin import core.game.node.entity.player.Player +import core.game.node.entity.player.link.audio.Audio import core.game.node.item.GroundItemManager import core.game.node.item.Item import core.game.system.task.Pulse @@ -34,6 +35,7 @@ class DigUpPatchDialogue(player: Player? = null) : DialoguePlugin(player) { 1 -> { end() player.animator.animate(Animation(830)) + player.audioManager.send(Audio(1470, 1, 1)) player.pulseManager.run(object : Pulse(){ override fun pulse(): Boolean { if(patch?.patch?.type == PatchType.TREE){ diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/FruitAndBerryPicker.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/FruitAndBerryPicker.kt index 97a1e852a..32e12e5fd 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/FruitAndBerryPicker.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/FruitAndBerryPicker.kt @@ -68,6 +68,7 @@ class FruitAndBerryPicker : OptionHandler() { } player.animator.animate(animation) + player.audioManager.send(2437) addItemOrDrop(player,reward.id,reward.amount) player.skills.addExperience(Skills.FARMING,plantable.harvestXP) patch.setCurrentState(patch.getCurrentState() - 1) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/PatchRaker.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/PatchRaker.kt index 3abb24403..e7a8f00c2 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/PatchRaker.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/PatchRaker.kt @@ -17,6 +17,7 @@ object PatchRaker { var patchStage = patch.getPatchFor(player).getCurrentState() if(patchStage <= 2){ player.animator.animate(RAKE_ANIM) + player.audioManager.send(2442) } if(delay < 5) { delay = 5 diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/UseWithPatchHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/UseWithPatchHandler.kt index de76c0ceb..37d45fb7d 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/UseWithPatchHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/farming/UseWithPatchHandler.kt @@ -102,6 +102,7 @@ object UseWithPatchHandler{ player.pulseManager.run(object: Pulse(){ override fun pulse(): Boolean { player.animator.animate(plantCureAnim) + player.audioManager.send(2438) if(player.inventory.remove(event.usedItem)){ player.inventory.add(Item(Items.VIAL_229)) p.cureDisease() @@ -125,6 +126,7 @@ object UseWithPatchHandler{ return true } player.animator.animate(wateringCanAnim) + player.audioManager.send(2446) if(player.inventory.remove(event.usedItem)){ player.inventory.add(Item(usedItem.id.getNext())) p.water() @@ -139,6 +141,7 @@ object UseWithPatchHandler{ val p = patch.getPatchFor(player) if(p.compost == CompostType.NONE) { player.animator.animate(pourBucketAnim) + player.audioManager.send(2427) player.pulseManager.run(object : Pulse(){ override fun pulse(): Boolean { if(player.inventory.remove(event.usedItem,false)){ @@ -208,6 +211,7 @@ object UseWithPatchHandler{ player.lock() if(player.inventory.remove(plantItem)) { player.animator.animate(Animation(2291)) + player.audioManager.send(2432) player.pulseManager.run(object : Pulse(3) { override fun pulse(): Boolean { if(plantable == Plantable.JUTE_SEED && patch == FarmingPatch.MCGRUBOR_HOPS && !player.achievementDiaryManager.hasCompletedTask(DiaryType.SEERS_VILLAGE,0,7)){ diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/MusicCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/MusicCommandSet.kt index c4471a6c4..a1b27b7c1 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/MusicCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/MusicCommandSet.kt @@ -1,6 +1,9 @@ package rs09.game.system.command.sets import core.game.node.entity.player.link.music.MusicEntry +import core.net.packet.PacketRepository +import core.net.packet.context.MusicContext +import core.net.packet.out.MusicPacket import core.plugin.Initializable import rs09.game.system.command.Command @@ -23,6 +26,19 @@ class MusicCommandSet : CommandSet(Command.Privilege.STANDARD){ notify(player,"Now playing song $id") } + /** + * Command that lets you play a song via the ID instead of the song name + * this is mostly useful for custom tracks that aren't in the ingame + * music player yet. + */ + define("playid"){player,arg -> + val id = arg[1].toIntOrNull() + if(id != null){ + PacketRepository.send(MusicPacket::class.java, MusicContext(player, id)) + notify(player,"Now playing song $id") + } + } + /** * Command that unlocks all music tracks for the player * Restricted to ADMIN access only. diff --git a/Server/src/main/kotlin/rs09/game/system/config/ServerConfigParser.kt b/Server/src/main/kotlin/rs09/game/system/config/ServerConfigParser.kt index 5a8b48d7d..451479703 100644 --- a/Server/src/main/kotlin/rs09/game/system/config/ServerConfigParser.kt +++ b/Server/src/main/kotlin/rs09/game/system/config/ServerConfigParser.kt @@ -99,6 +99,7 @@ object ServerConfigParser { ServerConstants.START_LOCATION = parseLocation(data.getString("world.new_player_location")) ServerConstants.DAILY_RESTART = data.getBoolean("world.daily_restart") ServerConstants.GRAND_EXCHANGE_DATA_PATH = data.getPath("paths.eco_data") + ServerConstants.CELEDT_DATA_PATH = data.getPath("paths.cele_drop_table_path") } diff --git a/Server/src/main/kotlin/rs09/game/world/GameWorld.kt b/Server/src/main/kotlin/rs09/game/world/GameWorld.kt index bbbf0824e..89324cc40 100644 --- a/Server/src/main/kotlin/rs09/game/world/GameWorld.kt +++ b/Server/src/main/kotlin/rs09/game/world/GameWorld.kt @@ -4,6 +4,7 @@ import core.cache.Cache import core.cache.def.impl.SceneryDefinition import core.game.ge.GrandExchangeDatabase import core.game.node.entity.npc.drop.RareDropTable +import core.game.node.entity.npc.drop.CELEMinorTable import core.game.node.entity.player.Player import core.game.system.SystemManager import core.game.system.SystemState @@ -137,6 +138,8 @@ object GameWorld { configParser.postPlugin() RareDropTable.init() logInfo("Initialized Rare Drop Table from " + ServerConstants.RDT_DATA_PATH) + CELEMinorTable.init() + logInfo("Initialized Chaos Elemental (Minor) Drop Table from " + ServerConstants.CELEDT_DATA_PATH) if (settings!!.enable_bots) { ImmerseWorld.init() } diff --git a/Server/worldprops/default.conf b/Server/worldprops/default.conf index 671e1db63..932c45714 100644 --- a/Server/worldprops/default.conf +++ b/Server/worldprops/default.conf @@ -59,6 +59,8 @@ configs_path = "@data/configs" grand_exchange_data_path = "@data/eco" #path to file defining the rare drop table rare_drop_table_path = "@data/RDT.xml" +#path to file defining c.ele minor drop table +cele_drop_table_path = "@data/CELEDT.xml" #path to file containing boot-time object changes object_parser_path = "@data/ObjectParser.xml" #path logs are written to