Merge remote-tracking branch 'origin/master'

This commit is contained in:
ceikry
2022-03-09 19:47:16 -06:00
256 changed files with 13711 additions and 29603 deletions
-1
View File
@@ -14,7 +14,6 @@
/Server/build/kotlin/ /Server/build/kotlin/
/Server/build/generated/ /Server/build/generated/
/Server/data/eco/bot_offers.json /Server/data/eco/bot_offers.json
Server/data/cache/
/File-Server/build/ /File-Server/build/
/File-Server/build/classes/ /File-Server/build/classes/
/File-Server/build/tmp/ /File-Server/build/tmp/
+12
View File
@@ -0,0 +1,12 @@
<CELEDT>
<item id="2297" minAmt="3" maxAmt="3" weight="10"/>
<item id="534" minAmt="2" maxAmt="2" weight="10"/>
<item id="530" minAmt="5" maxAmt="5" weight="10"/>
<item id="532" minAmt="3" maxAmt="3" weight="10"/>
<item id="526" minAmt="4" maxAmt="4" weight="10"/>
<item id="536" minAmt="1" maxAmt="1" weight="10"/>
<item id="2436" minAmt="1" maxAmt="1" weight="10"/>
<item id="2442" minAmt="1" maxAmt="1" weight="10"/>
<item id="2440" minAmt="1" maxAmt="1" weight="10"/>
<item id="361" minAmt="5" maxAmt="5" weight="10"/>
</CELEDT>
+1
View File
@@ -24,5 +24,6 @@
<ObjectAction mode="add" id="20987" x="2821" y="2996" z="0" direction="s"/> <ObjectAction mode="add" id="20987" x="2821" y="2996" z="0" direction="s"/>
<ObjectAction mode="add" id="9472" x="3353" y="3951" z="0" direction="s"/> <ObjectAction mode="add" id="9472" x="3353" y="3951" z="0" direction="s"/>
<ObjectAction mode="add" id="21301" x="2662" y="3162" z="0" direction="e"/> <ObjectAction mode="add" id="21301" x="2662" y="3162" z="0" direction="e"/>
<ObjectAction mode="add" id="4176" x="2629" y="3661" z="2" type="4" direction="e"/>
</parsing> </parsing>
+197 -10
View File
@@ -218,10 +218,17 @@
"no", "no",
"We are no strangers to love", "We are no strangers to love",
"You know the rules and so do I", "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", "You wouldnt get this from any other guy",
"Never gonna give you up", "Never gonna give you up",
"Never gonna let you down", "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", "why",
"why", "why",
@@ -243,7 +250,7 @@
"A blessing in disguise @name", "A blessing in disguise @name",
"Break a leg", "Break a leg",
"Cut somebody some slack", "Cut somebody some slack",
"Youre in the right place!", "You're in the right place!",
"Thanks so much.", "Thanks so much.",
"I really appreciate you @name", "I really appreciate you @name",
"Excuse me @name?", "Excuse me @name?",
@@ -252,7 +259,7 @@
"How does that sound @name?", "How does that sound @name?",
"That sounds great @name.", "That sounds great @name.",
"Im learning English.", "Im learning English.",
"I dont understand.", "I don't understand.",
"Could you repeat that please @name?", "Could you repeat that please @name?",
"Could you please talk slower @name?", "Could you please talk slower @name?",
"Thank you. That helps a lot.", "Thank you. That helps a lot.",
@@ -310,11 +317,11 @@
"bowdi boy", "bowdi boy",
"i love bowdi... sometimes", "i love bowdi... sometimes",
"@name = @name", "@name = @name",
"Im bacon.. go on dad... say it", "I'm bacon.. go on dad... say it",
"Im going to leave.", "I'm going to leave.",
"Im happy @name", "I'm happy @name",
"Im not ready yet @name", "I'm not ready yet @name",
"Im very busy. I dont have time now.", "I'm very busy. I don't have time now.",
"Is that enough @name?", "Is that enough @name?",
"I thought the clothes were cheaper @name", "I thought the clothes were cheaper @name",
"Ive been here for two days @name.", "Ive been here for two days @name.",
@@ -329,7 +336,7 @@
"Very good, thanks @name", "Very good, thanks @name",
"Your things are all here i think?", "Your things are all here i think?",
"Long time no see @name", "Long time no see @name",
"I couldnt agree more @name", "I couldn't agree more @name",
"It cost me a fortune @name", "It cost me a fortune @name",
"I am dog tired", "I am dog tired",
"Dont take it personally", "Dont take it personally",
@@ -338,7 +345,187 @@
"No problem", "No problem",
"Anyway I should get going @name", "Anyway I should get going @name",
"I cant help you there @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": [ "approaching_christmas": [
"Only @timer days left till christmas!", "Only @timer days left till christmas!",
+2 -2
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:5b21b37f6251b95d2d102089edb7f872e5f4adbac68b3d60d27b0abfedcddce7 oid sha256:2985b1eac72527b3badb3316d61ba0043310f3c38dd6a5626ae2bfb082fee200
size 91616323 size 91621090
+1 -1
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:168d6ee2abb6131487e81665e6a637399c5cc00c68de1c13b786ac6abdf6e8c8 oid sha256:dbd9a67fcea896a456ba5de71b2059046915a44a6522b1a73252e5e405fc7007
size 12390 size 12390
+1 -1
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:597d8a01507cb66fac2e2f887e3f5abf81ef193b42b787f25e3fe1a016f90fc4 oid sha256:439ea312ce607992e05ffc87031703aaecd3e7aebb66ddb718bde19e04205210
size 990 size 990
+1 -1
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:1fece9b51529810f071d5f9188a1cc0dbab46d45f9185092c6a9e54dc578fd19 oid sha256:4de110552ac35ab5395e44b79133450ba04eac1fa36c4eceb7271cda858024f1
size 348 size 348
+1 -1
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f06b42a0a9014d5a9fd0d3aa936d5ece7ab526e60eab8c44abfa937be9d93cce oid sha256:ad2c31c2f1ce536aee407c59c733ece2809e4ee9b930108f13e149744521ed56
size 174 size 174
+1 -1
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a4ada8a85632a4ac2ff4ee0507eccf0e4d955ba91485d5628e1453873a1d8563 oid sha256:3e86f53e678f5f149502232332fb5147094982644635f59019fff61b47002206
size 272838 size 272838
+493 -275
View File
@@ -13220,66 +13220,6 @@
"id": "199", "id": "199",
"maxAmount": "2" "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", "minAmount": "1",
"weight": "50.0", "weight": "50.0",
@@ -13340,12 +13280,6 @@
"id": "217", "id": "217",
"maxAmount": "2" "maxAmount": "2"
}, },
{
"minAmount": "12",
"weight": "50.0",
"id": "556",
"maxAmount": "12"
},
{ {
"minAmount": "36", "minAmount": "36",
"weight": "50.0", "weight": "50.0",
@@ -14442,7 +14376,7 @@
], ],
"charm": [], "charm": [],
"ids": "438,439,440,441,442,443,655,4470", "ids": "438,439,440,441,442,443,655,4470",
"description": "", "description": "Tree Spirit (Hostile Woodcutting Random Event/Enchanted Valley)",
"main": [ "main": [
{ {
"minAmount": "1", "minAmount": "1",
@@ -14464,7 +14398,7 @@
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "5.0", "weight": "13.0",
"id": "1359", "id": "1359",
"maxAmount": "1" "maxAmount": "1"
}, },
@@ -14474,12 +14408,6 @@
"id": "561", "id": "561",
"maxAmount": "22" "maxAmount": "22"
}, },
{
"minAmount": "1",
"weight": "1.0",
"id": "1462",
"maxAmount": "1"
},
{ {
"minAmount": "1", "minAmount": "1",
"weight": "50.0", "weight": "50.0",
@@ -14552,35 +14480,95 @@
"id": "5301", "id": "5301",
"maxAmount": "1" "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", "minAmount": "1",
"weight": "25.0", "weight": "25.0",
"id": "946", "id": "946",
"maxAmount": "1" "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", "weight": "2.0",
"id": "12163", "id": "12163",
"maxAmount": "1" "maxAmount": "1"
},
{
"minAmount": "1",
"weight": "120.0",
"id": "0",
"maxAmount": "1"
} }
], ],
"ids": "2455,2456", "ids": "2455,2456",
@@ -24338,6 +24320,12 @@
"weight": "16.0", "weight": "16.0",
"id": "5733", "id": "5733",
"maxAmount": "1" "maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1400.0",
"id": "0",
"maxAmount": "1"
} }
] ]
}, },
@@ -30479,8 +30467,8 @@
"main": [ "main": [
{ {
"minAmount": "1", "minAmount": "1",
"weight": "5.0", "weight": "1.0",
"id": "5733", "id": "0",
"maxAmount": "1" "maxAmount": "1"
} }
] ]
@@ -35694,10 +35682,10 @@
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "29", "minAmount": "2",
"weight": "25.0", "weight": "25.0",
"id": "558", "id": "558",
"maxAmount": "29" "maxAmount": "9"
}, },
{ {
"minAmount": "10", "minAmount": "10",
@@ -35718,10 +35706,10 @@
"maxAmount": "7" "maxAmount": "7"
}, },
{ {
"minAmount": "46", "minAmount": "4",
"weight": "25.0", "weight": "25.0",
"id": "562", "id": "562",
"maxAmount": "46" "maxAmount": "6"
}, },
{ {
"minAmount": "2", "minAmount": "2",
@@ -35730,10 +35718,10 @@
"maxAmount": "2" "maxAmount": "2"
}, },
{ {
"minAmount": "34", "minAmount": "3",
"weight": "25.0", "weight": "25.0",
"id": "563", "id": "563",
"maxAmount": "34" "maxAmount": "4"
}, },
{ {
"minAmount": "6", "minAmount": "6",
@@ -39016,159 +39004,166 @@
] ]
}, },
{ {
"default": [], "default": [
{
"minAmount": "1",
"weight": "1.0",
"id": "799",
"maxAmount": "1"
}
],
"charm": [], "charm": [],
"ids": "3200", "ids": "3200",
"description": "", "description": "Chaos Elemental (Boss)",
"main": [ "main": [
{ {
"minAmount": "1", "minAmount": "1",
"weight": "5.0", "weight": "100.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",
"id": "1215", "id": "1215",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "250", "minAmount": "1",
"weight": "50.0", "weight": "10.0",
"id": "562", "id": "7158",
"maxAmount": "250" "maxAmount": "1"
},
{
"minAmount": "300",
"weight": "50.0",
"id": "809",
"maxAmount": "300"
}, },
{ {
"minAmount": "500", "minAmount": "500",
"weight": "25.0", "weight": "98.0",
"id": "556", "id": "556",
"maxAmount": "500" "maxAmount": "500"
}, },
{
"minAmount": "1",
"weight": "25.0",
"id": "560",
"maxAmount": "125"
},
{ {
"minAmount": "75", "minAmount": "75",
"weight": "25.0", "weight": "98.0",
"id": "565", "id": "565",
"maxAmount": "75" "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", "minAmount": "150",
"weight": "25.0", "weight": "100.0",
"id": "892", "id": "892",
"maxAmount": "150" "maxAmount": "150"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "50.0", "weight": "10.0",
"id": "2440", "id": "199",
"maxAmount": "1" "maxAmount": "4"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "50.0", "weight": "10.0",
"id": "2436", "id": "201",
"maxAmount": "1" "maxAmount": "4"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "50.0", "weight": "10.0",
"id": "2442", "id": "203",
"maxAmount": "1" "maxAmount": "4"
}, },
{ {
"minAmount": "3", "minAmount": "1",
"weight": "50.0", "weight": "7.5",
"id": "2297", "id": "205",
"maxAmount": "3" "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", "minAmount": "10",
"weight": "50.0", "weight": "100.0",
"id": "265", "id": "465",
"maxAmount": "10" "maxAmount": "10"
}, },
{
"minAmount": "5",
"weight": "25.0",
"id": "361",
"maxAmount": "5"
},
{ {
"minAmount": "1", "minAmount": "1",
"weight": "25.0", "weight": "98.0",
"id": "5940",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "5952", "id": "5952",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "4", "minAmount": "1",
"weight": "50.0", "weight": "98.0",
"id": "526", "id": "5940",
"maxAmount": "4" "maxAmount": "1"
},
{
"minAmount": "5",
"weight": "50.0",
"id": "530",
"maxAmount": "5"
},
{
"minAmount": "3",
"weight": "50.0",
"id": "532",
"maxAmount": "3"
}, },
{ {
"minAmount": "7500", "minAmount": "7500",
"weight": "25.0", "weight": "105.0",
"id": "995", "id": "995",
"maxAmount": "7500" "maxAmount": "7500"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "25.0", "weight": "10.0",
"id": "536", "id": "31",
"maxAmount": "1" "maxAmount": "1"
}, },
{
"minAmount": "2",
"weight": "25.0",
"id": "534",
"maxAmount": "2"
},
{ {
"minAmount": "1", "minAmount": "1",
"weight": "5.0", "weight": "8.0",
"id": "1462", "id": "5733",
"maxAmount": "1" "maxAmount": "1"
} }
] ]
@@ -40302,66 +40297,6 @@
"id": "556", "id": "556",
"maxAmount": "105" "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", "minAmount": "105",
"weight": "50.0", "weight": "50.0",
@@ -40467,7 +40402,7 @@
{ {
"minAmount": "1", "minAmount": "1",
"weight": "5.0", "weight": "5.0",
"id": "1", "id": "12070",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
@@ -40495,10 +40430,10 @@
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "1", "minAmount": "100",
"weight": "100.0", "weight": "25.0",
"id": "0", "id": "441",
"maxAmount": "1" "maxAmount": "100"
} }
] ]
}, },
@@ -48738,8 +48673,8 @@
"main": [ "main": [
{ {
"minAmount": "1", "minAmount": "1",
"weight": "5.0", "weight": "1.0",
"id": "5733", "id": "0",
"maxAmount": "1" "maxAmount": "1"
} }
] ]
@@ -48753,7 +48688,7 @@
{ {
"minAmount": "1", "minAmount": "1",
"weight": "5.0", "weight": "5.0",
"id": "5733", "id": "0",
"maxAmount": "1" "maxAmount": "1"
} }
] ]
@@ -63897,5 +63832,288 @@
"maxAmount": "1" "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"
}
]
} }
] ]
+1 -1
View File
@@ -409,7 +409,7 @@
}, },
{ {
"item_id": "1973", "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", "item_id": "1982",
+121 -77
View File
@@ -5862,6 +5862,7 @@
"name": "Wizard hat", "name": "Wizard hat",
"tradeable": "true", "tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "579", "id": "579",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0" "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
}, },
@@ -6590,9 +6591,11 @@
{ {
"ge_buy_limit": "100", "ge_buy_limit": "100",
"grand_exchange_price": "677", "grand_exchange_price": "677",
"examine": "A silly pointed hat.",
"durability": null, "durability": null,
"name": "Hat", "name": "Hat",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "656", "id": "656",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0" "equipment_slot": "0"
@@ -6609,9 +6612,11 @@
{ {
"ge_buy_limit": "100", "ge_buy_limit": "100",
"grand_exchange_price": "480", "grand_exchange_price": "480",
"examine": "A silly pointed hat.",
"durability": null, "durability": null,
"name": "Hat", "name": "Hat",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "658", "id": "658",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0" "equipment_slot": "0"
@@ -6628,9 +6633,11 @@
{ {
"ge_buy_limit": "100", "ge_buy_limit": "100",
"grand_exchange_price": "421", "grand_exchange_price": "421",
"examine": "A silly pointed hat.",
"durability": null, "durability": null,
"name": "Hat", "name": "Hat",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "660", "id": "660",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0" "equipment_slot": "0"
@@ -6647,9 +6654,11 @@
{ {
"ge_buy_limit": "100", "ge_buy_limit": "100",
"grand_exchange_price": "1102", "grand_exchange_price": "1102",
"examine": "A silly pointed hat.",
"durability": null, "durability": null,
"name": "Hat", "name": "Hat",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "662", "id": "662",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0" "equipment_slot": "0"
@@ -6669,12 +6678,14 @@
"durability": null, "durability": null,
"name": "Hat", "name": "Hat",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "664", "id": "664",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0" "equipment_slot": "0"
}, },
{ {
"ge_buy_limit": "100", "ge_buy_limit": "100",
"examine": "A silly pointed hat.",
"grand_exchange_price": "295", "grand_exchange_price": "295",
"durability": null, "durability": null,
"name": "Hat", "name": "Hat",
@@ -6794,7 +6805,7 @@
"id": "676" "id": "676"
}, },
{ {
"examine": "An empty tray for panning./This tray contains mud.", "examine": "An empty tray for panning.",
"durability": null, "durability": null,
"name": "Panning tray", "name": "Panning tray",
"high_alchemy": "1", "high_alchemy": "1",
@@ -6802,7 +6813,7 @@
"id": "677" "id": "677"
}, },
{ {
"examine": "An empty tray for panning./This tray contains mud.", "examine": "This tray contains gold nuggets.",
"durability": null, "durability": null,
"name": "Panning tray", "name": "Panning tray",
"high_alchemy": "1", "high_alchemy": "1",
@@ -6810,7 +6821,7 @@
"id": "678" "id": "678"
}, },
{ {
"examine": "An empty tray for panning./This tray contains mud.", "examine": "This tray contains mud.",
"durability": null, "durability": null,
"name": "Panning tray", "name": "Panning tray",
"high_alchemy": "1", "high_alchemy": "1",
@@ -7275,6 +7286,7 @@
"name": "Blue hat", "name": "Blue hat",
"tradeable": "true", "tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "740", "id": "740",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0" "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
}, },
@@ -10047,6 +10059,7 @@
"name": "Wizard hat", "name": "Wizard hat",
"tradeable": "true", "tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "1017", "id": "1017",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0" "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
}, },
@@ -10458,6 +10471,7 @@
"name": "Santa hat", "name": "Santa hat",
"tradeable": "true", "tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "1050" "id": "1050"
}, },
{ {
@@ -15843,7 +15857,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "1391", "id": "1391",
"stand_turn_anim": "1209", "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}", "requirements": "{0,30}-{6,30}",
"shop_price": "7000", "shop_price": "7000",
"durability": null, "durability": null,
@@ -15882,7 +15896,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "1393", "id": "1393",
"stand_turn_anim": "1209", "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}", "requirements": "{0,30}-{6,30}",
"shop_price": "19600", "shop_price": "19600",
"durability": null, "durability": null,
@@ -15922,7 +15936,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "1395", "id": "1395",
"stand_turn_anim": "1209", "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}", "requirements": "{0,30}-{6,30}",
"durability": null, "durability": null,
"high_alchemy": "9300", "high_alchemy": "9300",
@@ -15961,7 +15975,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "1397", "id": "1397",
"stand_turn_anim": "1209", "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}", "requirements": "{0,30}-{6,30}",
"shop_price": "7000", "shop_price": "7000",
"durability": null, "durability": null,
@@ -16001,7 +16015,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "1399", "id": "1399",
"stand_turn_anim": "1209", "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}", "requirements": "{0,30}-{6,30}",
"shop_price": "1500", "shop_price": "1500",
"durability": null, "durability": null,
@@ -16041,7 +16055,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "1401", "id": "1401",
"stand_turn_anim": "1209", "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}", "requirements": "{0,40}-{6,40}",
"durability": null, "durability": null,
"high_alchemy": "25500", "high_alchemy": "25500",
@@ -16079,7 +16093,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "1403", "id": "1403",
"stand_turn_anim": "1209", "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}", "requirements": "{0,40}-{6,40}",
"durability": null, "durability": null,
"high_alchemy": "25500", "high_alchemy": "25500",
@@ -16116,7 +16130,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "1405", "id": "1405",
"stand_turn_anim": "1209", "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}", "requirements": "{0,40}-{6,40}",
"durability": null, "durability": null,
"high_alchemy": "25500", "high_alchemy": "25500",
@@ -16154,7 +16168,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "1407", "id": "1407",
"stand_turn_anim": "1209", "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}", "requirements": "{0,40}-{6,40}",
"shop_price": "40000", "shop_price": "40000",
"durability": null, "durability": null,
@@ -27879,6 +27893,7 @@
"name": "Robin hood hat", "name": "Robin hood hat",
"tradeable": "true", "tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "2581", "id": "2581",
"bonuses": "0,0,0,-10,8,4,6,8,4,4,7,0,0,0,0" "bonuses": "0,0,0,-10,8,4,6,8,4,4,7,0,0,0,0"
}, },
@@ -28788,6 +28803,7 @@
"low_alchemy": "72", "low_alchemy": "72",
"high_alchemy": "108", "high_alchemy": "108",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "2651", "id": "2651",
"equipment_slot": "0" "equipment_slot": "0"
}, },
@@ -28873,7 +28889,7 @@
"tradeable": "true", "tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "2657", "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", "ge_buy_limit": "2",
@@ -28942,7 +28958,7 @@
{ {
"requirements": "{1,40}", "requirements": "{1,40}",
"ge_buy_limit": "2", "ge_buy_limit": "2",
"examine": "Rune platelegs in the colours of Saradomin!", "examine": "Rune platelegs in the colours of Saradomin.",
"durability": null, "durability": null,
"low_alchemy": "25600", "low_alchemy": "25600",
"high_alchemy": "38400", "high_alchemy": "38400",
@@ -29095,7 +29111,7 @@
"tradeable": "true", "tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "2673", "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", "ge_buy_limit": "2",
@@ -30882,6 +30898,7 @@
"name": "Hat", "name": "Hat",
"tradeable": "true", "tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "2900", "id": "2900",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0" "equipment_slot": "0"
@@ -32495,7 +32512,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "3053", "id": "3053",
"stand_turn_anim": "1209", "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}", "requirements": "{0,30}-{6,30}",
"durability": null, "durability": null,
"high_alchemy": "10200", "high_alchemy": "10200",
@@ -32525,7 +32542,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "3054", "id": "3054",
"stand_turn_anim": "1209", "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}", "requirements": "{0,40}-{6,40}",
"shop_price": "160", "shop_price": "160",
"durability": null, "durability": null,
@@ -39292,7 +39309,7 @@
"id": "4020" "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, "durability": null,
"name": "M'speak amulet", "name": "M'speak amulet",
"weight": "1.3", "weight": "1.3",
@@ -63469,7 +63486,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "6562", "id": "6562",
"stand_turn_anim": "1209", "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}", "requirements": "{0,30}-{6,30}",
"durability": null, "durability": null,
"high_alchemy": "10200", "high_alchemy": "10200",
@@ -63497,7 +63514,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "6563", "id": "6563",
"stand_turn_anim": "1209", "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}", "requirements": "{0,40}-{6,40}",
"shop_price": "40000", "shop_price": "40000",
"durability": null, "durability": null,
@@ -71231,16 +71248,17 @@
{ {
"ge_buy_limit": "2", "ge_buy_limit": "2",
"examine": "A silly pointed hat with colourful trim.", "examine": "A silly pointed hat with colourful trim.",
"grand_exchange_price": "1400000",
"durability": null, "durability": null,
"name": "Wizard hat (g)",
"tradeable": "true",
"high_alchemy": "1", "high_alchemy": "1",
"weight": "1", "weight": "1",
"equipment_slot": "0",
"grand_exchange_price": "1400000",
"name": "Wizard hat (g)",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "7394", "id": "7394",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
"equipment_slot": "0"
}, },
{ {
"ge_buy_limit": "2", "ge_buy_limit": "2",
@@ -71254,16 +71272,17 @@
{ {
"ge_buy_limit": "2", "ge_buy_limit": "2",
"examine": "A silly pointed hat, with colourful trim.", "examine": "A silly pointed hat, with colourful trim.",
"grand_exchange_price": "352700",
"durability": null, "durability": null,
"name": "Wizard hat (t)",
"tradeable": "true",
"high_alchemy": "1", "high_alchemy": "1",
"weight": "0.4", "weight": "0.4",
"equipment_slot": "0",
"grand_exchange_price": "352700",
"name": "Wizard hat (t)",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"hat": "true",
"id": "7396", "id": "7396",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
"equipment_slot": "0"
}, },
{ {
"ge_buy_limit": "2", "ge_buy_limit": "2",
@@ -93676,7 +93695,7 @@
"id": "10371" "id": "10371"
}, },
{ {
"requirements": "{1,40}-{4,70}", "requirements": "{4,70}",
"ge_buy_limit": "2", "ge_buy_limit": "2",
"examine": "Zamorak blessed dragonhide chaps.", "examine": "Zamorak blessed dragonhide chaps.",
"durability": null, "durability": null,
@@ -93781,7 +93800,7 @@
"id": "10379" "id": "10379"
}, },
{ {
"requirements": "{1,40}-{4,70}", "requirements": "{4,70}",
"ge_buy_limit": "2", "ge_buy_limit": "2",
"examine": "Guthix blessed dragonhide chaps.", "examine": "Guthix blessed dragonhide chaps.",
"durability": null, "durability": null,
@@ -93888,7 +93907,7 @@
"id": "10387" "id": "10387"
}, },
{ {
"requirements": "{1,40}-{4,70}", "requirements": "{4,70}",
"ge_buy_limit": "2", "ge_buy_limit": "2",
"examine": "Saradomin blessed dragonhide chaps.", "examine": "Saradomin blessed dragonhide chaps.",
"durability": null, "durability": null,
@@ -98229,7 +98248,7 @@
"tradeable": "true", "tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "10780", "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 &amp; plating.", "examine": "Rune platebody with complete gold trim &amp; plating.",
@@ -105823,9 +105842,9 @@
"examine": "Part of the Godsword blade.", "examine": "Part of the Godsword blade.",
"grand_exchange_price": "150200", "grand_exchange_price": "150200",
"durability": null, "durability": null,
"rare_item": "true",
"name": "Godsword shard 1", "name": "Godsword shard 1",
"tradeable": "true", "tradeable": "true",
"rare_item": "true",
"low_alchemy": "100000", "low_alchemy": "100000",
"high_alchemy": "150000", "high_alchemy": "150000",
"weight": "2", "weight": "2",
@@ -105844,15 +105863,15 @@
{ {
"ge_buy_limit": "10", "ge_buy_limit": "10",
"examine": "Part of the Godsword blade.", "examine": "Part of the Godsword blade.",
"grand_exchange_price": "149100",
"durability": null, "durability": null,
"name": "Godsword shard 2",
"tradeable": "true",
"rare_item": "true", "rare_item": "true",
"low_alchemy": "100000", "low_alchemy": "100000",
"high_alchemy": "150000", "high_alchemy": "150000",
"destroy": "true", "destroy": "true",
"weight": "2", "weight": "2",
"grand_exchange_price": "149100",
"name": "Godsword shard 2",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "11712" "id": "11712"
}, },
@@ -105870,9 +105889,9 @@
"examine": "Part of the Godsword blade.", "examine": "Part of the Godsword blade.",
"grand_exchange_price": "149800", "grand_exchange_price": "149800",
"durability": null, "durability": null,
"rare_item": "true",
"name": "Godsword shard 3", "name": "Godsword shard 3",
"tradeable": "true", "tradeable": "true",
"rare_item": "true",
"low_alchemy": "100000", "low_alchemy": "100000",
"high_alchemy": "150000", "high_alchemy": "150000",
"weight": "2", "weight": "2",
@@ -106206,7 +106225,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "11736", "id": "11736",
"stand_turn_anim": "1209", "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}", "requirements": "{0,30}-{6,30}",
"durability": null, "durability": null,
"high_alchemy": "10200", "high_alchemy": "10200",
@@ -106243,7 +106262,7 @@
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "11738", "id": "11738",
"stand_turn_anim": "1209", "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}", "requirements": "{0,40}-{6,40}",
"durability": null, "durability": null,
"high_alchemy": "27000", "high_alchemy": "27000",
@@ -129223,7 +129242,7 @@
"bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0" "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, "durability": null,
"low_alchemy": "25600", "low_alchemy": "25600",
"high_alchemy": "38400", "high_alchemy": "38400",
@@ -129661,7 +129680,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "12,6,0", "absorb": "12,6,0",
"equipment_slot": "4", "equipment_slot": "4",
@@ -129669,6 +129688,7 @@
"remove_sleeves": "true", "remove_sleeves": "true",
"grand_exchange_price": "1412812", "grand_exchange_price": "1412812",
"name": "Zuriel's robe top", "name": "Zuriel's robe top",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13858", "id": "13858",
"bonuses": "0,0,0,35,-10,63,45,74,35,0,60,0,0,0,0" "bonuses": "0,0,0,35,-10,63,45,74,35,0,60,0,0,0,0"
@@ -129680,7 +129700,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "1412812", "grand_exchange_price": "1412812",
@@ -129715,13 +129735,14 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "8,4,0", "absorb": "8,4,0",
"equipment_slot": "7", "equipment_slot": "7",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "986668", "grand_exchange_price": "986668",
"name": "Zuriel's robe bottom", "name": "Zuriel's robe bottom",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13861", "id": "13861",
"bonuses": "0,0,0,25,-7,38,35,44,24,0,30,0,0,0,0" "bonuses": "0,0,0,25,-7,38,35,44,24,0,30,0,0,0,0"
@@ -129733,7 +129754,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "986668", "grand_exchange_price": "986668",
@@ -129768,13 +129789,14 @@
"durability": null, "durability": null,
"low_alchemy": "100000", "low_alchemy": "100000",
"high_alchemy": "150000", "high_alchemy": "150000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "6,3,0", "absorb": "6,3,0",
"equipment_slot": "0", "equipment_slot": "0",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "361542", "grand_exchange_price": "361542",
"name": "Zuriel's hood", "name": "Zuriel's hood",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13864", "id": "13864",
"bonuses": "0,0,0,8,-2,20,16,22,8,0,15,0,0,0,0" "bonuses": "0,0,0,8,-2,20,16,22,8,0,15,0,0,0,0"
@@ -129786,7 +129808,7 @@
"durability": null, "durability": null,
"low_alchemy": "100000", "low_alchemy": "100000",
"high_alchemy": "150000", "high_alchemy": "150000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "361542", "grand_exchange_price": "361542",
@@ -129830,6 +129852,7 @@
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "2116989", "grand_exchange_price": "2116989",
"stand_anim": "813", "stand_anim": "813",
"tradeable": "true",
"run_anim": "1210", "run_anim": "1210",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13867", "id": "13867",
@@ -129839,7 +129862,7 @@
"shop_price": "300000", "shop_price": "300000",
"durability": null, "durability": null,
"high_alchemy": "180000", "high_alchemy": "180000",
"destroy": "true", "destroy": "false",
"weapon_interface": "1", "weapon_interface": "1",
"render_anim": "28", "render_anim": "28",
"attack_audios": "2555,0,0,0", "attack_audios": "2555,0,0,0",
@@ -129852,7 +129875,7 @@
"durability": null, "durability": null,
"low_alchemy": "120000", "low_alchemy": "120000",
"high_alchemy": "180000", "high_alchemy": "180000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "2116989", "grand_exchange_price": "2116989",
@@ -129899,7 +129922,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "0,12,6", "absorb": "0,12,6",
"equipment_slot": "4", "equipment_slot": "4",
@@ -129907,6 +129930,7 @@
"remove_sleeves": "true", "remove_sleeves": "true",
"grand_exchange_price": "926341", "grand_exchange_price": "926341",
"name": "Morrigan's leather body", "name": "Morrigan's leather body",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13870", "id": "13870",
"bonuses": "0,0,0,-15,36,61,53,66,75,62,60,0,0,0,0" "bonuses": "0,0,0,-15,36,61,53,66,75,62,60,0,0,0,0"
@@ -129918,7 +129942,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "926341", "grand_exchange_price": "926341",
@@ -129953,13 +129977,14 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "0,8,4", "absorb": "0,8,4",
"equipment_slot": "7", "equipment_slot": "7",
"destroy_message": "Drop, Destroy after degrading.", "destroy_message": "Drop, Destroy after degrading.",
"grand_exchange_price": "510395", "grand_exchange_price": "510395",
"name": "Morrigan's leather chaps", "name": "Morrigan's leather chaps",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13873", "id": "13873",
"bonuses": "0,0,0,-10,23,35,29,37,46,35,30,0,0,0,0" "bonuses": "0,0,0,-10,23,35,29,37,46,35,30,0,0,0,0"
@@ -129971,7 +129996,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop, Destroy after degrading.", "destroy_message": "Drop, Destroy after degrading.",
"grand_exchange_price": "510395", "grand_exchange_price": "510395",
@@ -130006,13 +130031,14 @@
"durability": null, "durability": null,
"low_alchemy": "100000", "low_alchemy": "100000",
"high_alchemy": "150000", "high_alchemy": "150000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "0,6,3", "absorb": "0,6,3",
"equipment_slot": "0", "equipment_slot": "0",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "236411", "grand_exchange_price": "236411",
"name": "Morrigan's coif", "name": "Morrigan's coif",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13876", "id": "13876",
"bonuses": "0,0,0,-5,13,8,11,14,8,12,15,0,0,0,0" "bonuses": "0,0,0,-5,13,8,11,14,8,12,15,0,0,0,0"
@@ -130024,7 +130050,7 @@
"durability": null, "durability": null,
"low_alchemy": "100000", "low_alchemy": "100000",
"high_alchemy": "150000", "high_alchemy": "150000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "236411", "grand_exchange_price": "236411",
@@ -130060,7 +130086,7 @@
"durability": null, "durability": null,
"low_alchemy": "1600", "low_alchemy": "1600",
"high_alchemy": "2400", "high_alchemy": "2400",
"destroy": "true", "destroy": "false",
"attack_speed": "6", "attack_speed": "6",
"weapon_interface": "18", "weapon_interface": "18",
"absorb": "0,0,0", "absorb": "0,0,0",
@@ -130069,6 +130095,7 @@
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "19944", "grand_exchange_price": "19944",
"name": "Morrigan's javelin", "name": "Morrigan's javelin",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13879", "id": "13879",
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0" "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
@@ -130081,7 +130108,7 @@
"durability": null, "durability": null,
"low_alchemy": "1600", "low_alchemy": "1600",
"high_alchemy": "2400", "high_alchemy": "2400",
"destroy": "true", "destroy": "false",
"attack_speed": "6", "attack_speed": "6",
"weapon_interface": "18", "weapon_interface": "18",
"absorb": "0,0,0", "absorb": "0,0,0",
@@ -130090,6 +130117,7 @@
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "19944", "grand_exchange_price": "19944",
"name": "Morrigan's javelin(p)", "name": "Morrigan's javelin(p)",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13880", "id": "13880",
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0" "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
@@ -130102,7 +130130,7 @@
"durability": null, "durability": null,
"low_alchemy": "1600", "low_alchemy": "1600",
"high_alchemy": "2400", "high_alchemy": "2400",
"destroy": "true", "destroy": "false",
"attack_speed": "6", "attack_speed": "6",
"weapon_interface": "18", "weapon_interface": "18",
"absorb": "0,0,0", "absorb": "0,0,0",
@@ -130111,6 +130139,7 @@
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "19944", "grand_exchange_price": "19944",
"name": "Morrigan's javelin(p+)", "name": "Morrigan's javelin(p+)",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13881", "id": "13881",
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0" "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
@@ -130123,7 +130152,7 @@
"durability": null, "durability": null,
"low_alchemy": "1600", "low_alchemy": "1600",
"high_alchemy": "2400", "high_alchemy": "2400",
"destroy": "true", "destroy": "false",
"attack_speed": "6", "attack_speed": "6",
"weapon_interface": "18", "weapon_interface": "18",
"absorb": "0,0,0", "absorb": "0,0,0",
@@ -130132,6 +130161,7 @@
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "19944", "grand_exchange_price": "19944",
"name": "Morrigan's javelin(p++)", "name": "Morrigan's javelin(p++)",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13882", "id": "13882",
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0" "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
@@ -130144,7 +130174,7 @@
"durability": null, "durability": null,
"low_alchemy": "1600", "low_alchemy": "1600",
"high_alchemy": "2400", "high_alchemy": "2400",
"destroy": "true", "destroy": "false",
"attack_speed": "5", "attack_speed": "5",
"weapon_interface": "18", "weapon_interface": "18",
"absorb": "0,0,0", "absorb": "0,0,0",
@@ -130152,6 +130182,7 @@
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "9994", "grand_exchange_price": "9994",
"name": "Morrigan's throwing axe", "name": "Morrigan's throwing axe",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13883", "id": "13883",
"bonuses": "0,0,0,0,93,0,0,0,0,0,0,0,0,0,0" "bonuses": "0,0,0,0,93,0,0,0,0,0,0,0,0,0,0"
@@ -130163,7 +130194,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "6,0,12", "absorb": "6,0,12",
"equipment_slot": "4", "equipment_slot": "4",
@@ -130171,6 +130202,7 @@
"remove_sleeves": "true", "remove_sleeves": "true",
"grand_exchange_price": "1619096", "grand_exchange_price": "1619096",
"name": "Statius's platebody", "name": "Statius's platebody",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13884", "id": "13884",
"bonuses": "5,5,7,-30,-10,154,145,121,-6,157,60,5,0,0,0" "bonuses": "5,5,7,-30,-10,154,145,121,-6,157,60,5,0,0,0"
@@ -130182,7 +130214,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "1619096", "grand_exchange_price": "1619096",
@@ -130217,7 +130249,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "6,0,12", "absorb": "6,0,12",
"equipment_slot": "4", "equipment_slot": "4",
@@ -130225,6 +130257,7 @@
"remove_sleeves": "true", "remove_sleeves": "true",
"grand_exchange_price": "2154168", "grand_exchange_price": "2154168",
"name": "Vesta's chainbody", "name": "Vesta's chainbody",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13887", "id": "13887",
"bonuses": "5,7,7,-15,0,120,131,145,-3,140,60,6,0,0,0" "bonuses": "5,7,7,-15,0,120,131,145,-3,140,60,6,0,0,0"
@@ -130236,7 +130269,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop, Destroy once it has been degraded.", "destroy_message": "Drop, Destroy once it has been degraded.",
"grand_exchange_price": "2154168", "grand_exchange_price": "2154168",
@@ -130271,13 +130304,14 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "4,0,8", "absorb": "4,0,8",
"equipment_slot": "7", "equipment_slot": "7",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "1735029", "grand_exchange_price": "1735029",
"name": "Statius's platelegs", "name": "Statius's platelegs",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13890", "id": "13890",
"bonuses": "3,3,5,-21,-7,110,106,97,-4,121,30,3,0,0,0" "bonuses": "3,3,5,-21,-7,110,106,97,-4,121,30,3,0,0,0"
@@ -130289,7 +130323,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "1735029", "grand_exchange_price": "1735029",
@@ -130323,13 +130357,14 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "4,0,8", "absorb": "4,0,8",
"equipment_slot": "7", "equipment_slot": "7",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "1860767", "grand_exchange_price": "1860767",
"name": "Vesta's plateskirt", "name": "Vesta's plateskirt",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13893", "id": "13893",
"bonuses": "3,5,5,-17,-4,86,100,112,-2,118,30,3,0,0,0" "bonuses": "3,5,5,-17,-4,86,100,112,-2,118,30,3,0,0,0"
@@ -130341,7 +130376,7 @@
"durability": null, "durability": null,
"low_alchemy": "200000", "low_alchemy": "200000",
"high_alchemy": "300000", "high_alchemy": "300000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "1860767", "grand_exchange_price": "1860767",
@@ -130376,13 +130411,14 @@
"durability": null, "durability": null,
"low_alchemy": "100000", "low_alchemy": "100000",
"high_alchemy": "150000", "high_alchemy": "150000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"absorb": "3,0,6", "absorb": "3,0,6",
"equipment_slot": "0", "equipment_slot": "0",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "1301986", "grand_exchange_price": "1301986",
"name": "Statius's full helm", "name": "Statius's full helm",
"tradeable": "true",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13896", "id": "13896",
"bonuses": "3,3,4,-6,-2,65,70,63,-1,71,15,3,0,0,0" "bonuses": "3,3,4,-6,-2,65,70,63,-1,71,15,3,0,0,0"
@@ -130394,7 +130430,7 @@
"durability": null, "durability": null,
"low_alchemy": "100000", "low_alchemy": "100000",
"high_alchemy": "150000", "high_alchemy": "150000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "1301986", "grand_exchange_price": "1301986",
@@ -130438,6 +130474,7 @@
"attack_anims": "381,390,390,390", "attack_anims": "381,390,390,390",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "10464249", "grand_exchange_price": "10464249",
"tradeable": "true",
"run_anim": "824", "run_anim": "824",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13899", "id": "13899",
@@ -130447,7 +130484,7 @@
"shop_price": "300000", "shop_price": "300000",
"durability": null, "durability": null,
"high_alchemy": "180000", "high_alchemy": "180000",
"destroy": "true", "destroy": "false",
"weapon_interface": "5", "weapon_interface": "5",
"render_anim": "1426", "render_anim": "1426",
"attack_audios": "2500,2500,2517,2500", "attack_audios": "2500,2500,2517,2500",
@@ -130460,7 +130497,7 @@
"durability": null, "durability": null,
"low_alchemy": "120000", "low_alchemy": "120000",
"high_alchemy": "180000", "high_alchemy": "180000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "10464249", "grand_exchange_price": "10464249",
@@ -130516,6 +130553,7 @@
"destroy_message": "Drop, Destroy once it has been degraded.", "destroy_message": "Drop, Destroy once it has been degraded.",
"grand_exchange_price": "7424450", "grand_exchange_price": "7424450",
"stand_anim": "808", "stand_anim": "808",
"tradeable": "true",
"run_anim": "1210", "run_anim": "1210",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13902", "id": "13902",
@@ -130525,7 +130563,7 @@
"shop_price": "300000", "shop_price": "300000",
"durability": null, "durability": null,
"high_alchemy": "180000", "high_alchemy": "180000",
"destroy": "true", "destroy": "false",
"weapon_interface": "10", "weapon_interface": "10",
"attack_audios": "2504,0,0,0", "attack_audios": "2504,0,0,0",
"name": "Statius's warhammer" "name": "Statius's warhammer"
@@ -130537,7 +130575,7 @@
"durability": null, "durability": null,
"low_alchemy": "120000", "low_alchemy": "120000",
"high_alchemy": "180000", "high_alchemy": "180000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"destroy_message": "Drop, Destroy once it has been degraded.", "destroy_message": "Drop, Destroy once it has been degraded.",
"grand_exchange_price": "7424450", "grand_exchange_price": "7424450",
@@ -130593,6 +130631,7 @@
"destroy_message": "Drop", "destroy_message": "Drop",
"grand_exchange_price": "5264612", "grand_exchange_price": "5264612",
"stand_anim": "813", "stand_anim": "813",
"tradeable": "true",
"run_anim": "1210", "run_anim": "1210",
"archery_ticket_price": "0", "archery_ticket_price": "0",
"id": "13905", "id": "13905",
@@ -130602,7 +130641,7 @@
"shop_price": "300000", "shop_price": "300000",
"durability": null, "durability": null,
"high_alchemy": "180000", "high_alchemy": "180000",
"destroy": "true", "destroy": "false",
"weight": "4.2", "weight": "4.2",
"weapon_interface": "14", "weapon_interface": "14",
"render_anim": "28", "render_anim": "28",
@@ -130615,7 +130654,7 @@
"durability": null, "durability": null,
"low_alchemy": "120000", "low_alchemy": "120000",
"high_alchemy": "180000", "high_alchemy": "180000",
"destroy": "true", "destroy": "false",
"attack_speed": "4", "attack_speed": "4",
"two_handed": "true", "two_handed": "true",
"destroy_message": "Drop", "destroy_message": "Drop",
@@ -139623,5 +139662,10 @@
"render_anim": "28", "render_anim": "28",
"attack_audios": "2555,0,0,0", "attack_audios": "2555,0,0,0",
"name": "Staff of the raven" "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"
} }
] ]
+1 -1
View File
@@ -2181,7 +2181,7 @@
"id": "573", "id": "573",
"name": "The Mad Mole", "name": "The Mad Mole",
"indexId": "393", "indexId": "393",
"borders": "{1728,5120,1791,5183}" "borders": "{1728,5120,1791,5247}"
}, },
{ {
"id": "575", "id": "575",
File diff suppressed because it is too large Load Diff
+45 -1
View File
@@ -3403,6 +3403,10 @@
"npc_id": "1469", "npc_id": "1469",
"loc_data": "{2595,3277,0,0,0}" "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", "npc_id": "1514",
"loc_data": "{3432,3487,0,0,0}" "loc_data": "{3432,3487,0,0,0}"
@@ -3735,6 +3739,10 @@
"npc_id": "1697", "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}" "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", "npc_id": "1699",
"loc_data": "{3659,3480,0,1,3}" "loc_data": "{3659,3480,0,1,3}"
@@ -4199,6 +4207,10 @@
"npc_id": "2059", "npc_id": "2059",
"loc_data": "{2588,3088,0,1,3}" "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", "npc_id": "2082",
"loc_data": "{3210,3220,1,1,6}" "loc_data": "{3210,3220,1,1,6}"
@@ -6091,6 +6103,22 @@
"npc_id": "3917", "npc_id": "3917",
"loc_data": "{2581,3861,0,0,1}" "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", "npc_id": "3937",
"loc_data": "{2508,3866,0,0,3}" "loc_data": "{2508,3866,0,0,3}"
@@ -8083,6 +8111,10 @@
"npc_id": "5672", "npc_id": "5672",
"loc_data": "{3788,2825,2,0,0}" "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", "npc_id": "5750",
"loc_data": "{3290,5544,0,1,4}-{3270,5552,0,1,1}-{3274,5547,0,1,7}" "loc_data": "{3290,5544,0,1,4}-{3270,5552,0,1,1}-{3274,5547,0,1,7}"
@@ -8269,7 +8301,7 @@
}, },
{ {
"npc_id": "5828", "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", "npc_id": "5832",
@@ -9607,6 +9639,10 @@
"npc_id": "7052", "npc_id": "7052",
"loc_data": "{2571,2855,0,0,0}" "loc_data": "{2571,2855,0,0,0}"
}, },
{
"npc_id": "7054",
"loc_data": "{2561,2850,0,0,0}"
},
{ {
"npc_id": "7055", "npc_id": "7055",
"loc_data": "{2559,2851,0,0,0}-{2560,2852,0,0,0}" "loc_data": "{2559,2851,0,0,0}-{2560,2852,0,0,0}"
@@ -10926,5 +10962,13 @@
{ {
"npc_id": "7130", "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}" "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}"
} }
] ]
+91 -19
View File
@@ -69,7 +69,7 @@
"general_store": "true", "general_store": "true",
"id": "8", "id": "8",
"title": "West Ardougne General Store", "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", "npcs": "1917",
@@ -204,7 +204,7 @@
"general_store": "true", "general_store": "true",
"id": "23", "id": "23",
"title": "Lletya General Store", "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", "npcs": "4516",
@@ -213,7 +213,7 @@
"general_store": "true", "general_store": "true",
"id": "24", "id": "24",
"title": "Moon Clan General Store", "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", "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}" "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", "high_alch": "0",
"currency": "995", "currency": "995",
"general_store": "true", "general_store": "true",
@@ -702,13 +702,13 @@
"stock": "{4012,10}-{1963,10}-{4016,10}-{4014,10}" "stock": "{4012,10}-{1963,10}-{4016,10}-{4014,10}"
}, },
{ {
"npcs": "7053", "npcs": "7054",
"high_alch": "0", "high_alch": "0",
"currency": "995", "currency": "995",
"general_store": "false", "general_store": "false",
"id": "80", "id": "80",
"title": "Fresh Meat", "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", "npcs": "571",
@@ -1229,8 +1229,8 @@
"currency": "995", "currency": "995",
"general_store": "false", "general_store": "false",
"id": "139", "id": "139",
"title": "Spice Shop", "title": "The Spice Is Right",
"stock": "{1931,30}-{2169,10}-{5970,0}" "stock": "{1931,30}-{2169,10}-{5970,0}-{175,10}"
}, },
{ {
"npcs": "546", "npcs": "546",
@@ -2031,7 +2031,7 @@
"general_store": "false", "general_store": "false",
"id": "229", "id": "229",
"title": "Lletya Food Store", "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", "npcs": "2356",
@@ -2042,15 +2042,6 @@
"title": "Lletya Archery Shop", "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}" "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", "npcs": "1282",
"high_alch": "0", "high_alch": "0",
@@ -2164,8 +2155,89 @@
"high_alch": "0", "high_alch": "0",
"currency": "995", "currency": "995",
"general_store": "false", "general_store": "false",
"id": "245", "id": "244",
"title": "The Armour Store", "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}" "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}"
} }
] ]
@@ -34,6 +34,8 @@ import rs09.game.content.activity.barrows.RewardChest;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
import rs09.plugin.PluginManager; import rs09.plugin.PluginManager;
import static api.ContentAPIKt.getWorldTicks;
/** /**
* Handles the barrows activity plugin. * Handles the barrows activity plugin.
* @author Emperor * @author Emperor
@@ -77,7 +79,7 @@ public final class BarrowsActivityPlugin extends ActivityPlugin {
/** /**
* The activity handling pulse. * The activity handling pulse.
*/ */
private static final Pulse PULSE = new Pulse(3) { private static final Pulse PULSE = new Pulse(0) {
@Override @Override
public boolean pulse() { public boolean pulse() {
boolean end = true; boolean end = true;
@@ -89,21 +91,23 @@ public final class BarrowsActivityPlugin extends ActivityPlugin {
p.getPacketDispatch().sendItemOnInterface(-1, 1, 24, index); p.getPacketDispatch().sendItemOnInterface(-1, 1, 24, index);
continue; 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) { if (RandomFunction.random(15) == 0) {
p.getImpactHandler().manualHit(p, RandomFunction.random(5), HitsplatType.NORMAL); p.getImpactHandler().manualHit(p, RandomFunction.random(5), HitsplatType.NORMAL);
Graphics.send(Graphics.create(405), p.getLocation()); Graphics.send(Graphics.create(405), p.getLocation());
} }
} }
if (p.getLocks().isLocked("barrow:drain") || RandomFunction.random(100) % 2 == 0) {
continue;
}
int drain = 8; 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()) { for (boolean killed : p.getSavedData().getActivityData().getBarrowBrothers()) {
if (killed) { if (killed) {
drain += 1; drain += 1;
} }
} }
if(getWorldTicks() % 30 == 0){
p.getSkills().decrementPrayerPoints(drain); p.getSkills().decrementPrayerPoints(drain);
p.getLocks().lock("barrow:drain", (3 + RandomFunction.random(15)) * 3); p.getLocks().lock("barrow:drain", (3 + RandomFunction.random(15)) * 3);
index = 1 + RandomFunction.random(6); index = 1 + RandomFunction.random(6);
@@ -111,6 +115,7 @@ public final class BarrowsActivityPlugin extends ActivityPlugin {
p.getPacketDispatch().sendItemZoomOnInterface(4761 + RandomFunction.random(12), 100, 24, index); p.getPacketDispatch().sendItemZoomOnInterface(4761 + RandomFunction.random(12), 100, 24, index);
p.getPacketDispatch().sendAnimationInterface(9810, 24, index); p.getPacketDispatch().sendAnimationInterface(9810, 24, index);
} }
}
return end; return end;
} }
}; };
@@ -1,5 +1,6 @@
package core.game.content.activity.guild; package core.game.content.activity.guild;
import static api.ContentAPIKt.*;
import core.cache.def.impl.SceneryDefinition; import core.cache.def.impl.SceneryDefinition;
import core.game.content.global.action.ClimbActionHandler; import core.game.content.global.action.ClimbActionHandler;
import core.game.content.global.action.DoorActionHandler; 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.Initializable;
import core.plugin.Plugin; import core.plugin.Plugin;
import static api.ContentAPIKt.getDynLevel;
/** /**
* Represents the plugin used for the mining guild. * Represents the plugin used for the mining guild.
* @author 'Vexia * @author 'Vexia
@@ -34,7 +37,7 @@ public final class MiningGuildPlugin extends OptionHandler {
public boolean handle(Player player, Node node, String option) { public boolean handle(Player player, Node node, String option) {
if (option.equals("climb-down")) { if (option.equals("climb-down")) {
if (player.getLocation().withinDistance(Location.create(3019, 3339, 0), 4)) { 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); player.getDialogueInterpreter().open(382, NPC.create(382, Location.create(0, 0, 0)), 1);
return true; return true;
} }
@@ -45,7 +48,7 @@ public final class MiningGuildPlugin extends OptionHandler {
return true; return true;
} }
if (option.equals("open")) { 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); player.getDialogueInterpreter().open(382, NPC.create(382, Location.create(0, 0, 0)), 1);
return true; return true;
} }
@@ -65,6 +65,7 @@ public enum Consumables {
TRIANGLE_SANDWICH(new Food(new int[] {6962}, new HealingEffect(6))), TRIANGLE_SANDWICH(new Food(new int[] {6962}, new HealingEffect(6))),
SQUARE_SANDWICH(new Food(new int[] {6965}, 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."})), 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 */ /** Kebabs */
UGTHANKI_KEBAB(new Food(new int[] {1883}, new UgthankiKebabEffect())), 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))), STEW(new Food(new int[] {2003, 1923}, new HealingEffect(11))),
SPICY_STEW(new Food(new int[] {7479, 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))), 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 */ /** Pizzas */
PLAIN_PIZZA(new HalfableFood(new int[] {2289, 2291}, new HealingEffect(7))), PLAIN_PIZZA(new HalfableFood(new int[] {2289, 2291}, new HealingEffect(7))),
@@ -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 };
}
}
@@ -61,10 +61,15 @@ public final class BarkerDialogue extends DialoguePlugin {
break; break;
case 2: case 2:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks.");
stage = 20; stage = 15;
break; break;
} }
break; break;
case 15:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Unfortunate for you, yes?", "Many bargains, won't find elsewhere!");
stage = 20;
break;
case 20: case 20:
end(); end();
break; break;
@@ -45,7 +45,7 @@ public class CabinBoyJenkins extends DialoguePlugin {
quest = player.getQuestRepository().getQuest("Dragon Slayer"); quest = player.getQuestRepository().getQuest("Dragon Slayer");
switch (quest.getStage(player)) { switch (quest.getStage(player)) {
case 20: case 20:
npc("Ahoy ! Whay d'ye think of yer ship then?"); npc("Ahoy! Whay d'ye think of yer ship then?");
stage = 0; stage = 0;
break; break;
case 40: case 40:
@@ -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 };
}
}
@@ -8,6 +8,7 @@ import core.game.node.entity.player.Player;
* Represents the dialogue plugin used for the cuffs npc. * Represents the dialogue plugin used for the cuffs npc.
* @author 'Vexia * @author 'Vexia
* @version 1.0 * @version 1.0
* Fixed a typo -Nuggles
*/ */
@Initializable @Initializable
public final class CuffsDialogue extends DialoguePlugin { public final class CuffsDialogue extends DialoguePlugin {
@@ -54,7 +55,7 @@ public final class CuffsDialogue extends DialoguePlugin {
stage = 2; stage = 2;
break; break;
case 2: 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; stage = 3;
break; break;
case 3: case 3:
@@ -7,6 +7,7 @@ import core.plugin.Initializable;
/** /**
* Represents the dialogue plugin used for the goblin village guard npc. * Represents the dialogue plugin used for the goblin village guard npc.
* @author jamix77 * @author jamix77
* Fixed a typo -Nuggles
*/ */
@Initializable @Initializable
public final class GoblinVillageGuardDialogue extends DialoguePlugin { public final class GoblinVillageGuardDialogue extends DialoguePlugin {
@@ -47,7 +48,7 @@ public final class GoblinVillageGuardDialogue extends DialoguePlugin {
public boolean handle(int interfaceId, int buttonId) { public boolean handle(int interfaceId, int buttonId) {
switch (stage) { switch (stage) {
case 0: 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; stage = 1;
break; break;
case 1: case 1:
@@ -59,7 +60,7 @@ public final class GoblinVillageGuardDialogue extends DialoguePlugin {
stage++; stage++;
break; break;
case 3: 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++; stage++;
break; break;
case 4: case 4:
@@ -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 };
}
}
@@ -52,7 +52,7 @@ public final class LongbowBenDialogue extends DialoguePlugin {
case 1: case 1:
switch (buttonId) { switch (buttonId) {
case 1: 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; stage = 100;
break; break;
case 2: case 2:
@@ -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 };
}
}
@@ -101,7 +101,7 @@ public final class MissSchismDialogue extends DialoguePlugin {
stage = 112; stage = 112;
break; break;
case 112: 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; stage = 113;
break; break;
case 113: case 113:
@@ -127,7 +127,7 @@ public final class MissSchismDialogue extends DialoguePlugin {
stage = 212; stage = 212;
break; break;
case 212: 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; stage = 213;
break; break;
case 213: case 213:
@@ -150,12 +150,12 @@ public final class MissSchismDialogue extends DialoguePlugin {
stage = 22; stage = 22;
break; break;
case 22: 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; stage = 23;
break; break;
case 23: case 23:
if(player.getQuestRepository().isComplete("Vampire Slayer")) { 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; stage = 24;
} else { } else {
end(); end();
@@ -185,3 +185,6 @@ public final class MissSchismDialogue extends DialoguePlugin {
return new int[] { 2634 }; return new int[] { 2634 };
} }
} }
/**
* Fixed Vexia's crappy English in some sentences
*/
@@ -34,7 +34,7 @@ public final class MonkeyDialogue extends DialoguePlugin {
@Override @Override
public boolean open(Object... args) { public boolean open(Object... args) {
player("Who's a cute little monkey?"); player("Hey little man, how's it goin'?");
return true; return true;
} }
@@ -46,12 +46,15 @@ public final class MonkeyDialogue extends DialoguePlugin {
stage++; stage++;
break; break;
case 1: case 1:
player(FacialExpression.HALF_GUILTY,"Yeah.");
stage = 5;
break;
case 5:
end(); end();
break; break;
} }
return true; return true;
} }
@Override @Override
public int[] getIds() { public int[] getIds() {
return new int[] { 2301 }; return new int[] { 2301 };
@@ -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 };
}
}
@@ -15,6 +15,7 @@ import core.game.node.item.Item;
* @notice Modified March 2nd, 2015 to allow the bulk buying of shards. * @notice Modified March 2nd, 2015 to allow the bulk buying of shards.
* @notice The previous notice is dubious * @notice The previous notice is dubious
* @notice Spirit shard packs were released 9 September 2009, outside of 530. Option removed. * @notice Spirit shard packs were released 9 September 2009, outside of 530. Option removed.
* Fixed multiple typos -Nuggles
*/ */
@Initializable @Initializable
public final class PikkupstixDialogue extends DialoguePlugin { public final class PikkupstixDialogue extends DialoguePlugin {
@@ -438,7 +439,7 @@ public final class PikkupstixDialogue extends DialoguePlugin {
stage = 6; stage = 6;
break; break;
case 6: 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; stage = 7;
break; break;
case 7: case 7:
@@ -624,10 +625,10 @@ public final class PikkupstixDialogue extends DialoguePlugin {
switch (stage) { switch (stage) {
case 0: case 0:
if (player.getSkills().getStaticLevel(Skills.SUMMONING) == 99) { 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; stage = 600;
} else { } 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; stage = 1;
} }
break; break;
@@ -685,7 +686,7 @@ public final class PikkupstixDialogue extends DialoguePlugin {
stage = 102; stage = 102;
break; break;
case 102: 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; stage = 103;
break; break;
case 103: case 103:
@@ -743,7 +744,7 @@ public final class PikkupstixDialogue extends DialoguePlugin {
stage = 401; stage = 401;
break; break;
case 401: 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; stage = 1;
break; break;
case 600: case 600:
@@ -17,43 +17,45 @@ public enum BirdNest {
SEED(new ChanceItem(5073, 1, 65), SEED(new ChanceItem(5073, 1, 65),
new ChanceItem(Items.ACORN_5312, 1, NPCDropTables.DROP_RATES[0]), 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.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.BANANA_TREE_SEED_5284, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.ORANGE_TREE_SEED_5285, 1, NPCDropTables.DROP_RATES[1]), new ChanceItem(Items.ORANGE_TREE_SEED_5285, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.WILLOW_SEED_5313, 1, NPCDropTables.DROP_RATES[1]), new ChanceItem(Items.CURRY_TREE_SEED_5286, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.CURRY_TREE_SEED_5286, 1, NPCDropTables.DROP_RATES[1]), new ChanceItem(Items.MAPLE_SEED_5314, 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[1]),
new ChanceItem(Items.PINEAPPLE_SEED_5287, 1, NPCDropTables.DROP_RATES[2]), new ChanceItem(Items.PAPAYA_TREE_SEED_5288, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.PAPAYA_TREE_SEED_5288, 1, NPCDropTables.DROP_RATES[2]), 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.PALM_TREE_SEED_5289, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.CALQUAT_TREE_SEED_5290, 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.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3]),
new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3]), new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3])),
new ChanceItem(Items.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3])),
RING(new ChanceItem(5074, 1, 30), RING(new ChanceItem(5074, 1, 30),
new ChanceItem(Items.GOLD_RING_1635, 1, NPCDropTables.DROP_RATES[0]), 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.SAPPHIRE_RING_1637, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.EMERALD_RING_1639, 1, NPCDropTables.DROP_RATES[1]), new ChanceItem(Items.EMERALD_RING_1639, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.RUBY_RING_1641, 1, NPCDropTables.DROP_RATES[2]), new ChanceItem(Items.RUBY_RING_1641, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.DIAMOND_RING_1643, 1, NPCDropTables.DROP_RATES[3])), new ChanceItem(Items.DIAMOND_RING_1643, 1, NPCDropTables.DROP_RATES[2])),
RED(new ChanceItem(5070, 1, 5), new ChanceItem(5076)), RED(new ChanceItem(5070, 1, 5), new ChanceItem(5076)),
GREEN(new ChanceItem(5071, 1, 5), new ChanceItem(5078)), GREEN(new ChanceItem(5071, 1, 5), new ChanceItem(5078)),
BLUE(new ChanceItem(5072, 1, 5), new ChanceItem(5077)), BLUE(new ChanceItem(5072, 1, 5), new ChanceItem(5077)),
RAVEN(new ChanceItem(11966, 1, 5), new ChanceItem(11964)), RAVEN(new ChanceItem(11966, 1, 5), new ChanceItem(11964)),
WYSON(new ChanceItem(7413, 1, 1), WYSON(new ChanceItem(7413, 1, 1),
new ChanceItem(Items.CABBAGE_SEED_5324, 1, NPCDropTables.DROP_RATES[0]), new ChanceItem(Items.POTATO_SEED_5318, 14, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.SWEETCORN_SEED_5320, 1, NPCDropTables.DROP_RATES[0]), new ChanceItem(Items.SWEETCORN_SEED_5320, 3, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.TOMATO_SEED_5322, 1, NPCDropTables.DROP_RATES[0]), new ChanceItem(Items.TOMATO_SEED_5322, 6, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.ONION_SEED_5319, 1, NPCDropTables.DROP_RATES[0]), new ChanceItem(Items.CABBAGE_SEED_5324, 9, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.POTATO_SEED_5318, 1, NPCDropTables.DROP_RATES[0]), new ChanceItem(Items.LIMPWURT_SEED_5100, 2, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.LIMPWURT_SEED_5100, 1, NPCDropTables.DROP_RATES[1]), new ChanceItem(Items.ONION_SEED_5319, 11, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.STRAWBERRY_SEED_5323, 1, NPCDropTables.DROP_RATES[1]), new ChanceItem(Items.STRAWBERRY_SEED_5323, 3, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.TOADFLAX_SEED_5296, 1, NPCDropTables.DROP_RATES[0]), new ChanceItem(Items.WATERMELON_SEED_5321, 2, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.WATERMELON_SEED_5321, 1, NPCDropTables.DROP_RATES[1]), new ChanceItem(Items.ACORN_5312, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.RANARR_SEED_5295, 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.MAPLE_SEED_5314, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.YEW_SEED_5315, 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.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3]),
new ChanceItem(Items.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3]));
/** /**
* The random nest items. * The random nest items.
@@ -12,7 +12,7 @@ import core.game.world.map.Location;
import core.game.world.map.RegionManager; import core.game.world.map.RegionManager;
import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Animation;
import core.plugin.Initializable; 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.content.quest.free.dragonslayer.NedDialogue;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
import rs09.plugin.PluginManager; import rs09.plugin.PluginManager;
@@ -4,7 +4,7 @@ import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.quest.Quest; import core.game.node.entity.player.link.quest.Quest;
import core.game.node.item.Item; import core.game.node.item.Item;
import core.plugin.Initializable; import core.plugin.Initializable;
import rs09.game.content.dialogue.KingRoaldDialogue; import rs09.game.content.dialogue.region.varrock.KingRoaldDialogue;
import rs09.plugin.PluginManager; import rs09.plugin.PluginManager;
/** /**
@@ -8,7 +8,7 @@ import core.game.node.entity.skill.Skills;
@Initializable @Initializable
public class FishingContest extends Quest { 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_ROD = new Item(307);
public static final Item FISHING_PASS = new Item(27); public static final Item FISHING_PASS = new Item(27);
public static final Item RED_VINE_WORM = new Item(25); public static final Item RED_VINE_WORM = new Item(25);
@@ -3,6 +3,7 @@ package core.game.content.quest.members.merlinscrystal;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.quest.Quest; import core.game.node.entity.player.link.quest.Quest;
import core.plugin.Initializable; import core.plugin.Initializable;
import rs09.game.content.quest.members.merlinsquest.TheLadyOfTheLake;
import rs09.plugin.PluginManager; import rs09.plugin.PluginManager;
/** /**
@@ -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};
}
}
@@ -10,6 +10,8 @@ import core.game.world.update.flag.context.Animation;
/** /**
* Handles the surok magis dialogue. * Handles the surok magis dialogue.
* @author Vexia * @author Vexia
* @editor Nuggles
* fixed the default dialogue, the NPC and Player tags were swapped.
*/ */
public class SurokMagisDialogue extends DialoguePlugin { public class SurokMagisDialogue extends DialoguePlugin {
@@ -105,31 +107,31 @@ public class SurokMagisDialogue extends DialoguePlugin {
default: default:
switch (stage) { switch (stage) {
case 0: 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; stage = 1;
break; break;
case 1: 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; stage = 2;
break; break;
case 2: 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; stage = 3;
break; break;
case 3: 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; stage = 4;
break; break;
case 4: 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; stage = 5;
break; break;
case 5: 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; stage = 6;
break; break;
case 6: case 6:
npc("Yes, of course!"); player("Yes, of course!");
stage = 7; stage = 7;
break; break;
case 7: case 7:
@@ -1,10 +1,14 @@
package core.game.content.zone.rellekka; package core.game.content.zone.rellekka;
import core.cache.def.impl.SceneryDefinition; 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.plugin.Initializable;
import core.game.node.entity.skill.agility.AgilityHandler; import core.game.node.entity.skill.agility.AgilityHandler;
import core.game.interaction.Option; import core.game.interaction.Option;
import core.game.interaction.OptionHandler; import core.game.interaction.OptionHandler;
import core.game.component.Component;
import core.game.node.Node; import core.game.node.Node;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
import core.game.node.entity.impl.ForceMovement; 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.map.zone.ZoneBuilder;
import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Animation;
import core.plugin.Plugin; import core.plugin.Plugin;
import rs09.game.world.GameWorld;
import rs09.plugin.PluginManager; import rs09.plugin.PluginManager;
/** /**
@@ -36,7 +41,6 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
@Override @Override
public Plugin<Object> newInstance(Object arg) throws Throwable { public Plugin<Object> newInstance(Object arg) throws Throwable {
ZoneBuilder.configure(this); ZoneBuilder.configure(this);
PluginManager.definePlugin(new SailorDialogue());
PluginManager.definePlugin(new JarvaldDialogue()); PluginManager.definePlugin(new JarvaldDialogue());
PluginManager.definePlugins(new RellekaOptionHandler(), new MariaGunnarsDialogue()); PluginManager.definePlugins(new RellekaOptionHandler(), new MariaGunnarsDialogue());
PluginManager.definePlugin(new OptionHandler() { PluginManager.definePlugin(new OptionHandler() {
@@ -72,21 +76,9 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
* (option.equals("Trade") ? "buy clothes here" : * (option.equals("Trade") ? "buy clothes here" :
* "change their shoes here") + "."); return true; * "change their shoes here") + "."); return true;
*/ */
case 4165: //case 4148:
player.getDialogueInterpreter().open(1288); // player.getDialogueInterpreter().sendDialogues(1278, null, "Hey, outerlander. You can't go through there. Talent", "only, backstage.");
return true; // 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 100: 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."); 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; return true;
@@ -114,6 +106,35 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
register(new ZoneBorders(2602, 3639, 2739, 3741)); 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. * Handles options related to relleka.
* @author Vexia * @author Vexia
@@ -126,6 +147,7 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
SceneryDefinition.forId(4615).getHandlers().put("option:cross", this); SceneryDefinition.forId(4615).getHandlers().put("option:cross", this);
SceneryDefinition.forId(5847).getHandlers().put("option:climb-over", this); SceneryDefinition.forId(5847).getHandlers().put("option:climb-over", this);
SceneryDefinition.forId(5008).getHandlers().put("option:enter",this); SceneryDefinition.forId(5008).getHandlers().put("option:enter",this);
SceneryDefinition.forId(15116).getHandlers().put("option:climb-down", this);
return this; return this;
} }
@@ -154,6 +176,13 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
break; break;
} }
break; break;
case "climb-down":
switch(node.getId()){
case 15116:
player.getProperties().setTeleportLocation(Location.create(2509, 10245, 0));
break;
}
break;
} }
return true; return true;
} }
@@ -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 };
}
}
@@ -45,6 +45,7 @@ public final class EmptyOptionPlugin extends OptionHandler {
public Plugin<Object> newInstance(Object arg) throws Throwable { public Plugin<Object> newInstance(Object arg) throws Throwable {
ItemDefinition.setOptionHandler("empty", this); ItemDefinition.setOptionHandler("empty", this);
ItemDefinition.setOptionHandler("empty dish", this); ItemDefinition.setOptionHandler("empty dish", this);
ItemDefinition.setOptionHandler("empty bowl", this);
return this; return this;
} }
public enum EmptyItem{ 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_SUPERCOMPOST(6034, BUCKET, "You empty the bucket of supercompost."),
BUCKET_OF_SLIME(4286, BUCKET, "You empty the contents of the bucket on the floor."), BUCKET_OF_SLIME(4286, BUCKET, "You empty the contents of the bucket on the floor."),
VIAL_OF_WATER(227, VIAL, "You empty the vial."), 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."), JUG_OF_WATER(1937, 1935, "You empty the contents of the jug onto the floor."),
BURNT_PIE(2329, 2313, "You empty the pie dish."), 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; int fullId, emptyId;
String emptyMessage; String emptyMessage;
@@ -24,6 +24,7 @@ public class SpadeDigOptionPlugin extends OptionHandler {
@Override @Override
public boolean handle(final Player player, Node node, String option) { public boolean handle(final Player player, Node node, String option) {
player.getAudioManager().send(1470,1,1);
if (!DigSpadeHandler.dig(player)) { if (!DigSpadeHandler.dig(player)) {
player.sendMessage("You dig but find nothing."); player.sendMessage("You dig but find nothing.");
} }
@@ -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<Object> 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 </code>PoisionWeapon</code>.
*/
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;
}
}
}
@@ -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 </code>PoisionWeapon</code>.
*/
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<Object> newInstance(Object arg) throws Throwable {
addHandler(187, ITEM_TYPE, this);
addHandler(5937, ITEM_TYPE, this);
addHandler(5940, ITEM_TYPE, this);
return this;
}
}
@@ -131,7 +131,7 @@ public final class BankingPlugin extends OptionHandler {
/** /**
* Represents the banker npc ids. * 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. * Represents the id to use.
@@ -4,6 +4,7 @@ import core.game.component.Component;
import core.game.component.ComponentDefinition; import core.game.component.ComponentDefinition;
import core.game.component.ComponentPlugin; import core.game.component.ComponentPlugin;
import core.game.content.global.action.DoorActionHandler; import core.game.content.global.action.DoorActionHandler;
import core.game.node.Node;
import core.game.node.entity.impl.ForceMovement; import core.game.node.entity.impl.ForceMovement;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.audio.Audio; 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)); 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){ public static void handleGate(final Player player){
Scenery gate = player.getAttribute("wildy_gate"); Scenery gate = player.getAttribute("wildy_gate");
// Cleanup // Cleanup
@@ -211,11 +211,7 @@ public final class GiantMoleNPC extends AbstractNPC {
@Override @Override
public void onImpact(final Entity entity, BattleState state) { public void onImpact(final Entity entity, BattleState state) {
if (!getLocks().isInteractionLocked()) { if (!getLocks().isInteractionLocked()) {
int chance = 15; if (RandomFunction.randomize(100) < 24 && inCombat() && getSkills().getLifepoints() < 100 && getSkills().getLifepoints() > 5){
if (getSkills().getLifepoints() < getSkills().getMaximumLifepoints() >> 1) {
chance *= 3;
}
if (RandomFunction.randomize(100) < chance && inCombat()) {
dig(); dig();
return; 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) { public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) {
if (button == 17) { if (button == 17) {
player.getProperties().setTeleportLocation(Location.create(1752, 5237, 0)); 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."); player.getPacketDispatch().sendMessage("You seem to have dropped down into a network of mole tunnels.");
if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0, 5)) { if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0, 5)) {
@@ -8,6 +8,7 @@ import core.game.node.entity.combat.equipment.SwitchAttack;
import core.game.node.entity.impl.Projectile; import core.game.node.entity.impl.Projectile;
import core.game.node.entity.npc.AbstractNPC; import core.game.node.entity.npc.AbstractNPC;
import core.game.node.entity.player.Player; 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.node.item.Item;
import core.game.world.map.Location; import core.game.world.map.Location;
import core.game.world.map.RegionManager; import core.game.world.map.RegionManager;
@@ -62,7 +63,7 @@ public class ChaosElementalNPC extends AbstractNPC {
@Override @Override
public void sendImpact(BattleState state) { public void sendImpact(BattleState state) {
if (state.getEstimatedHit() > 28) { 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); super.sendImpact(state);
} }
@@ -135,7 +136,11 @@ public class ChaosElementalNPC extends AbstractNPC {
if (player == null) { if (player == null) {
return; 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); Location loc = getRandomLoc(entity);
while (!RegionManager.isTeleportPermitted(loc) || RegionManager.getObject(loc) != null) { while (!RegionManager.isTeleportPermitted(loc) || RegionManager.getObject(loc) != null) {
loc = getRandomLoc(entity); loc = getRandomLoc(entity);
@@ -145,6 +150,7 @@ public class ChaosElementalNPC extends AbstractNPC {
} }
player.teleport(loc); player.teleport(loc);
} else if (attack.getProjectile().getProjectileId() == 551) { } 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) { if (player.getInventory().freeSlots() < 1 || player.getEquipment().itemCount() < 1) {
return; return;
} }
@@ -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<WeightedChanceItem> 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);
}
}
@@ -1,5 +1,7 @@
package core.game.node.entity.npc.familiar; 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.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
@@ -31,6 +33,7 @@ public class ArcticBearNPC extends Familiar {
*/ */
public ArcticBearNPC(Player owner, int id) { public ArcticBearNPC(Player owner, int id) {
super(owner, id, 2800, 12057, 6, WeaponInterface.STYLE_CONTROLLED); super(owner, id, 2800, 12057, 6, WeaponInterface.STYLE_CONTROLLED);
boosts.add(new SkillBonus(Skills.HUNTER, 7));
} }
@Override @Override
@@ -16,6 +16,7 @@ import core.game.world.update.flag.player.FaceLocationFlag;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.plugin.Plugin; import core.plugin.Plugin;
import rs09.plugin.PluginManager; import rs09.plugin.PluginManager;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.firemaking.FireMakingPulse; import core.game.node.entity.skill.firemaking.FireMakingPulse;
import core.game.node.entity.skill.firemaking.Log; import core.game.node.entity.skill.firemaking.Log;
@@ -53,6 +54,7 @@ public class ForgeRegentNPC extends Familiar {
*/ */
public ForgeRegentNPC(Player owner, int id) { public ForgeRegentNPC(Player owner, int id) {
super(owner, id, 4500, 12782, 6, WeaponInterface.STYLE_RANGE_ACCURATE); super(owner, id, 4500, 12782, 6, WeaponInterface.STYLE_RANGE_ACCURATE);
boosts.add(new SkillBonus(Skills.FIREMAKING, 4));
} }
@Override @Override
@@ -30,6 +30,7 @@ public class LavaTitanNPC extends Familiar {
public LavaTitanNPC(Player owner, int id) { public LavaTitanNPC(Player owner, int id) {
super(owner, id, 6100, 12788, 4, WeaponInterface.STYLE_AGGRESSIVE); super(owner, id, 6100, 12788, 4, WeaponInterface.STYLE_AGGRESSIVE);
boosts.add(new SkillBonus(Skills.MINING, 10)); boosts.add(new SkillBonus(Skills.MINING, 10));
boosts.add(new SkillBonus(Skills.FIREMAKING, 10));
} }
@Override @Override
@@ -1,5 +1,6 @@
package core.game.node.entity.npc.familiar; 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.Skills;
import core.game.node.entity.skill.crafting.gem.Gems; import core.game.node.entity.skill.crafting.gem.Gems;
import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.Familiar;
@@ -38,6 +39,7 @@ public class MagpieNPC extends Forager {
*/ */
public MagpieNPC(Player owner, int id) { public MagpieNPC(Player owner, int id) {
super(owner, id, 3400, 12041, 3, ITEMS); super(owner, id, 3400, 12041, 3, ITEMS);
boosts.add(new SkillBonus(Skills.THIEVING, 3));
} }
@Override @Override
@@ -2,6 +2,7 @@ package core.game.node.entity.npc.familiar;
import core.game.node.entity.player.link.diary.DiaryType; import core.game.node.entity.player.link.diary.DiaryType;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting; import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting;
import core.game.node.entity.skill.firemaking.FireMakingPulse; import core.game.node.entity.skill.firemaking.FireMakingPulse;
@@ -53,6 +54,7 @@ public class PyreLordNPC extends Familiar {
*/ */
public PyreLordNPC(Player owner, int id) { public PyreLordNPC(Player owner, int id) {
super(owner, id, 3200, 12816, 6, WeaponInterface.STYLE_AGGRESSIVE); super(owner, id, 3200, 12816, 6, WeaponInterface.STYLE_AGGRESSIVE);
boosts.add(new SkillBonus(Skills.FIREMAKING, 3));
} }
@Override @Override
@@ -1,5 +1,7 @@
package core.game.node.entity.npc.familiar; 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.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
import core.game.node.entity.combat.equipment.WeaponInterface; import core.game.node.entity.combat.equipment.WeaponInterface;
@@ -27,6 +29,7 @@ public class SpiritGraahkNPC extends Familiar {
*/ */
public SpiritGraahkNPC(Player owner, int id) { public SpiritGraahkNPC(Player owner, int id) {
super(owner, id, 4900, 12810, 3, WeaponInterface.STYLE_AGGRESSIVE); super(owner, id, 4900, 12810, 3, WeaponInterface.STYLE_AGGRESSIVE);
boosts.add(new SkillBonus(Skills.HUNTER, 5));
} }
@Override @Override
@@ -1,5 +1,7 @@
package core.game.node.entity.npc.familiar; 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.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
import core.game.node.entity.combat.equipment.WeaponInterface; import core.game.node.entity.combat.equipment.WeaponInterface;
@@ -27,6 +29,7 @@ public class SpiritKyattNPC extends Familiar {
*/ */
public SpiritKyattNPC(Player owner, int id) { public SpiritKyattNPC(Player owner, int id) {
super(owner, id, 4900, 12812, 3, WeaponInterface.STYLE_ACCURATE); super(owner, id, 4900, 12812, 3, WeaponInterface.STYLE_ACCURATE);
boosts.add(new SkillBonus(Skills.HUNTER, 5));
} }
@Override @Override
@@ -1,6 +1,7 @@
package core.game.node.entity.npc.familiar; package core.game.node.entity.npc.familiar;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
@@ -31,6 +32,7 @@ public class SpiritLarupiaNPC extends Familiar {
*/ */
public SpiritLarupiaNPC(Player owner, int id) { public SpiritLarupiaNPC(Player owner, int id) {
super(owner, id, 4900, 12784, 6, WeaponInterface.STYLE_CONTROLLED); super(owner, id, 4900, 12784, 6, WeaponInterface.STYLE_CONTROLLED);
boosts.add(new SkillBonus(Skills.HUNTER, 5));
} }
@Override @Override
@@ -2,6 +2,7 @@ package core.game.node.entity.npc.familiar;
import core.cache.def.impl.NPCDefinition; import core.cache.def.impl.NPCDefinition;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
@@ -97,6 +98,7 @@ public final class VoidFamiliarNPC implements Plugin<Object> {
*/ */
public VoidRavagerNPC(Player owner, int id) { public VoidRavagerNPC(Player owner, int id) {
super(owner, id, 2700, 12818, 3, WeaponInterface.STYLE_AGGRESSIVE, ITEMS); super(owner, id, 2700, 12818, 3, WeaponInterface.STYLE_AGGRESSIVE, ITEMS);
boosts.add(new SkillBonus(Skills.MINING, 1));
} }
@Override @Override
@@ -1,6 +1,7 @@
package core.game.node.entity.npc.familiar; package core.game.node.entity.npc.familiar;
import core.plugin.Initializable; import core.plugin.Initializable;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.summoning.familiar.Familiar; import core.game.node.entity.skill.summoning.familiar.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
@@ -30,6 +31,7 @@ public class WolpertingerNPC extends Familiar {
*/ */
public WolpertingerNPC(Player owner, int id) { public WolpertingerNPC(Player owner, int id) {
super(owner, id, 6200, 12089, 1, WeaponInterface.STYLE_CAST); super(owner, id, 6200, 12089, 1, WeaponInterface.STYLE_CAST);
boosts.add(new SkillBonus(Skills.HUNTER, 5));
} }
@Override @Override
@@ -16,7 +16,7 @@ public enum BuildHotspot {
/** /**
* Low level garden hotspots. * 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), 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), 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), BIG_PLANT_1(15364, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.FERN, Decoration.BUSH, Decoration.TALL_PLANT),
@@ -85,21 +85,21 @@ public final class BuildingUtils {
int c261Value = 0; int c261Value = 0;
for (int i = 0; i < 7; i++) { for (int menuIndex = 0; menuIndex < 7; menuIndex++) {
int itemsStringOffset = 97 + (i * 5); int itemsStringOffset = 97 + (menuIndex * 5);
//97 + //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++) { for (int j = 0; j < 5; j++) {
player.getPacketDispatch().sendString("", 396, itemsStringOffset + j); player.getPacketDispatch().sendString("", 396, itemsStringOffset + j);
} }
player.getPacketDispatch().sendString("", 396, 140 + i); player.getPacketDispatch().sendString("", 396, 140 + menuIndex);
c261Value += (1 << (i + 1)); c261Value += (1 << (menuIndex + 1));
continue; continue;
} }
Decoration decoration = hotspot.getDecorations()[i]; Decoration decoration = hotspot.getDecorations()[menuIndex];
items[BUILD_INDEXES[i]] = new Item(decoration.getInterfaceItem()); items[BUILD_INDEXES[menuIndex]] = new Item(decoration.getInterfaceItem());
player.getPacketDispatch().sendString(ItemDefinition.forId(decoration.getInterfaceItem()).getName(), 396, itemsStringOffset); player.getPacketDispatch().sendString(ItemDefinition.forId(decoration.getInterfaceItem()).getName(), 396, itemsStringOffset);
boolean hasRequirements = player.getSkills().getLevel(Skills.CONSTRUCTION) >= decoration.getLevel(); boolean hasRequirements = player.getSkills().getLevel(Skills.CONSTRUCTION) >= decoration.getLevel();
for (int j = 0; j < 4; j++) { for (int j = 0; j < 4; j++) {
@@ -127,14 +127,16 @@ public final class BuildingUtils {
continue; continue;
}*/ }*/
player.getPacketDispatch().sendString(s, 396, (itemsStringOffset + 1) + j); player.getPacketDispatch().sendString(s, 396, (itemsStringOffset + 1) + j);
if (hasRequirements)
c261Value += (1 << (i + 1));
} }
} }
player.getConfigManager().set(1485 + i, hasRequirements || player.isStaff() ? 1 : 0); if (hasRequirements) {
player.getPacketDispatch().sendString("Lvl " + decoration.getLevel(), 396, 140 + i); 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); //player.getPacketDispatch().sendItemZoomOnInterface(items[i].protocol(), 50000, 396, 49 + i);
} }
System.out.println(c261Value);
player.getConfigManager().set(261, c261Value); player.getConfigManager().set(261, c261Value);
PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 396, 132, 8, items, false)); PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 396, 132, 8, items, false));
} }
@@ -21,6 +21,7 @@ public enum Decoration {
ROCK(13406, 8169, 5, 100.0, new Item(3420, 5)), ROCK(13406, 8169, 5, 100.0, new Item(3420, 5)),
POND(13407, 8170, 10, 100.0, new Item(1761, 10)), 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)), 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)), DUNGEON_ENTRANCE(13409, 8172, 70, 500.0, new Item(8786)),
@@ -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), 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), 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), 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), 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<String,FishingOption> nameMap = new HashMap<>(); public static final HashMap<String,FishingOption> nameMap = new HashMap<>();
static{ static{
for(FishingOption option : FishingOption.values()){ for(FishingOption option : FishingOption.values()){
nameMap.putIfAbsent(option.name,option); nameMap.putIfAbsent(option.name,option);
@@ -79,18 +82,13 @@ public enum FishingOption {
* @param animation The animation. * @param animation The animation.
* @param fish The fish to catch. * @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.tool = tool;
this.level = level; this.level = level;
this.animation = animation; this.animation = animation;
this.bait = bait; this.bait = bait;
this.name = name; this.name = name;
Arrays.sort(fish, new Comparator<Fish>() { Arrays.sort(fish, (x, y) -> y.getLevel() - x.getLevel());
@Override
public int compare(Fish x, Fish y) {
return y.getLevel() - x.getLevel();
}
});
this.fish = fish; this.fish = fish;
} }
@@ -8,25 +8,25 @@ import java.util.HashMap;
*/ */
public enum FishingSpot { 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), 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), 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), 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), 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_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<Integer,FishingSpot> spotMap = new HashMap<>(); public static HashMap<Integer,FishingSpot> spotMap = new HashMap<>();
static{ static{
FishingSpot[] spots = values(); FishingSpot[] spots = values();
int spotsLength = spots.length; for (FishingSpot spot : spots) {
for (int x = 0; x < spotsLength; x++) {
FishingSpot spot = spots[x];
int[] spotIds = spot.ids; int[] spotIds = spot.ids;
int spotIdsLength = spotIds.length; for (int spotId : spotIds) {
for (int y = 0; y < spotIdsLength; y++) { spotMap.putIfAbsent(spotId, spot);
spotMap.putIfAbsent(spotIds[y],spot);
} }
} }
} }
@@ -50,7 +50,7 @@ public enum FishingSpot {
* Constructs a new {@code FishingSpot} {@code Object}. * Constructs a new {@code FishingSpot} {@code Object}.
* @param ids The NPC ids. * @param ids The NPC ids.
*/ */
private FishingSpot(int[] ids, FishingOption... options) { FishingSpot(int[] ids, FishingOption... options) {
this.ids = ids; this.ids = ids;
this.options = options; this.options = options;
} }
@@ -40,7 +40,7 @@ public class StringPulse extends SkillPulse<Item> {
@Override @Override
public boolean checkRequirements() { public boolean checkRequirements() {
if (getDelay() == 1) { if (getDelay() == 1) {
setDelay(bow.string == 1777 ? 9 : 7); setDelay(bow.string == 1777 ? 2 : 1);
} }
if (player.getSkills().getLevel(Skills.FLETCHING) < bow.level) { if (player.getSkills().getLevel(Skills.FLETCHING) < bow.level) {
player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + bow.level + " to string this bow."); player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + bow.level + " to string this bow.");
@@ -180,6 +180,11 @@ public final class PotionDecantingPlugin extends UseWithHandler {
if (flagged(itemDose, otherDose)) { if (flagged(itemDose, otherDose)) {
return false; return false;
} }
if (item.getId() == item.getNoteChange() || other.getId() == item.getNoteChange()) {
return false;
}
final int[] newDoses = getDoses(itemDose, otherDose); final int[] newDoses = getDoses(itemDose, otherDose);
if (itemDose == 4 && otherDose == 0 || otherDose == 4 && itemDose == 0) { if (itemDose == 4 && otherDose == 0 || otherDose == 4 && itemDose == 0) {
player.getInventory().replace(getItem(item.getName().contains("Vial") ? otherName : itemName, newDoses[1]), item.getSlot()); player.getInventory().replace(getItem(item.getName().contains("Vial") ? otherName : itemName, newDoses[1]), item.getSlot());
@@ -7,7 +7,25 @@ import core.game.node.item.Item;
* @author 'Vexia * @author 'Vexia
*/ */
public enum UnfinishedPotion { 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. * Represents the base item.
@@ -16,6 +16,7 @@ import core.game.world.map.Location;
import core.game.world.map.zone.MapZone; import core.game.world.map.zone.MapZone;
import core.game.world.map.zone.ZoneBorders; import core.game.world.map.zone.ZoneBorders;
import core.game.world.map.zone.ZoneBuilder; import core.game.world.map.zone.ZoneBuilder;
import core.game.world.map.zone.ZoneRestriction;
import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Animation;
import core.plugin.Plugin; import core.plugin.Plugin;
import core.tools.RandomFunction; import core.tools.RandomFunction;
@@ -31,7 +32,7 @@ public final class FremennikDungeon extends MapZone implements Plugin<Object> {
* Constructs a new {@code FremennikDungeon} {@code Object}. * Constructs a new {@code FremennikDungeon} {@code Object}.
*/ */
public FremennikDungeon() { public FremennikDungeon() {
super("fremennik", true); super("fremennik", true, ZoneRestriction.CANNON);
} }
@Override @Override
@@ -256,8 +256,8 @@ public final class WildernessZone extends MapZone {
p.getAppearance().sync(); p.getAppearance().sync();
} else if (e instanceof NPC) { } else if (e instanceof NPC) {
NPC n = (NPC) e; NPC n = (NPC) e;
if (n.getDefinition().hasAttackOption()) { if (n.getDefinition().hasAttackOption() && n.isAggressive()) {
n.setAggressive(true); //n.setAggressive(true);
n.setAggressiveHandler(new AggressiveHandler(n, AggressiveBehavior.WILDERNESS)); n.setAggressiveHandler(new AggressiveHandler(n, AggressiveBehavior.WILDERNESS));
} }
} }
@@ -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<IntArray>.toIntArray() : IntArray {
val list = ArrayList<Int>()
this.forEach { arr -> arr.forEach { list.add(it) } }
return list.toIntArray()
}
+69
View File
@@ -3,6 +3,8 @@ package api
import core.cache.def.impl.ItemDefinition import core.cache.def.impl.ItemDefinition
import core.cache.def.impl.SceneryDefinition import core.cache.def.impl.SceneryDefinition
import core.game.component.Component 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.dialogue.FacialExpression
import core.game.content.global.action.SpecialLadders import core.game.content.global.action.SpecialLadders
import core.game.node.Node 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.audio.Audio
import core.game.node.entity.player.link.emote.Emotes import core.game.node.entity.player.link.emote.Emotes
import core.game.node.entity.player.link.quest.QuestRepository 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.entity.skill.gather.SkillingTool
import core.game.node.item.GroundItem import core.game.node.item.GroundItem
import core.game.node.item.GroundItemManager 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.chunk.AnimateObjectUpdateFlag
import core.game.world.update.flag.context.Animation import core.game.world.update.flag.context.Animation
import core.game.world.update.flag.context.Graphics import core.game.world.update.flag.context.Graphics
import core.plugin.Plugin
import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.DialogueFile
import rs09.game.content.dialogue.SkillDialogueHandler import rs09.game.content.dialogue.SkillDialogueHandler
import rs09.game.content.global.GlobalKillCounter; import rs09.game.content.global.GlobalKillCounter;
@@ -146,6 +150,18 @@ fun <T> 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 * Add an item to the given player's given container
* @param player the player whose container to modify * @param player the player whose container to modify
@@ -1345,3 +1361,56 @@ fun announceIfRare(player: Player, item: Item) {
GlobalKillCounter.incrementRareDrop(player, 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<String> {
val SKILL_LIST = Skills.SKILL_NAME
val hasMastered = player.getSkills().masteredSkills > 0
val MASTERED_SKILLS = mutableListOf<String>()
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()
}
+13 -3
View File
@@ -3,9 +3,7 @@ package rs09
import core.game.system.SystemShutdownHook import core.game.system.SystemShutdownHook
import core.game.world.map.Location import core.game.world.map.Location
import core.tools.mysql.Database import core.tools.mysql.Database
import org.json.simple.JSONObject
import rs09.tools.secondsToTicks import rs09.tools.secondsToTicks
import java.io.File
import java.math.BigInteger import java.math.BigInteger
/** /**
@@ -62,6 +60,9 @@ class ServerConstants {
@JvmField @JvmField
var BOT_DATA_PATH: String? = null var BOT_DATA_PATH: String? = null
@JvmField
var CELEDT_DATA_PATH: String? = null
//the max number of players. //the max number of players.
@JvmField @JvmField
var MAX_PLAYERS = 2000 var MAX_PLAYERS = 2000
@@ -157,7 +158,16 @@ class ServerConstants {
arrayOf(Location.create(3169, 3034, 0), "bedabin"), arrayOf(Location.create(3169, 3034, 0), "bedabin"),
arrayOf(Location.create(3565, 3289, 0), "barrows"), arrayOf(Location.create(3565, 3289, 0), "barrows"),
arrayOf(Location.create(3016, 3513, 0), "bkf", "black knights fortress"), arrayOf(Location.create(3016, 3513, 0), "bkf", "black knights fortress"),
arrayOf(Location.create(3052, 3481, 0), "monastery") 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 @JvmField
@@ -428,6 +428,9 @@ class Adventurer(val style: CombatStyle): Script() {
var lineAlt = "" var lineAlt = ""
when { when {
//Celebrates Halloween!
dateCode == 1031 -> lineAlt = dialogue.getLines("halloween").rand()
//Celebrates lead up to Christmas! //Celebrates lead up to Christmas!
until in 2..23 -> lineAlt = dialogue.getLines("approaching_christmas").rand() until in 2..23 -> lineAlt = dialogue.getLines("approaching_christmas").rand()
@@ -5,6 +5,7 @@ import core.game.world.map.zone.ZoneRestriction
import core.tools.RandomFunction import core.tools.RandomFunction
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld import rs09.game.world.GameWorld
import kotlin.random.Random
private const val AVG_DELAY_TICKS = 6000 // 60 minutes private const val AVG_DELAY_TICKS = 6000 // 60 minutes
private const val MIN_DELAY_TICKS = AVG_DELAY_TICKS / 2 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) { class RandomEventManager(val player: Player) {
var event: RandomEventNPC? = null var event: RandomEventNPC? = null
var nextSpawn = 0 var nextSpawn = 0
val skills = arrayOf("WoodcuttingSkillPulse","FishingPulse","MiningSkillPulse","BoneBuryingOptionPlugin")
fun tick() { fun tick() {
if (player.isArtificial) return if (player.isArtificial) return
@@ -23,7 +25,26 @@ class RandomEventManager(val player: Player) {
nextSpawn = GameWorld.ticks + 3000 nextSpawn = GameWorld.ticks + 3000
return 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) event = ame.npc.create(player,ame.loot,ame.type)
if (event!!.spawnLocation == null) { if (event!!.spawnLocation == null) {
nextSpawn = GameWorld.ticks + 3000 nextSpawn = GameWorld.ticks + 3000
@@ -1,18 +1,16 @@
package rs09.game.content.ame package rs09.game.content.ame
import api.* import api.poofClear
import core.game.interaction.MovementPulse import core.game.interaction.MovementPulse
import core.game.node.entity.npc.NPC import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.item.Item import core.game.node.item.Item
import core.game.system.task.Pulse
import core.game.world.map.Location import core.game.world.map.Location
import core.game.world.map.RegionManager import core.game.world.map.RegionManager
import core.game.world.map.path.Pathfinder import core.game.world.map.path.Pathfinder
import core.game.world.update.flag.context.Graphics import core.game.world.update.flag.context.Graphics
import rs09.game.content.ame.events.MysteriousOldManNPC import rs09.game.content.ame.events.MysteriousOldManNPC
import rs09.game.content.global.WeightBasedTable import rs09.game.content.global.WeightBasedTable
import rs09.game.world.GameWorld.Pulser
import rs09.tools.secondsToTicks import rs09.tools.secondsToTicks
import kotlin.random.Random import kotlin.random.Random
import kotlin.reflect.full.createInstance import kotlin.reflect.full.createInstance
@@ -23,66 +21,78 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
var spawnLocation: Location? = null var spawnLocation: Location? = null
val SMOKE_GRAPHICS = Graphics(86) val SMOKE_GRAPHICS = Graphics(86)
var initialized = false 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() val event = this::class.createInstance()
if(event is MysteriousOldManNPC) event.type = type if (event is MysteriousOldManNPC) event.type = type
event.loot = loot event.loot = loot
event.player = player event.player = player
event.spawnLocation = RegionManager.getSpawnLocation(player,this) event.spawnLocation = RegionManager.getSpawnLocation(player, this)
return event return event
} }
open fun terminate(){ open fun terminate() {
finalized = true
pulseManager.clear("amemovement")
player.antiMacroHandler.event = null player.antiMacroHandler.event = null
if(initialized){ if (initialized) {
poofClear(this) poofClear(this)
} }
} }
open fun follow(){ open fun follow() {
pulseManager.run(object : MovementPulse(this,player, Pathfinder.DUMB){ pulseManager.run((object : MovementPulse(this, player, Pathfinder.DUMB) {
override fun pulse(): Boolean { override fun pulse(): Boolean {
face(player) face(player)
return false return false
} }
}) }), "amemovement")
} }
override fun tick() { override fun tick() {
super.tick() super.tick()
if (!player.getAttribute("random:pause", false)) {
ticksLeft-- ticksLeft--
if(!pulseManager.hasPulseRunning()) follow() }
if(!player.isActive || !player.location.withinDistance(location,10)){
if (!pulseManager.hasPulseRunning() && !finalized) {
follow()
}
if (!player.isActive || !player.location.withinDistance(location, 10)) {
terminate() terminate()
} }
if(ticksLeft <= 0){ if (ticksLeft <= 0 && initialized) {
onTimeUp() onTimeUp()
initialized = false
} }
} }
override fun init() { override fun init() {
initialized = true initialized = true
finalized = false
timerPaused = false
spawnLocation ?: terminate() spawnLocation ?: terminate()
location = spawnLocation location = spawnLocation
super.init() super.init()
} }
open fun onTimeUp(){ open fun onTimeUp() {
noteAndTeleport() noteAndTeleport()
terminate() terminate()
} }
fun noteAndTeleport(){ fun noteAndTeleport() {
for(item in player.inventory.toArray()){ for (item in player.inventory.toArray()) {
if(item == null) continue if (item == null) continue
if(item.noteChange != item.id){ if (item.noteChange != item.id) {
player.inventory.remove(item) 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) player.properties.teleportLocation = Location.create(3197, 3223, 0)
} else { } else {
player.properties.teleportLocation = Location.create(3212, 9620, 0) player.properties.teleportLocation = Location.create(3212, 9620, 0)
@@ -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.certer.CerterNPC
import rs09.game.content.ame.events.drilldemon.SeargentDamienNPC import rs09.game.content.ame.events.drilldemon.SeargentDamienNPC
import rs09.game.content.ame.events.evilchicken.EvilChickenNPC 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.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.WeightBasedTable
import rs09.game.content.global.WeightedItem import rs09.game.content.global.WeightedItem
@@ -14,25 +20,30 @@ enum class RandomEvents(val npc: RandomEventNPC, val loot: WeightBasedTable? = n
SANDWICH_LADY(SandwichLadyRENPC()), SANDWICH_LADY(SandwichLadyRENPC()),
GENIE(GenieNPC()), GENIE(GenieNPC()),
CERTER(CerterNPC(),WeightBasedTable.create( CERTER(CerterNPC(),WeightBasedTable.create(
WeightedItem(Items.COINS_995,1,100,2.0), WeightedItem(Items.UNCUT_SAPPHIRE_1623,1,1,3.4),
WeightedItem(Items.SPINACH_ROLL_1969,1,1,2.0), WeightedItem(Items.KEBAB_1971,1,1,1.7),
WeightedItem(Items.KEBAB_1971,1,1,2.0), WeightedItem(Items.UNCUT_EMERALD_1621,1,1,1.7),
WeightedItem(Items.UNCUT_SAPPHIRE_1623,1,1,0.5), WeightedItem(Items.SPINACH_ROLL_1969,1,1,1.5),
WeightedItem(Items.SAPPHIRE_1607,1,1,0.5), WeightedItem(Items.COINS_995,80,80,1.1),
WeightedItem(Items.UNCUT_EMERALD_1621,1,1,0.25), WeightedItem(Items.COINS_995,160,160,1.1),
WeightedItem(Items.EMERALD_1605,1,1,0.25), WeightedItem(Items.COINS_995,320,320,1.1),
WeightedItem(Items.UNCUT_RUBY_1619,1,1,0.15), WeightedItem(Items.COINS_995,480,480,1.1),
WeightedItem(Items.RUBY_1603,1,1,0.15), WeightedItem(Items.COINS_995,640,640,1.1),
WeightedItem(Items.DIAMOND_1601,1,1,0.1), WeightedItem(Items.UNCUT_RUBY_1619,1,1,0.86),
WeightedItem(Items.UNCUT_DIAMOND_1617,1,1,0.1), WeightedItem(Items.COINS_995,240,240,0.65),
WeightedItem(Items.COSMIC_TALISMAN_1454,1,1,0.15), WeightedItem(Items.COSMIC_TALISMAN_1454,1,1,0.43),
WeightedItem(Items.NATURE_TALISMAN_1462,1,1,0.15), WeightedItem(Items.UNCUT_DIAMOND_1617,1,1,0.22),
WeightedItem(Items.TOOTH_HALF_OF_A_KEY_985,1,1,1.0), WeightedItem(Items.TOOTH_HALF_OF_A_KEY_985,1,1,0.1),
WeightedItem(Items.LOOP_HALF_OF_A_KEY_987,1,1,1.0) WeightedItem(Items.LOOP_HALF_OF_A_KEY_987,1,1,0.1)
)), )),
DRILL_DEMON(SeargentDamienNPC()), DRILL_DEMON(SeargentDamienNPC()),
EVIL_CHICKEN(EvilChickenNPC()), 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 = "" var type: String = ""
private set private set
@@ -45,4 +56,5 @@ enum class RandomEvents(val npc: RandomEventNPC, val loot: WeightBasedTable? = n
@JvmField @JvmField
val randomIDs = values().map { it.npc.id }.toList() val randomIDs = values().map { it.npc.id }.toList()
} }
} }
@@ -1,33 +1,58 @@
package rs09.game.content.ame.events.certer package rs09.game.content.ame.events.certer
import api.* import api.addItemOrDrop
import core.game.component.Component 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.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE import rs09.tools.END_DIALOGUE
class CerterDialogue(val initial: Boolean) : DialogueFile() { class CerterDialogue(val initial: Boolean) : DialogueFile() {
val CERTER_INTERFACE = 184 val CERTER_INTERFACE = 184
override fun handle(componentID: Int, buttonID: Int) { override fun handle(componentID: Int, buttonID: Int) {
if(initial){ if (initial && !player!!.getAttribute("certer:reward", false)) {
when(stage){ when (stage) {
0 -> npc("Ah, hello, ${player!!.username.capitalize()}. Could you","please help me identify this?").also { stage++ } 0 -> npc("Ah, hello, ${player!!.username.capitalize()}. Could you", "please help me identify this?").also { stage++ }
1 -> { 1 -> {
end() end()
player!!.interfaceManager.open(Component(CERTER_INTERFACE)) player!!.interfaceManager.open(Component(CERTER_INTERFACE))
} }
} }
} else { } else {
val isCorrect = player!!.getAttribute("certer:correct",false) player!!.setAttribute("random:pause", true)
when(stage){ val isCorrect = player!!.getAttribute("certer:correct", false)
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++ } val receivedReward = player!!.getAttribute("certer:reward", false)
1 -> { if (receivedReward == true) {
npc("Please, take this as a thanks.") stage = 1
player!!.antiMacroHandler.event?.loot!!.roll().forEach { addItemOrDrop(player!!, it.id, it.amount) } }
player!!.antiMacroHandler.event?.terminate() when (stage) {
0 -> if (!isCorrect) {
npc("Sorry, I don't think so.").also {
player!!.setAttribute("certer:reward", true)
stage = END_DIALOGUE 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)
}
}
} }
@@ -1,6 +1,7 @@
package rs09.game.content.ame.events.certer package rs09.game.content.ame.events.certer
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.node.item.Item
import org.rs09.consts.Items import org.rs09.consts.Items
import rs09.game.interaction.InterfaceListener import rs09.game.interaction.InterfaceListener
@@ -11,51 +12,69 @@ class CerterEventInterface : InterfaceListener() {
val OPTION_C_CHILD = 3 val OPTION_C_CHILD = 3
val ITEM_CHILD = 7 val ITEM_CHILD = 7
val items = mapOf( val items = mapOf(
Items.BLACK_SWORD_1283 to "a sword", /*
Items.BRONZE_SWORD_1277 to "a sword", * NOTE: We use these "NULL" items to get their model id + zoom values.
Items.BRONZE_CHAINBODY_1103 to "a platebody", * These were the actual items used by this random event before they
Items.BLACK_CHAINBODY_1107 to "a platebody", * decided to swap over to using model ids instead.
Items.WOODEN_SHIELD_1171 to "a shield", */
Items.BRONZE_KITESHIELD_1189 to "a shield", 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() { override fun defineListeners() {
on(CERTER_INTERFACE){player, _, _, buttonID, _, _ -> on(CERTER_INTERFACE) { player, _, _, buttonID, _, _ ->
val answer = buttonID - 7 val answer = buttonID - 7
val correctAnswer = player.getAttribute("certer:correctIndex",0) val correctAnswer = player.getAttribute("certer:correctIndex", 0)
player.setAttribute("certer:correct",correctAnswer == answer) player.setAttribute("certer:correct", correctAnswer == answer)
player.interfaceManager.close() player.interfaceManager.close()
player.dialogueInterpreter.open(CerterDialogue(false),player.antiMacroHandler.event?.asNpc()) player.dialogueInterpreter.open(CerterDialogue(false), player.antiMacroHandler.event?.asNpc())
return@on true return@on true
} }
onOpen(CERTER_INTERFACE){player, _ -> onOpen(CERTER_INTERFACE) { player, _ ->
generateOptions(player) generateOptions(player)
return@onOpen true return@onOpen true
} }
onClose(CERTER_INTERFACE) { player, _ ->
player.setAttribute("random:pause", false)
return@onClose true
}
} }
fun generateOptions(player: Player) { fun generateOptions(player: Player) {
val correct = items.keys.random() val correct = items.keys.random()
val indexes = arrayListOf(1,2,3) val indexes = arrayListOf(1, 2, 3)
val correctIndex = indexes.random() val correctIndex = indexes.random()
val correctItem = Item(correct).definition
val iFaceModelId = correctItem.interfaceModelId
val iFaceZoom = correctItem.modelZoom
indexes.remove(correctIndex) 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 tempOptions = falseOptions.toMutableList()
val false1 = tempOptions.random() val false1 = tempOptions.random()
tempOptions.remove(false1) tempOptions.remove(false1)
var false2 = tempOptions.random() val false2 = tempOptions.random()
player.packetDispatch.sendString(false1,CERTER_INTERFACE,optionFromIndex(indexes[0])) player.packetDispatch.sendString(false1, CERTER_INTERFACE, optionFromIndex(indexes[0]))
player.packetDispatch.sendString(false2,CERTER_INTERFACE,optionFromIndex(indexes[1])) player.packetDispatch.sendString(false2, CERTER_INTERFACE, optionFromIndex(indexes[1]))
player.packetDispatch.sendItemOnInterface(correct,1,CERTER_INTERFACE,ITEM_CHILD) player.packetDispatch.sendModelOnInterface(iFaceModelId, CERTER_INTERFACE, ITEM_CHILD, iFaceZoom)
} }
fun optionFromIndex(index: Int): Int{ fun optionFromIndex(index: Int): Int {
return when(index){ return when (index) {
1 -> OPTION_A_CHILD 1 -> OPTION_A_CHILD
2 -> OPTION_B_CHILD 2 -> OPTION_B_CHILD
3 -> OPTION_C_CHILD 3 -> OPTION_C_CHILD
@@ -1,23 +1,49 @@
package rs09.game.content.ame.events.certer package rs09.game.content.ame.events.certer
import core.game.node.entity.npc.NPC import core.game.node.entity.npc.NPC
import core.game.node.entity.player.link.emote.Emotes
import core.tools.RandomFunction import core.tools.RandomFunction
import org.rs09.consts.NPCs import org.rs09.consts.NPCs
import rs09.game.content.ame.RandomEventNPC import rs09.game.content.ame.RandomEventNPC
import rs09.game.content.global.WeightBasedTable import rs09.game.content.global.WeightBasedTable
class CerterNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.GILES_2538) { class CerterNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.GILES_2538) {
lateinit var pName: String
lateinit var phrases: Array<String>
override fun tick() { 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() super.tick()
if(RandomFunction.random(1,10) == 5) sendChat(player.username.capitalize() + "! I need your assistance.")
} }
override fun talkTo(npc: NPC) { override fun talkTo(npc: NPC) {
player.setAttribute("random:pause", true)
player.dialogueInterpreter.open(CerterDialogue(true),npc) player.dialogueInterpreter.open(CerterDialogue(true),npc)
} }
override fun init() { override fun init() {
super.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)
} }
} }
@@ -1,5 +1,6 @@
package rs09.game.content.ame.events.evilchicken package rs09.game.content.ame.events.evilchicken
import api.getWorldTicks
import core.game.node.entity.Entity import core.game.node.entity.Entity
import core.game.node.entity.npc.NPC import core.game.node.entity.npc.NPC
import core.game.node.item.GroundItemManager import core.game.node.item.GroundItemManager
@@ -12,15 +13,16 @@ import rs09.game.content.global.WeightBasedTable
val ids = 2463..2468 val ids = 2463..2468
class EvilChickenNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(2463) { 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 talkTo(npc: NPC) {}
override fun init() { override fun init() {
super.init() super.init()
val index = (player.properties.combatLevel / 20) - 1 val index = (player.properties.combatLevel / 20) - 1
val id = ids.toList()[index] val id = ids.toList()[index]
this.transform(id) this.transform(id)
this.attack(player) this.attack(player)
sendChat(phrases.random().replace("@name",player.name.capitalize()))
this.isRespawn = false this.isRespawn = false
} }
@@ -30,6 +32,12 @@ class EvilChickenNPC(override var loot: WeightBasedTable? = null) : RandomEventN
} }
override fun tick() { 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() super.tick()
if(!player.viewport.currentPlane.npcs.contains(this)) this.clear() if(!player.viewport.currentPlane.npcs.contains(this)) this.clear()
} }
@@ -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()
}
}
@@ -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()
}
}
@@ -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()
}
}
@@ -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()
}
}
@@ -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()
}
}
@@ -1,5 +1,6 @@
package rs09.game.content.dialogue package rs09.game.content.dialogue
import api.*
import core.game.container.Container import core.game.container.Container
import core.game.container.impl.EquipmentContainer import core.game.container.impl.EquipmentContainer
import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.DialoguePlugin
@@ -32,14 +33,14 @@ class DumpContainer(player: Player? = null) : DialoguePlugin(player) {
if (player.inventory.isEmpty) { if (player.inventory.isEmpty) {
player.packetDispatch.sendMessage("You have nothing in your inventory to deposit.") player.packetDispatch.sendMessage("You have nothing in your inventory to deposit.")
} else { } else {
dump(player.inventory) dumpContainer(player, player.inventory)
} }
} }
2 -> { 2 -> {
if (player.equipment.isEmpty) { if (player.equipment.isEmpty) {
player.packetDispatch.sendMessage("You have no equipment to deposit.") player.packetDispatch.sendMessage("You have no equipment to deposit.")
} else { } else {
dump(player.equipment) dumpContainer(player, player.equipment)
} }
} }
3 -> { 3 -> {
@@ -55,35 +56,4 @@ class DumpContainer(player: Player? = null) : DialoguePlugin(player) {
override fun getIds(): IntArray { override fun getIds(): IntArray {
return intArrayOf(ID) 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()
}
} }
@@ -1,5 +1,6 @@
package core.game.content.dialogue 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.npc.NPC
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.plugin.Initializable import core.plugin.Initializable
@@ -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)
}
}
@@ -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)
}
}
@@ -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()
}
}
}
@@ -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.DialoguePlugin
import core.game.content.dialogue.FacialExpression import core.game.content.dialogue.FacialExpression
@@ -16,7 +16,7 @@ class AberabDialogue(player: Player? = null) : DialoguePlugin(player){
override fun open(vararg args: Any?): Boolean { override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC 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 stage = 99
return true return true
} }
@@ -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)
}
}
@@ -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)
}
}
@@ -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)
}
}
@@ -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)
}
}
@@ -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)
}
}
@@ -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)
}
}
@@ -1,4 +1,4 @@
package rs09.game.content.dialogue package rs09.game.content.dialogue.region.barbarianassault
import api.* import api.*
import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.DialoguePlugin

Some files were not shown because too many files have changed in this diff Show More