The Fremmenik Trials quest has been completed, now accesible in-game

Barrows prayer drain timer standardized to 18 seconds

Giant Mole's Burrow mechanic corrected in functionality. Burrow: When the mole's health is between 5-50%, there is a 25% chance for any incoming attack to cause it to burrow away into another location. There is also a chance that the dirt she digs while burrowing to escape can extinguish the player's light source (shown with dirt splatters on the player's screen), though covered light sources will be unaffected by this.

Mole Lair's unique music track now correctly plays across the entirety of the Mole Lair region

Giant Mole droptable corrected. Egregious RSPS noted secondary drops removed. G. Mole can now correctly drop random Hard Clues, and the 100 Iron Ore (noted) drop has been added.

Hostile Random Events return! Tree Spirit, River Troll, Rock Golem, Shade, and Zombie Hostile Random Events rejoin the Evil Chicken in their AFK-anihilation onslaught! Beware!

Mounted Glories now have full right-click Teleport options

You can now build an Obelisk inside your POH at 41 Construction, as the centrepiece spot inside a standard Garden room

Can now trade in Long and Curved bones to Barlak in the Dorgeshuun Mine (temporary location for now) for Construction EXP (after completion of The Lost Tribe)

Ridiculous amounts of funky fresh new NPC dialogues by Q in the following areas: LLetya, Isafdar, Ardougne, Witchaven, Ape Atoll, Miscellania, Dorgeshuun, Zanaris and many many many more!

Potion decanting note bug should now be fixed and not eat up all your notes when attempting to decant

Weapon Poison addition and removal fixes

All currently functional Summoning familiars with invisible skills boosts are now correctly added to the game! Pyrelord, Forge Regent, Arctic Bear, Lava Titan, Magpie, Spirit Graahk, Spirit Larupia, Spirit Kyatt, Void Ravager and Wolpertinger now boost skills alongside their other helpful abilities.

The Mining Guild can now be entered under 60 Mining via the use of skill boosts

The Lady of the Lake will now finally enhance Excalibur for you if you have the prerequisite Seers Hard Diary and Merlin's Crystal completed, and the headband and sword equipped when talking to her.

Can now fish slimy eels

Restored the removed/regressed/whatever Bot Dialogues!

All Ancient Warriors' Equipment (Vesta, Zuriel etc) is now correctly tradeable and droppable in its un-degraded form

Some hat clipping fixes

Fixed blanket Wilderness aggression forcing even non-aggressive monsters to be aggressive

Fremennik helmets (eg: archers, warriors, etc) now locked behind Fremennik Trials Quest

Added the following SFX:
giant mole combat sfx
water elemental combat sfx
fire elemental combat sfx
earth elemental combat sfx
air elemental combat sfx
baby blue dragon combat sfx
baby red dragon combat sfx + examine
baby black dragon combat sfx
black demon combat sfx
dark beast combat sfx
dust devil combat sfx
gargoyle combat sfx
fire giant combat sfx
moss giant combat sfx
hill giant combat sfx
nechryael combat sfx
turoth combat sfx
kurask combat sfx
wallasalki combat sfx
yak combat sfx
abyssal demon combat sfx
bloodveld combat sfx
cave crawler combat sfx
Digging with spade SFX added
abyssal leech combat sfx
abyssal walker combat sfx
void brawler combat sfx (pest control)
chaos elemental standard combat sfx (NOT spells)
cockatrice combat sfx
crawling hand combat sfx
crocodile combat sfx
void defiler combat sfx (pest control)
lesser demon champion combat sfx
elf warrior combat sfx
ghoul combat sfx
ghoul champion combat sfx
jelly combat sfx
pyrefiend combat sfx
void ravager combat sfx (pest control)
rock lobster combat sfx
rockslug combat sfx
void shifter combat sfx (pest control)
void spinner combat sfx (pest control)
void splatter combat sfx (pest control)
void torcher combat sfx (pest control)
starlight combat sfx (GWD: Saradomin Melee Minion)
growler combat sfx (GWD: Saradomin Mage Minion)
Picking herb/harvesting crop SFX added
Planting a seed with seed dibber SFX added
Digging up patch with a Spade SFX added
Raking a patch SFX added
Watering a farming patch with a Watering can SFX added
Using a Plant Cure on a diseased patch SFX added
Pouring Compost/Supercompost on a farming patch SFX added
Filling Compost Bin SFX added
Opening and closing the Compost Bin SFX added
Filling buckets with Compost from the Compost Bin SFX added
Chaos Elemental's three unique spells (Discord, Madness, and Confusion) now have correct impact sfx when hitting the player

Standard Seed Bird's Nest loot pool corrections

Ring Bird's Nest loot pool corrected

Wyson Bird's Nest loot pool corrected

Wyson Bird's Nest loot quantities corrected

Fixed tick delay on Fletching bows and crossbows

Chaos Elemental Drop Table Overhaul

Chaos Elemental's Main drop table has been overhauled to correct items, amounts, and (close-enough) weights

Chaos Elemental's Minor drop table added, using Item ID 799 as an item container

Chaos Elemental now correctly rolls 1 minor drop and 1 major drop from its minor/major loot tables when it is killed.

Restrict Dwarven Multicannon use inside Fremennik Slayer Cave
This commit is contained in:
skelsoft
2022-01-30 08:09:53 +11:00
committed by ryannathans
parent caa73ad046
commit 7968367e14
249 changed files with 13704 additions and 29595 deletions
+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="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="4176" x="2629" y="3661" z="2" type="4" direction="e"/>
</parsing>
+197 -10
View File
@@ -218,10 +218,17 @@
"no",
"We are no strangers to love",
"You know the rules and so do I",
"A full commitments what Im thinking of",
"A full commitment's what I'm thinking of",
"You wouldn't get this from any other guy",
"I just wanna tell you how I'm feeling",
"Gotta make you understand",
"You wouldnt get this from any other guy",
"Never gonna give you up",
"Never gonna let you down",
"Never gonna run around and desert you",
"Never gonna make you cry",
"Never gonna say goodbye",
"Never gonna tell a lie and hurt you",
"why",
"why",
"why",
@@ -243,7 +250,7 @@
"A blessing in disguise @name",
"Break a leg",
"Cut somebody some slack",
"Youre in the right place!",
"You're in the right place!",
"Thanks so much.",
"I really appreciate you @name",
"Excuse me @name?",
@@ -252,7 +259,7 @@
"How does that sound @name?",
"That sounds great @name.",
"Im learning English.",
"I dont understand.",
"I don't understand.",
"Could you repeat that please @name?",
"Could you please talk slower @name?",
"Thank you. That helps a lot.",
@@ -310,11 +317,11 @@
"bowdi boy",
"i love bowdi... sometimes",
"@name = @name",
"Im bacon.. go on dad... say it",
"Im going to leave.",
"Im happy @name",
"Im not ready yet @name",
"Im very busy. I dont have time now.",
"I'm bacon.. go on dad... say it",
"I'm going to leave.",
"I'm happy @name",
"I'm not ready yet @name",
"I'm very busy. I don't have time now.",
"Is that enough @name?",
"I thought the clothes were cheaper @name",
"Ive been here for two days @name.",
@@ -329,7 +336,7 @@
"Very good, thanks @name",
"Your things are all here i think?",
"Long time no see @name",
"I couldnt agree more @name",
"I couldn't agree more @name",
"It cost me a fortune @name",
"I am dog tired",
"Dont take it personally",
@@ -338,7 +345,187 @@
"No problem",
"Anyway I should get going @name",
"I cant help you there @name",
"I agree 100% @name"
"I agree 100% @name",
"I've gone mentally insane",
"My descent into madness is complete",
"Get real",
"Cry about it",
"Cope",
"Seethe",
"Yes mate",
"I am mentally deranged",
"I've gone past the point of insanity",
"I am beyond the point of no return",
"Sounds tricky.",
"Guthiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxx!!!!!!",
"530 gang for life",
"${real.username}, have you read the rules?",
"${real.username}, have you checked out the Discord?",
"why are the leprechauns moving?",
"I am beyond the point of no return!",
"Nothin' personnel, kid.",
"All your base are belong to us",
"May Guthix bring you balance.",
"May Guthix bring you balance.",
"May Guthix bring you balance.",
"Thy death was not in vain, for it brought some balance to the world. May Guthix bring you rest.",
"May you walk the path, and never fall, for Guthix walks beside thee on thy journey. May Guthix bring you peace.",
"All things must end, as all begin; Only Guthix knows the role thou must play. May Guthix bring you balance.",
"In life, in death, in joy, in sorrow: May thine experience show thee balance. May Guthix bring you balance.",
"Thou must do as thou must, no matter what. Thine actions bring balance to this world. May Guthix bring you balance.",
"The river flows, the sun ignites, May you stand with Guthix in thy fights. May Guthix bring you balance.",
"A journey of a single step, May take thee over a thousand miles. May Guthix bring you balance.",
"Zamorak give me strength!",
"Zamorak give me strength!",
"Zamorak give me strength!",
"May your bloodthirst never be sated, and may all your battles be glorious. Zamorak bring you strength.",
"There is no opinion that cannot be proven true...by crushing those who choose to disagree with it. Zamorak give me strength!",
"Battles are not lost and won; They simply remove the weak from the equation. Zamorak give me strength!",
"Those who fight, then run away, shame Zamorak with their cowardice. Zamorak give me strength!",
"Battle is by those who choose to disagree with it. Zamorak give me strength!",
"Strike fast, strike hard, strike true: The strength of Zamorak will be with you. Zamorak give me strength!",
"The weak deserve to die, so the strong may flourish. This is the creed of Zamorak.",
"This is Saradomin's wisdom.",
"This is Saradomin's wisdom.",
"This is Saradomin's wisdom.",
"Go in peace in the name of Saradomin; may his glory shine upon you like the sun.",
"Thy cause was false, thy skills did lack; See you in Lumbridge when you get back.",
"Protect your self, protect your friends. Mine is the glory that never ends. This is Saradomin's wisdom.",
"The darkness in life may be avoided, by the light of wisdom shining. This is Saradomin's wisdom.",
"Show love to your friends, and mercy to your enemies, and know that the wisdom of Saradomin will follow. This is Saradomin's wisdom.",
"A fight begun, when the cause is just, will prevail over all others. This is Saradomin's wisdom.",
"The currency of goodness is honour; It retains its value through scarcity. This is Saradomin's wisdom.",
"For Camelot!",
"Firmly grasp it!",
"My legs!",
"Build more farms.",
"B sale at Varrock ${real.username}, don't miss out!",
"Drop party follow me",
"Ryan where is barbass, you said two days Ryan",
"Barbass never",
"What da dog doin' doe?",
"A",
"Ae",
"Mof",
"Moth",
"Fluff",
"Bwuh",
"I'm literally just mothin' bro",
"Certified 2009scape classic.",
"Make sure to like, comment and subscribe ${real.username} it really helps",
"Real 2009scape hours!!! Murder that like if you up!!!!",
"W00t!",
"Owned!",
"Pwned!",
"Lol n00b",
"Epic ownage ${real.username}",
"Gielinor is a strange place, ${real.username}. Best have your wits about you.",
"Mad bloggers bro",
"Vibe check",
"Drip check",
"Uhuhuhuhuhuhuhuhu",
"Ahhhhhhhhhhhhhhhh",
"yall got any deez?",
"Deez nuts",
"When she give you that yoinky sploinky",
"Sir, this is a 2009scape.",
"Oh dear! You are dead!",
"Cor blimey, mate! What are ye doing in me pockets?",
"yeah i got funnies",
"read muv luv",
"Why doesn't she love me bros?",
"${real.username} is off the goop don't listen to the clown",
"do yall got laptops",
"cfunny play the alien warp sound effect",
"Ware to all whom doom hither, where cope is all yet constant.",
"Who wants to come GWD?",
"How do I make money?",
"Ironmen stand alone together!",
"based",
"where is she",
"*S N I I I I I I I I I F F F F F F F F F F F*",
"Hey ${real.username}, who was in Paris?",
"Huh whuh?",
"who's lone?",
"who *is* he?",
"Hi ${real.username}, I'm Dad!",
"anyone wanna play melty blood after I high alch these bows?",
"buru nyaaaa",
"Number 15, Taverley Dungeon Black Dragons.",
"House party at Rimmington! Host: ${real.username}!",
"Spending 200m! Trade me, no junk!",
"Surprise exam, ${real.username}!",
"Nice outfit ${real.username}, does it come in mens?",
"Nice outfit ${real.username}, does it come in womens?",
"Nice outfit ${real.username}, does it come in children's size 12?",
":)",
":D",
"die screaming",
"Only on Tuesdays",
"we stan 2009scape",
"There is no spoon",
"Where's the cow level?",
"Join 2009scape Clan Chat!",
"Join 2009scape Cc!",
"Chop chop!",
"Runescape rox my sox!!!!!!1",
"Type ::scripts for all 99s",
"Help I just died to Evil Chicken and I lost my stuff!",
"Can you fight Bandos in this game?",
"one bad gloop",
"${real.username} is not cute or funny",
"You have committed crimes against Gielinor and her people. What say you?",
"Barrows trauma",
"Uhuhuhuhuhu please Barrows give me the K top ahhhhhh",
"Selling rare lobby 1m",
"Rise and grind bloatscapers, let's get this bread",
"Nice",
"Sandwiches, ${real.username}!",
"What a grand and intoxicating innocence!",
"With this character's death, the thread of prophecy is severed.",
"You must gather your party before venturing forth.",
"Praise Andrew Gower",
"Please help me I can't stop playing 2009scape",
"Are you ignoring me, ${real.username}?!",
"i agree with this rfc can we put it in the game please"
],
"halloween": [
"Trick or treat!!!",
"Boo! Hahahahaha!!",
"Have you got your costume on, ${real.username}?",
"How much candy did you get, ${real.username}?",
"Don't dead open inside",
"Costume party at my POH!! Follow me!",
"Trick, then!",
"Brrrainssssssss...",
"'Cause this is thriller, thriller night, and no one's gonna save you from the beast about to strike!",
"This is Hallowe'en, this is Hallowe'en, pumpkins scream in the dead of night!",
"This is Hallowe'en, everybody make a scene, Trick or treat till the neighbors gonna die of fright!",
"In this town we call home, everyone hail to the pumpkin song!",
"Watch out for Skeleton Jack!",
"The headless-what-man? Horse? Never heard of those.",
"Bring me their souls!",
"I'll take any sweets you don't want, ${real.username}",
"Whatever you do, don't come to Draynor Manor on this spooky night.",
"Ahhhh! ${real.username}, you scared me! :(",
"I'm making soup from some leftover pumpkins, want any?",
"I'm gonna be so sick from eating all these sweets...",
"Rise from the grave, my minions! Tis' Hallowe'en!",
"This Scream Fortress 2 update hits kinda different...",
"Nice costume Woah",
"Nice costume, ${real.username}!",
"Ooh, a piece of candy.",
"Time to join the skeleton war, ${real.username}.",
"Spooky scary skeletons!",
"Spooky scary skeletons!",
"Spooky scary skeletons!",
"Spooky scary skeletons, send shivers down your spine!",
"Shrieking skulls will shock your soul, seal your doom tonight!",
"Spooky scary skeletons, speak with such a screech!",
"You'll shake and shudder in surprise, when you hear these zombies shriek!",
"'Cause spooky scary skeletons, shout startling shrilly screams!",
"Spooky scary skeletons, will wake you with a boo!",
"*doot doot*"
],
"approaching_christmas": [
"Only @timer days left till christmas!",
+493 -275
View File
@@ -13220,66 +13220,6 @@
"id": "199",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "222",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "238",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "226",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "1939",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "224",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "1581",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "1976",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "40.0",
"id": "240",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "2152",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "9737",
"maxAmount": "6"
},
{
"minAmount": "1",
"weight": "50.0",
@@ -13340,12 +13280,6 @@
"id": "217",
"maxAmount": "2"
},
{
"minAmount": "12",
"weight": "50.0",
"id": "556",
"maxAmount": "12"
},
{
"minAmount": "36",
"weight": "50.0",
@@ -14442,7 +14376,7 @@
],
"charm": [],
"ids": "438,439,440,441,442,443,655,4470",
"description": "",
"description": "Tree Spirit (Hostile Woodcutting Random Event/Enchanted Valley)",
"main": [
{
"minAmount": "1",
@@ -14464,7 +14398,7 @@
},
{
"minAmount": "1",
"weight": "5.0",
"weight": "13.0",
"id": "1359",
"maxAmount": "1"
},
@@ -14474,12 +14408,6 @@
"id": "561",
"maxAmount": "22"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "1462",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
@@ -14552,35 +14480,95 @@
"id": "5301",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "1619",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "1617",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "1621",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "1623",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "946",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "3051",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "3049",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "199",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "201",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "19.0",
"id": "203",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "18.0",
"id": "205",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "12.0",
"id": "207",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "209",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "211",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "213",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "215",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.5",
"id": "2485",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.5",
"id": "217",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "31",
"maxAmount": "1"
}
]
},
@@ -24004,12 +23992,6 @@
"weight": "2.0",
"id": "12163",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "120.0",
"id": "0",
"maxAmount": "1"
}
],
"ids": "2455,2456",
@@ -24338,6 +24320,12 @@
"weight": "16.0",
"id": "5733",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1400.0",
"id": "0",
"maxAmount": "1"
}
]
},
@@ -30479,8 +30467,8 @@
"main": [
{
"minAmount": "1",
"weight": "5.0",
"id": "5733",
"weight": "1.0",
"id": "0",
"maxAmount": "1"
}
]
@@ -35694,10 +35682,10 @@
"maxAmount": "1"
},
{
"minAmount": "29",
"minAmount": "2",
"weight": "25.0",
"id": "558",
"maxAmount": "29"
"maxAmount": "9"
},
{
"minAmount": "10",
@@ -35718,10 +35706,10 @@
"maxAmount": "7"
},
{
"minAmount": "46",
"minAmount": "4",
"weight": "25.0",
"id": "562",
"maxAmount": "46"
"maxAmount": "6"
},
{
"minAmount": "2",
@@ -35730,10 +35718,10 @@
"maxAmount": "2"
},
{
"minAmount": "34",
"minAmount": "3",
"weight": "25.0",
"id": "563",
"maxAmount": "34"
"maxAmount": "4"
},
{
"minAmount": "6",
@@ -39016,159 +39004,166 @@
]
},
{
"default": [],
"default": [
{
"minAmount": "1",
"weight": "1.0",
"id": "799",
"maxAmount": "1"
}
],
"charm": [],
"ids": "3200",
"description": "",
"description": "Chaos Elemental (Boss)",
"main": [
{
"minAmount": "1",
"weight": "5.0",
"id": "5733",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "31",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "7158",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "25.0",
"weight": "100.0",
"id": "1215",
"maxAmount": "1"
},
{
"minAmount": "250",
"weight": "50.0",
"id": "562",
"maxAmount": "250"
},
{
"minAmount": "300",
"weight": "50.0",
"id": "809",
"maxAmount": "300"
"minAmount": "1",
"weight": "10.0",
"id": "7158",
"maxAmount": "1"
},
{
"minAmount": "500",
"weight": "25.0",
"weight": "98.0",
"id": "556",
"maxAmount": "500"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "560",
"maxAmount": "125"
},
{
"minAmount": "75",
"weight": "25.0",
"weight": "98.0",
"id": "565",
"maxAmount": "75"
},
{
"minAmount": "250",
"weight": "98.0",
"id": "562",
"maxAmount": "250"
},
{
"minAmount": "125",
"weight": "98.0",
"id": "560",
"maxAmount": "125"
},
{
"minAmount": "300",
"weight": "100.0",
"id": "809",
"maxAmount": "300"
},
{
"minAmount": "150",
"weight": "25.0",
"weight": "100.0",
"id": "892",
"maxAmount": "150"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "2440",
"maxAmount": "1"
"weight": "10.0",
"id": "199",
"maxAmount": "4"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "2436",
"maxAmount": "1"
"weight": "10.0",
"id": "201",
"maxAmount": "4"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "2442",
"maxAmount": "1"
"weight": "10.0",
"id": "203",
"maxAmount": "4"
},
{
"minAmount": "3",
"weight": "50.0",
"id": "2297",
"maxAmount": "3"
"minAmount": "1",
"weight": "7.5",
"id": "205",
"maxAmount": "4"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "207",
"maxAmount": "4"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "209",
"maxAmount": "4"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "211",
"maxAmount": "4"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "213",
"maxAmount": "4"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "215",
"maxAmount": "4"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "2485",
"maxAmount": "4"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "217",
"maxAmount": "1"
},
{
"minAmount": "10",
"weight": "50.0",
"id": "265",
"weight": "100.0",
"id": "465",
"maxAmount": "10"
},
{
"minAmount": "5",
"weight": "25.0",
"id": "361",
"maxAmount": "5"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "5940",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "25.0",
"weight": "98.0",
"id": "5952",
"maxAmount": "1"
},
{
"minAmount": "4",
"weight": "50.0",
"id": "526",
"maxAmount": "4"
},
{
"minAmount": "5",
"weight": "50.0",
"id": "530",
"maxAmount": "5"
},
{
"minAmount": "3",
"weight": "50.0",
"id": "532",
"maxAmount": "3"
"minAmount": "1",
"weight": "98.0",
"id": "5940",
"maxAmount": "1"
},
{
"minAmount": "7500",
"weight": "25.0",
"weight": "105.0",
"id": "995",
"maxAmount": "7500"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "536",
"weight": "10.0",
"id": "31",
"maxAmount": "1"
},
{
"minAmount": "2",
"weight": "25.0",
"id": "534",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "1462",
"weight": "8.0",
"id": "5733",
"maxAmount": "1"
}
]
@@ -40302,66 +40297,6 @@
"id": "556",
"maxAmount": "105"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "232",
"maxAmount": "10"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "12110",
"maxAmount": "10"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "222",
"maxAmount": "20"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "238",
"maxAmount": "15"
},
{
"minAmount": "1",
"weight": "15.0",
"id": "2971",
"maxAmount": "10"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "10110",
"maxAmount": "10"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "226",
"maxAmount": "10"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "9018",
"maxAmount": "5"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "224",
"maxAmount": "10"
},
{
"minAmount": "1",
"weight": "15.0",
"id": "240",
"maxAmount": "10"
},
{
"minAmount": "105",
"weight": "50.0",
@@ -40467,7 +40402,7 @@
{
"minAmount": "1",
"weight": "5.0",
"id": "1",
"id": "12070",
"maxAmount": "1"
},
{
@@ -40495,10 +40430,10 @@
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "100.0",
"id": "0",
"maxAmount": "1"
"minAmount": "100",
"weight": "25.0",
"id": "441",
"maxAmount": "100"
}
]
},
@@ -48738,8 +48673,8 @@
"main": [
{
"minAmount": "1",
"weight": "5.0",
"id": "5733",
"weight": "1.0",
"id": "0",
"maxAmount": "1"
}
]
@@ -48753,7 +48688,7 @@
{
"minAmount": "1",
"weight": "5.0",
"id": "5733",
"id": "0",
"maxAmount": "1"
}
]
@@ -63897,5 +63832,288 @@
"maxAmount": "1"
}
]
},
{
"default": [
{
"minAmount": "1",
"weight": "1.0",
"id": "0",
"maxAmount": "1"
}
],
"charm": [],
"ids": "391,392,393,394,395,396",
"description": "River Troll (Hostile Fishing Random Event)",
"main": [
{
"minAmount": "1",
"weight": "10.0",
"id": "371",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "383",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "349",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.2",
"id": "331",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.2",
"id": "327",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "3.0",
"id": "345",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "359",
"maxAmount": "1"
},
{
"minAmount": "5",
"weight": "10.0",
"id": "313",
"maxAmount": "5"
},
{
"minAmount": "30",
"weight": "10.0",
"id": "313",
"maxAmount": "30"
},
{
"minAmount": "15",
"weight": "10.0",
"id": "313",
"maxAmount": "15"
},
{
"minAmount": "20",
"weight": "3.2",
"id": "314",
"maxAmount": "20"
},
{
"minAmount": "40",
"weight": "3.2",
"id": "314",
"maxAmount": "40"
},
{
"minAmount": "50",
"weight": "2.0",
"id": "313",
"maxAmount": "50"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "407",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "8.0",
"id": "405",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "2.5",
"id": "151",
"maxAmount": "1"
}
]
},
{
"default": [],
"charm": [],
"ids": "413,414,415,416",
"description": "Rock Golem (Combat lvl 14-79) (Hostile Mining Random Event)",
"main": [
{
"minAmount": "5",
"weight": "20.0",
"id": "557",
"maxAmount": "5"
},
{
"minAmount": "42",
"weight": "5.0",
"id": "557",
"maxAmount": "42"
},
{
"minAmount": "2",
"weight": "5.0",
"id": "562",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "5.0",
"id": "2349",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "440",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "438",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "2.0",
"id": "436",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "1913",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "2347",
"maxAmount": "1"
}
]
},
{
"default": [],
"charm": [],
"ids": "417,418",
"description": "Rock Golem (Combat lvl 120-159) (Hostile Mining Random Event)",
"main": [
{
"minAmount": "1",
"weight": "6.0",
"id": "1265",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.5",
"id": "1271",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.5",
"id": "1275",
"maxAmount": "1"
},
{
"minAmount": "5",
"weight": "20.0",
"id": "557",
"maxAmount": "5"
},
{
"minAmount": "42",
"weight": "18.0",
"id": "557",
"maxAmount": "42"
},
{
"minAmount": "2",
"weight": "18.0",
"id": "562",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "453",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "17.0",
"id": "447",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "17.0",
"id": "2349",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "440",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "2351",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "438",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "436",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "449",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.5",
"id": "451",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "1913",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "20.0",
"id": "2347",
"maxAmount": "1"
}
]
}
]
+1 -1
View File
@@ -409,7 +409,7 @@
},
{
"item_id": "1973",
"loc_data": "{1,3143,3453,0,5242920}"
"loc_data": "{1,3143,3453,0,5242920}-{1,2384,4440,0,5242920}"
},
{
"item_id": "1982",
+122 -78
View File
@@ -5862,6 +5862,7 @@
"name": "Wizard hat",
"tradeable": "true",
"archery_ticket_price": "0",
"hat": "true",
"id": "579",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
},
@@ -6590,9 +6591,11 @@
{
"ge_buy_limit": "100",
"grand_exchange_price": "677",
"examine": "A silly pointed hat.",
"durability": null,
"name": "Hat",
"archery_ticket_price": "0",
"hat": "true",
"id": "656",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0"
@@ -6609,9 +6612,11 @@
{
"ge_buy_limit": "100",
"grand_exchange_price": "480",
"examine": "A silly pointed hat.",
"durability": null,
"name": "Hat",
"archery_ticket_price": "0",
"hat": "true",
"id": "658",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0"
@@ -6628,9 +6633,11 @@
{
"ge_buy_limit": "100",
"grand_exchange_price": "421",
"examine": "A silly pointed hat.",
"durability": null,
"name": "Hat",
"archery_ticket_price": "0",
"hat": "true",
"id": "660",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0"
@@ -6647,9 +6654,11 @@
{
"ge_buy_limit": "100",
"grand_exchange_price": "1102",
"examine": "A silly pointed hat.",
"durability": null,
"name": "Hat",
"archery_ticket_price": "0",
"hat": "true",
"id": "662",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0"
@@ -6669,12 +6678,14 @@
"durability": null,
"name": "Hat",
"archery_ticket_price": "0",
"hat": "true",
"id": "664",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0"
},
{
"ge_buy_limit": "100",
"examine": "A silly pointed hat.",
"grand_exchange_price": "295",
"durability": null,
"name": "Hat",
@@ -6794,7 +6805,7 @@
"id": "676"
},
{
"examine": "An empty tray for panning./This tray contains mud.",
"examine": "An empty tray for panning.",
"durability": null,
"name": "Panning tray",
"high_alchemy": "1",
@@ -6802,7 +6813,7 @@
"id": "677"
},
{
"examine": "An empty tray for panning./This tray contains mud.",
"examine": "This tray contains gold nuggets.",
"durability": null,
"name": "Panning tray",
"high_alchemy": "1",
@@ -6810,7 +6821,7 @@
"id": "678"
},
{
"examine": "An empty tray for panning./This tray contains mud.",
"examine": "This tray contains mud.",
"durability": null,
"name": "Panning tray",
"high_alchemy": "1",
@@ -7275,6 +7286,7 @@
"name": "Blue hat",
"tradeable": "true",
"archery_ticket_price": "0",
"hat": "true",
"id": "740",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
},
@@ -10047,6 +10059,7 @@
"name": "Wizard hat",
"tradeable": "true",
"archery_ticket_price": "0",
"hat": "true",
"id": "1017",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
},
@@ -10458,6 +10471,7 @@
"name": "Santa hat",
"tradeable": "true",
"archery_ticket_price": "0",
"hat": "true",
"id": "1050"
},
{
@@ -15843,7 +15857,7 @@
"archery_ticket_price": "0",
"id": "1391",
"stand_turn_anim": "1209",
"bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,0,0,0",
"bonuses": "7,-1,25,12,0,2,3,1,12,0,0,32,0,0,0",
"requirements": "{0,30}-{6,30}",
"shop_price": "7000",
"durability": null,
@@ -15882,7 +15896,7 @@
"archery_ticket_price": "0",
"id": "1393",
"stand_turn_anim": "1209",
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
"requirements": "{0,30}-{6,30}",
"shop_price": "19600",
"durability": null,
@@ -15922,7 +15936,7 @@
"archery_ticket_price": "0",
"id": "1395",
"stand_turn_anim": "1209",
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
"requirements": "{0,30}-{6,30}",
"durability": null,
"high_alchemy": "9300",
@@ -15961,7 +15975,7 @@
"archery_ticket_price": "0",
"id": "1397",
"stand_turn_anim": "1209",
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
"requirements": "{0,30}-{6,30}",
"shop_price": "7000",
"durability": null,
@@ -16001,7 +16015,7 @@
"archery_ticket_price": "0",
"id": "1399",
"stand_turn_anim": "1209",
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
"requirements": "{0,30}-{6,30}",
"shop_price": "1500",
"durability": null,
@@ -16041,7 +16055,7 @@
"archery_ticket_price": "0",
"id": "1401",
"stand_turn_anim": "1209",
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
"requirements": "{0,40}-{6,40}",
"durability": null,
"high_alchemy": "25500",
@@ -16079,7 +16093,7 @@
"archery_ticket_price": "0",
"id": "1403",
"stand_turn_anim": "1209",
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
"requirements": "{0,40}-{6,40}",
"durability": null,
"high_alchemy": "25500",
@@ -16116,7 +16130,7 @@
"archery_ticket_price": "0",
"id": "1405",
"stand_turn_anim": "1209",
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
"requirements": "{0,40}-{6,40}",
"durability": null,
"high_alchemy": "25500",
@@ -16154,7 +16168,7 @@
"archery_ticket_price": "0",
"id": "1407",
"stand_turn_anim": "1209",
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
"requirements": "{0,40}-{6,40}",
"shop_price": "40000",
"durability": null,
@@ -27879,6 +27893,7 @@
"name": "Robin hood hat",
"tradeable": "true",
"archery_ticket_price": "0",
"hat": "true",
"id": "2581",
"bonuses": "0,0,0,-10,8,4,6,8,4,4,7,0,0,0,0"
},
@@ -28788,6 +28803,7 @@
"low_alchemy": "72",
"high_alchemy": "108",
"archery_ticket_price": "0",
"hat": "true",
"id": "2651",
"equipment_slot": "0"
},
@@ -28873,7 +28889,7 @@
"tradeable": "true",
"archery_ticket_price": "0",
"id": "2657",
"bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0"
"bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,1"
},
{
"ge_buy_limit": "2",
@@ -28942,7 +28958,7 @@
{
"requirements": "{1,40}",
"ge_buy_limit": "2",
"examine": "Rune platelegs in the colours of Saradomin!",
"examine": "Rune platelegs in the colours of Saradomin.",
"durability": null,
"low_alchemy": "25600",
"high_alchemy": "38400",
@@ -29095,7 +29111,7 @@
"tradeable": "true",
"archery_ticket_price": "0",
"id": "2673",
"bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0"
"bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,1,0,0"
},
{
"ge_buy_limit": "2",
@@ -30882,6 +30898,7 @@
"name": "Hat",
"tradeable": "true",
"archery_ticket_price": "0",
"hat": "true",
"id": "2900",
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
"equipment_slot": "0"
@@ -32495,7 +32512,7 @@
"archery_ticket_price": "0",
"id": "3053",
"stand_turn_anim": "1209",
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
"requirements": "{0,30}-{6,30}",
"durability": null,
"high_alchemy": "10200",
@@ -32525,7 +32542,7 @@
"archery_ticket_price": "0",
"id": "3054",
"stand_turn_anim": "1209",
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
"requirements": "{0,40}-{6,40}",
"shop_price": "160",
"durability": null,
@@ -39292,7 +39309,7 @@
"id": "4020"
},
{
"examine": "It's an unstrung Amulet of Monkey Speak. It makes vague chattering noises.",
"examine": "It's an Amulet of Monkey Speak. It makes vague chattering noises.",
"durability": null,
"name": "M'speak amulet",
"weight": "1.3",
@@ -63469,7 +63486,7 @@
"archery_ticket_price": "0",
"id": "6562",
"stand_turn_anim": "1209",
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
"requirements": "{0,30}-{6,30}",
"durability": null,
"high_alchemy": "10200",
@@ -63497,7 +63514,7 @@
"archery_ticket_price": "0",
"id": "6563",
"stand_turn_anim": "1209",
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
"requirements": "{0,40}-{6,40}",
"shop_price": "40000",
"durability": null,
@@ -71231,16 +71248,17 @@
{
"ge_buy_limit": "2",
"examine": "A silly pointed hat with colourful trim.",
"grand_exchange_price": "1400000",
"durability": null,
"name": "Wizard hat (g)",
"tradeable": "true",
"high_alchemy": "1",
"weight": "1",
"equipment_slot": "0",
"grand_exchange_price": "1400000",
"name": "Wizard hat (g)",
"tradeable": "true",
"archery_ticket_price": "0",
"hat": "true",
"id": "7394",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0",
"equipment_slot": "0"
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
},
{
"ge_buy_limit": "2",
@@ -71254,16 +71272,17 @@
{
"ge_buy_limit": "2",
"examine": "A silly pointed hat, with colourful trim.",
"grand_exchange_price": "352700",
"durability": null,
"name": "Wizard hat (t)",
"tradeable": "true",
"high_alchemy": "1",
"weight": "0.4",
"equipment_slot": "0",
"grand_exchange_price": "352700",
"name": "Wizard hat (t)",
"tradeable": "true",
"archery_ticket_price": "0",
"hat": "true",
"id": "7396",
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0",
"equipment_slot": "0"
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
},
{
"ge_buy_limit": "2",
@@ -93676,7 +93695,7 @@
"id": "10371"
},
{
"requirements": "{1,40}-{4,70}",
"requirements": "{4,70}",
"ge_buy_limit": "2",
"examine": "Zamorak blessed dragonhide chaps.",
"durability": null,
@@ -93781,7 +93800,7 @@
"id": "10379"
},
{
"requirements": "{1,40}-{4,70}",
"requirements": "{4,70}",
"ge_buy_limit": "2",
"examine": "Guthix blessed dragonhide chaps.",
"durability": null,
@@ -93888,7 +93907,7 @@
"id": "10387"
},
{
"requirements": "{1,40}-{4,70}",
"requirements": "{4,70}",
"ge_buy_limit": "2",
"examine": "Saradomin blessed dragonhide chaps.",
"durability": null,
@@ -98229,7 +98248,7 @@
"tradeable": "true",
"archery_ticket_price": "0",
"id": "10780",
"bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,1"
"bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,0"
},
{
"examine": "Rune platebody with complete gold trim &amp; plating.",
@@ -105823,9 +105842,9 @@
"examine": "Part of the Godsword blade.",
"grand_exchange_price": "150200",
"durability": null,
"rare_item": "true",
"name": "Godsword shard 1",
"tradeable": "true",
"rare_item": "true",
"low_alchemy": "100000",
"high_alchemy": "150000",
"weight": "2",
@@ -105844,15 +105863,15 @@
{
"ge_buy_limit": "10",
"examine": "Part of the Godsword blade.",
"grand_exchange_price": "149100",
"durability": null,
"name": "Godsword shard 2",
"tradeable": "true",
"rare_item": "true",
"low_alchemy": "100000",
"high_alchemy": "150000",
"destroy": "true",
"weight": "2",
"grand_exchange_price": "149100",
"name": "Godsword shard 2",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "11712"
},
@@ -105870,9 +105889,9 @@
"examine": "Part of the Godsword blade.",
"grand_exchange_price": "149800",
"durability": null,
"rare_item": "true",
"name": "Godsword shard 3",
"tradeable": "true",
"rare_item": "true",
"low_alchemy": "100000",
"high_alchemy": "150000",
"weight": "2",
@@ -106206,7 +106225,7 @@
"archery_ticket_price": "0",
"id": "11736",
"stand_turn_anim": "1209",
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
"requirements": "{0,30}-{6,30}",
"durability": null,
"high_alchemy": "10200",
@@ -106243,7 +106262,7 @@
"archery_ticket_price": "0",
"id": "11738",
"stand_turn_anim": "1209",
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
"requirements": "{0,40}-{6,40}",
"durability": null,
"high_alchemy": "27000",
@@ -129223,7 +129242,7 @@
"bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0"
},
{
"examine": "Rune platelegs in the colours of Saradomin!",
"examine": "Rune platelegs in the colours of Saradomin.",
"durability": null,
"low_alchemy": "25600",
"high_alchemy": "38400",
@@ -129661,7 +129680,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "12,6,0",
"equipment_slot": "4",
@@ -129669,6 +129688,7 @@
"remove_sleeves": "true",
"grand_exchange_price": "1412812",
"name": "Zuriel's robe top",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13858",
"bonuses": "0,0,0,35,-10,63,45,74,35,0,60,0,0,0,0"
@@ -129680,7 +129700,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "1412812",
@@ -129715,13 +129735,14 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "8,4,0",
"equipment_slot": "7",
"destroy_message": "Drop",
"grand_exchange_price": "986668",
"name": "Zuriel's robe bottom",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13861",
"bonuses": "0,0,0,25,-7,38,35,44,24,0,30,0,0,0,0"
@@ -129733,7 +129754,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "986668",
@@ -129768,13 +129789,14 @@
"durability": null,
"low_alchemy": "100000",
"high_alchemy": "150000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "6,3,0",
"equipment_slot": "0",
"destroy_message": "Drop",
"grand_exchange_price": "361542",
"name": "Zuriel's hood",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13864",
"bonuses": "0,0,0,8,-2,20,16,22,8,0,15,0,0,0,0"
@@ -129786,7 +129808,7 @@
"durability": null,
"low_alchemy": "100000",
"high_alchemy": "150000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "361542",
@@ -129830,6 +129852,7 @@
"destroy_message": "Drop",
"grand_exchange_price": "2116989",
"stand_anim": "813",
"tradeable": "true",
"run_anim": "1210",
"archery_ticket_price": "0",
"id": "13867",
@@ -129839,7 +129862,7 @@
"shop_price": "300000",
"durability": null,
"high_alchemy": "180000",
"destroy": "true",
"destroy": "false",
"weapon_interface": "1",
"render_anim": "28",
"attack_audios": "2555,0,0,0",
@@ -129852,7 +129875,7 @@
"durability": null,
"low_alchemy": "120000",
"high_alchemy": "180000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "2116989",
@@ -129899,7 +129922,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "0,12,6",
"equipment_slot": "4",
@@ -129907,6 +129930,7 @@
"remove_sleeves": "true",
"grand_exchange_price": "926341",
"name": "Morrigan's leather body",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13870",
"bonuses": "0,0,0,-15,36,61,53,66,75,62,60,0,0,0,0"
@@ -129918,7 +129942,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "926341",
@@ -129953,13 +129977,14 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "0,8,4",
"equipment_slot": "7",
"destroy_message": "Drop, Destroy after degrading.",
"grand_exchange_price": "510395",
"name": "Morrigan's leather chaps",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13873",
"bonuses": "0,0,0,-10,23,35,29,37,46,35,30,0,0,0,0"
@@ -129971,7 +129996,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop, Destroy after degrading.",
"grand_exchange_price": "510395",
@@ -130006,13 +130031,14 @@
"durability": null,
"low_alchemy": "100000",
"high_alchemy": "150000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "0,6,3",
"equipment_slot": "0",
"destroy_message": "Drop",
"grand_exchange_price": "236411",
"name": "Morrigan's coif",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13876",
"bonuses": "0,0,0,-5,13,8,11,14,8,12,15,0,0,0,0"
@@ -130024,7 +130050,7 @@
"durability": null,
"low_alchemy": "100000",
"high_alchemy": "150000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "236411",
@@ -130060,7 +130086,7 @@
"durability": null,
"low_alchemy": "1600",
"high_alchemy": "2400",
"destroy": "true",
"destroy": "false",
"attack_speed": "6",
"weapon_interface": "18",
"absorb": "0,0,0",
@@ -130069,6 +130095,7 @@
"destroy_message": "Drop",
"grand_exchange_price": "19944",
"name": "Morrigan's javelin",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13879",
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
@@ -130081,7 +130108,7 @@
"durability": null,
"low_alchemy": "1600",
"high_alchemy": "2400",
"destroy": "true",
"destroy": "false",
"attack_speed": "6",
"weapon_interface": "18",
"absorb": "0,0,0",
@@ -130090,6 +130117,7 @@
"destroy_message": "Drop",
"grand_exchange_price": "19944",
"name": "Morrigan's javelin(p)",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13880",
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
@@ -130102,7 +130130,7 @@
"durability": null,
"low_alchemy": "1600",
"high_alchemy": "2400",
"destroy": "true",
"destroy": "false",
"attack_speed": "6",
"weapon_interface": "18",
"absorb": "0,0,0",
@@ -130111,6 +130139,7 @@
"destroy_message": "Drop",
"grand_exchange_price": "19944",
"name": "Morrigan's javelin(p+)",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13881",
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
@@ -130123,7 +130152,7 @@
"durability": null,
"low_alchemy": "1600",
"high_alchemy": "2400",
"destroy": "true",
"destroy": "false",
"attack_speed": "6",
"weapon_interface": "18",
"absorb": "0,0,0",
@@ -130132,6 +130161,7 @@
"destroy_message": "Drop",
"grand_exchange_price": "19944",
"name": "Morrigan's javelin(p++)",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13882",
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
@@ -130144,7 +130174,7 @@
"durability": null,
"low_alchemy": "1600",
"high_alchemy": "2400",
"destroy": "true",
"destroy": "false",
"attack_speed": "5",
"weapon_interface": "18",
"absorb": "0,0,0",
@@ -130152,6 +130182,7 @@
"destroy_message": "Drop",
"grand_exchange_price": "9994",
"name": "Morrigan's throwing axe",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13883",
"bonuses": "0,0,0,0,93,0,0,0,0,0,0,0,0,0,0"
@@ -130163,7 +130194,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "6,0,12",
"equipment_slot": "4",
@@ -130171,6 +130202,7 @@
"remove_sleeves": "true",
"grand_exchange_price": "1619096",
"name": "Statius's platebody",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13884",
"bonuses": "5,5,7,-30,-10,154,145,121,-6,157,60,5,0,0,0"
@@ -130182,7 +130214,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "1619096",
@@ -130217,7 +130249,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "6,0,12",
"equipment_slot": "4",
@@ -130225,6 +130257,7 @@
"remove_sleeves": "true",
"grand_exchange_price": "2154168",
"name": "Vesta's chainbody",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13887",
"bonuses": "5,7,7,-15,0,120,131,145,-3,140,60,6,0,0,0"
@@ -130236,7 +130269,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop, Destroy once it has been degraded.",
"grand_exchange_price": "2154168",
@@ -130271,13 +130304,14 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "4,0,8",
"equipment_slot": "7",
"destroy_message": "Drop",
"grand_exchange_price": "1735029",
"name": "Statius's platelegs",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13890",
"bonuses": "3,3,5,-21,-7,110,106,97,-4,121,30,3,0,0,0"
@@ -130289,7 +130323,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "1735029",
@@ -130323,13 +130357,14 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "4,0,8",
"equipment_slot": "7",
"destroy_message": "Drop",
"grand_exchange_price": "1860767",
"name": "Vesta's plateskirt",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13893",
"bonuses": "3,5,5,-17,-4,86,100,112,-2,118,30,3,0,0,0"
@@ -130341,7 +130376,7 @@
"durability": null,
"low_alchemy": "200000",
"high_alchemy": "300000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "1860767",
@@ -130376,13 +130411,14 @@
"durability": null,
"low_alchemy": "100000",
"high_alchemy": "150000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"absorb": "3,0,6",
"equipment_slot": "0",
"destroy_message": "Drop",
"grand_exchange_price": "1301986",
"name": "Statius's full helm",
"tradeable": "true",
"archery_ticket_price": "0",
"id": "13896",
"bonuses": "3,3,4,-6,-2,65,70,63,-1,71,15,3,0,0,0"
@@ -130394,7 +130430,7 @@
"durability": null,
"low_alchemy": "100000",
"high_alchemy": "150000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "1301986",
@@ -130438,6 +130474,7 @@
"attack_anims": "381,390,390,390",
"destroy_message": "Drop",
"grand_exchange_price": "10464249",
"tradeable": "true",
"run_anim": "824",
"archery_ticket_price": "0",
"id": "13899",
@@ -130447,7 +130484,7 @@
"shop_price": "300000",
"durability": null,
"high_alchemy": "180000",
"destroy": "true",
"destroy": "false",
"weapon_interface": "5",
"render_anim": "1426",
"attack_audios": "2500,2500,2517,2500",
@@ -130460,7 +130497,7 @@
"durability": null,
"low_alchemy": "120000",
"high_alchemy": "180000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop",
"grand_exchange_price": "10464249",
@@ -130516,6 +130553,7 @@
"destroy_message": "Drop, Destroy once it has been degraded.",
"grand_exchange_price": "7424450",
"stand_anim": "808",
"tradeable": "true",
"run_anim": "1210",
"archery_ticket_price": "0",
"id": "13902",
@@ -130525,7 +130563,7 @@
"shop_price": "300000",
"durability": null,
"high_alchemy": "180000",
"destroy": "true",
"destroy": "false",
"weapon_interface": "10",
"attack_audios": "2504,0,0,0",
"name": "Statius's warhammer"
@@ -130537,7 +130575,7 @@
"durability": null,
"low_alchemy": "120000",
"high_alchemy": "180000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"destroy_message": "Drop, Destroy once it has been degraded.",
"grand_exchange_price": "7424450",
@@ -130593,6 +130631,7 @@
"destroy_message": "Drop",
"grand_exchange_price": "5264612",
"stand_anim": "813",
"tradeable": "true",
"run_anim": "1210",
"archery_ticket_price": "0",
"id": "13905",
@@ -130602,7 +130641,7 @@
"shop_price": "300000",
"durability": null,
"high_alchemy": "180000",
"destroy": "true",
"destroy": "false",
"weight": "4.2",
"weapon_interface": "14",
"render_anim": "28",
@@ -130615,7 +130654,7 @@
"durability": null,
"low_alchemy": "120000",
"high_alchemy": "180000",
"destroy": "true",
"destroy": "false",
"attack_speed": "4",
"two_handed": "true",
"destroy_message": "Drop",
@@ -139623,5 +139662,10 @@
"render_anim": "28",
"attack_audios": "2555,0,0,0",
"name": "Staff of the raven"
},
{
"examine": "Item container for C. Ele Minor Drop Table. You should not be able to obtain this item.",
"name": "C. Ele Minor Drop Table",
"id": "799"
}
]
]
+1 -1
View File
@@ -2181,7 +2181,7 @@
"id": "573",
"name": "The Mad Mole",
"indexId": "393",
"borders": "{1728,5120,1791,5183}"
"borders": "{1728,5120,1791,5247}"
},
{
"id": "575",
File diff suppressed because it is too large Load Diff
+46 -2
View File
@@ -3403,6 +3403,10 @@
"npc_id": "1469",
"loc_data": "{2595,3277,0,0,0}"
},
{
"npc_id": "1471",
"loc_data": "{2707,9102,0,1,0}-{2704,9107,0,1,0}-{2705,9110,0,1,0}-{2708,9107,0,1,0}-{2743,9105,0,1,0}-{2741,9103,0,1,0}-{2744,9101,0,1,0}-{2743,9099,0,1,0}-{2737,9124,0,1,0}-{2741,9123,0,1,0}-{2740,9120,0,1,0}-{2736,9119,0,1,0}-{2734,9117,0,1,0}-{2712,9135,0,1,0}-{2714,9131,0,1,0}-{2709,9131,0,1,0}-{2708,9135,0,1,0}"
},
{
"npc_id": "1514",
"loc_data": "{3432,3487,0,0,0}"
@@ -3735,6 +3739,10 @@
"npc_id": "1697",
"loc_data": "{3662,3502,0,1,4}-{3664,3493,0,1,6}-{3672,3486,0,1,2}-{3685,3485,0,1,3}-{3684,3496,0,1,3}-{3675,3502,0,1,3}-{3667,3484,0,1,0}-{3666,3471,0,1,4}-{3676,3464,0,1,3}-{3683,3467,0,1,6}-{3685,3474,0,1,4}-{3690,3474,0,1,1}-{3695,3473,0,1,3}-{3693,3466,0,1,7}-{3698,3463,0,1,3}-{3688,3467,0,1,3}-{3675,3474,0,1,4}-{3665,3476,0,1,6}-{3662,3491,0,1,1}-{3662,3495,0,1,4}-{3661,3501,0,1,6}-{3682,3486,0,1,4}-{3678,3493,0,1,4}-{3673,3491,0,1,3}-{3658,3502,0,1,4}-{3660,3505,0,1,1}-{3665,3469,0,1,6}-{3659,3465,0,1,6}-{3667,3461,0,1,1}"
},
{
"npc_id": "1698",
"loc_data": "{3665,3529,0,1,4}-{3669,3522,0,1,4}-{3672,3529,0,1,4}-{3668,3534,0,1,4}-{3657,3534,0,1,4}-{3654,3537,0,1,4}-{3649,3503,0,1,2}-{3647,3473,0,1,3}"
},
{
"npc_id": "1699",
"loc_data": "{3659,3480,0,1,3}"
@@ -4199,6 +4207,10 @@
"npc_id": "2059",
"loc_data": "{2588,3088,0,1,3}"
},
{
"npc_id": "2067",
"loc_data": "{3154,9544,0,0,0}-{3245,9570,0,0,0}"
},
{
"npc_id": "2082",
"loc_data": "{3210,3220,1,1,6}"
@@ -6091,6 +6103,22 @@
"npc_id": "3917",
"loc_data": "{2581,3861,0,0,1}"
},
{
"npc_id": "3920",
"loc_data": "{2527,10259,0,1,1}"
},
{
"npc_id": "3921",
"loc_data": "{2506,10251,0,1,1}"
},
{
"npc_id": "3922",
"loc_data": "{2508,10260,0,1,1}"
},
{
"npc_id": "3923",
"loc_data": "{2521,10251,0,1,1}"
},
{
"npc_id": "3937",
"loc_data": "{2508,3866,0,0,3}"
@@ -8083,6 +8111,10 @@
"npc_id": "5672",
"loc_data": "{3788,2825,2,0,0}"
},
{
"npc_id": "5748",
"loc_data": "{3483,3449,0,0,0}-{3490,3444,0,0,0}-{3479,3434,0,0,0}-{3481,3473,0,0,0}-{3479,3430,0,0,0}-{3434,3417,0,0,0}-{3431,3415,0,0,0}-{3440,3410,0,0,0}-{3424,3409,0,0,0}-{3425,3410,0,0,0}-{3425,3407,0,0,0}-{3429,3276,0,0,0}-{3440,3281,0,0,0}-{3437,3272,0,0,0}-{3440,3271,0,0,0}-{3443,3272,0,0,0}-{3445,3279,0,0,0}-{3445,3274,0,0,0}"
},
{
"npc_id": "5750",
"loc_data": "{3290,5544,0,1,4}-{3270,5552,0,1,1}-{3274,5547,0,1,7}"
@@ -8269,7 +8301,7 @@
},
{
"npc_id": "5828",
"loc_data": "{2697,5316,0,0,0}"
"loc_data": "{2697,5316,0,0,0}-{3323,9606,0,0,0}"
},
{
"npc_id": "5832",
@@ -9607,6 +9639,10 @@
"npc_id": "7052",
"loc_data": "{2571,2855,0,0,0}"
},
{
"npc_id": "7054",
"loc_data": "{2561,2850,0,0,0}"
},
{
"npc_id": "7055",
"loc_data": "{2559,2851,0,0,0}-{2560,2852,0,0,0}"
@@ -10154,7 +10190,7 @@
{
"npc_id": "8171",
"loc_data": "{3281,3403,0,1,6}"
},
},
{
"npc_id": "8273",
"loc_data": "{2931,3536,0,1,5}"
@@ -10926,5 +10962,13 @@
{
"npc_id": "7130",
"loc_data": "{1625,4689,0,1,0}-{1614,4704,0,1,0}-{1631,4719,0,1,0}-{1651,4705,0,1,0}"
},
{
"npc_id": "800",
"loc_data": "{2884,9765,0,1,0}-{2890,9766,0,1,0}-{2894,9764,0,1,0}"
},
{
"npc_id": "3322",
"loc_data": "{2384,4439,0,1,0}"
}
]
+91 -19
View File
@@ -69,7 +69,7 @@
"general_store": "true",
"id": "8",
"title": "West Ardougne General Store",
"stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}"
"stock": "{1931,10}-{954,10}-{1265,10}-{1925,30}-{590,10}-{2347,10}-{1061,10}-{841,10}-{882,100}-{329,10}-{2327,10}-{2309,10}-{2142,10}"
},
{
"npcs": "1917",
@@ -204,7 +204,7 @@
"general_store": "true",
"id": "23",
"title": "Lletya General Store",
"stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}"
"stock": "{1931,10}-{954,10}-{1265,10}-{1925,30}-{590,10}-{2347,10}-{1061,10}-{841,10}-{882,100}-{329,10}-{2327,10}-{2309,10}-{2142,10}"
},
{
"npcs": "4516",
@@ -213,7 +213,7 @@
"general_store": "true",
"id": "24",
"title": "Moon Clan General Store",
"stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}"
"stock": "{1931,30}-{1935,10}-{1735,10}-{1925,30}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{9003,10}-{229,1000}"
},
{
"npcs": "520,521",
@@ -360,7 +360,7 @@
"stock": "{1931,5}-{1935,2}-{1735,2}-{1925,3}-{1923,2}-{1887,2}-{590,2}-{1755,2}-{2347,5}-{550,5}-{9003,5}-{954,2}-{946,2}-{2114,0}-{1963,15}-{2108,10}-{4286,10}-{1785,15}-{1783,inf}-{401,inf}-{1781,10}-{301,20}-{307,20}-{1941,30}-{9629,25}-{3226,20}-{1025,5}"
},
{
"npcs": "534",
"npcs": "534,535",
"high_alch": "0",
"currency": "995",
"general_store": "true",
@@ -702,13 +702,13 @@
"stock": "{4012,10}-{1963,10}-{4016,10}-{4014,10}"
},
{
"npcs": "7053",
"npcs": "7054",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "80",
"title": "Fresh Meat",
"stock": "{2134,10}-{2132,300}-{2136,10}-{2142,10}-{2138,10}-{2140,10}-{3226,100}-{7224,0}-{7223,0}-{3228,10}-{2876,0}-{7230,0}-{2878,0}-{7566,0}-{2337,0}-{9978,10}-{9984,0}-{9980,0}-{9986,0}-{9992,0}-{9988,0}"
"stock": "{2134,10}-{2132,300}-{2136,10}-{2142,10}-{2138,10}-{2140,10}-{3226,100}-{7224,0}-{7223,0}-{3228,10}-{2876,0}-{7230,0}-{2878,0}-{7566,0}-{2337,0}-{9978,100}-{9984,0}-{9980,0}-{9986,0}-{9992,0}-{9988,0}"
},
{
"npcs": "571",
@@ -1229,8 +1229,8 @@
"currency": "995",
"general_store": "false",
"id": "139",
"title": "Spice Shop",
"stock": "{1931,30}-{2169,10}-{5970,0}"
"title": "The Spice Is Right",
"stock": "{1931,30}-{2169,10}-{5970,0}-{175,10}"
},
{
"npcs": "546",
@@ -2031,7 +2031,7 @@
"general_store": "false",
"id": "229",
"title": "Lletya Food Store",
"stock": "{2309,10}-{379,15}-{1993,3}-{1985,10}-{1891,5}"
"stock": "{2309,10}-{379,10}-{1993,10}-{1985,10}-{1891,10}"
},
{
"npcs": "2356",
@@ -2042,15 +2042,6 @@
"title": "Lletya Archery Shop",
"stock": "{884,2000}-{886,500}-{888,500}-{890,450}-{892,400}-{877,1500}-{843,5}-{845,5}-{837,5}-{849,5}-{847,5}"
},
{
"npcs": "2352",
"high_alch": "0",
"currency": "995",
"general_store": "true",
"id": "231",
"title": "Lletya General Store",
"stock": ""
},
{
"npcs": "1282",
"high_alch": "0",
@@ -2164,8 +2155,89 @@
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "245",
"id": "244",
"title": "The Armour Store",
"stock": "{1147,0}-{1163,0}-{1127,0}-{1093,0}-{1185,0}-{1201,0}-{1113,0}-{1079,0}-{1145,0}-{1161,0}-{1123,0}-{1091,0}-{1183,0}-{1199,0}-{1111,0}-{1073,0}-{1143,0}-{1159,0}-{1121,0}-{1085,0}-{1181,0}-{1197,0}-{1109,0}-{1071,0}"
},
{
"npcs": "7048",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "245",
"title": "Gift Shop",
"stock": "{590,10}-{2866,100}-{2878,10}-{314,1000}-{1351,10}-{954,10}-{1931,30}-{1925,30}-{2347,10}-{946,10}-{12561,10}-{12563,10}-{12565,0}-{12567,0}-{12568,0}-{12559,0}-{12570,0}"
},
{
"npcs": "3923",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "246",
"title": "Miscellanian Food Shop",
"stock": "{2309,5}-{1985,5}-{1965,5}-{1942,5}-{1957,5}-{1933,5}-{1973,5}-{1927,5}"
},
{
"npcs": "3920",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "247",
"title": "The Esoterican Arms",
"stock": "{1917,10}-{5763,10}-{1993,5}-{1798,5}"
},
{
"npcs": "1383,3921",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "248",
"title": "Miscellanian Clothes Shop",
"stock": "{3767,5}-{3769,5}-{3771,5}-{3773,5}-{3775,5}-{3795,5}-{5050,3}-{5052,3}-{5038,3}-{5040,3}-{5044,3}-{5046,3}-{5026,3}-{5028,3}-{5032,3}-{5034,3}"
},
{
"npcs": "1393",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "249",
"title": "Island Fishmonger",
"stock": "{303,5}-{307,5}-{309,5}-{311,2}-{301,2}-{313,1500}-{314,1000}-{305,5}-{317,0}-{325,200}-{345,0}-{353,0}-{341,0}-{321,0}-{335,0}-{349,0}-{331,0}-{359,0}-{377,0}-{363,0}-{371,0}-{383,0}"
},
{
"npcs": "1394",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "250",
"title": "Greengrocer of Miscellania",
"stock": "{1965,10}-{1942,10}-{1957,10}-{1982,10}-{1550,2}"
},
{
"npcs": "932",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "251",
"title": "Legends Guild General Store",
"stock": "{373,20}-{2323,5}-{121,3}-{886,500}"
},
{
"npcs": "3161",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "252",
"title": "Two Feet Charley's Fish Shop",
"stock": "{317,10}-{327,10}-{345,10}-{353,10}-{341,10}-{321,10}-{359,0}-{377,0}-{363,0}-{377,0}"
},
{
"npcs": "1316",
"high_alch": "0",
"currency": "995",
"general_store": "false",
"id": "253",
"title": "Fremennik Fur Trader",
"stock": "{948,10}-{958,10}-{10117,0}-{10121,0}-{10119,0}-{10123,0}-{10093,0}-{10095,0}-{10097,0}-{10099,0}-{10101,0}-{10103,0}"
}
]
@@ -34,6 +34,8 @@ import rs09.game.content.activity.barrows.RewardChest;
import rs09.game.world.GameWorld;
import rs09.plugin.PluginManager;
import static api.ContentAPIKt.getWorldTicks;
/**
* Handles the barrows activity plugin.
* @author Emperor
@@ -77,7 +79,7 @@ public final class BarrowsActivityPlugin extends ActivityPlugin {
/**
* The activity handling pulse.
*/
private static final Pulse PULSE = new Pulse(3) {
private static final Pulse PULSE = new Pulse(0) {
@Override
public boolean pulse() {
boolean end = true;
@@ -89,27 +91,30 @@ public final class BarrowsActivityPlugin extends ActivityPlugin {
p.getPacketDispatch().sendItemOnInterface(-1, 1, 24, index);
continue;
}
if (p.getLocation().getZ() == 0 && p.getAttribute("barrow:looted", false)) {
if (p.getLocation().getZ() == 0 && p.getAttribute("barrow:looted", false) && getWorldTicks() % 3 == 0) {
if (RandomFunction.random(15) == 0) {
p.getImpactHandler().manualHit(p, RandomFunction.random(5), HitsplatType.NORMAL);
Graphics.send(Graphics.create(405), p.getLocation());
}
}
if (p.getLocks().isLocked("barrow:drain") || RandomFunction.random(100) % 2 == 0) {
continue;
}
int drain = 8;
System.out.println(getWorldTicks() % 30);
//if (p.getLocks().isLocked("barrow:drain") || RandomFunction.random(100) % 2 == 0) {
// continue;
//}
for (boolean killed : p.getSavedData().getActivityData().getBarrowBrothers()) {
if (killed) {
drain += 1;
}
}
p.getSkills().decrementPrayerPoints(drain);
p.getLocks().lock("barrow:drain", (3 + RandomFunction.random(15)) * 3);
index = 1 + RandomFunction.random(6);
p.setAttribute("barrow:drain-index", index);
p.getPacketDispatch().sendItemZoomOnInterface(4761 + RandomFunction.random(12), 100, 24, index);
p.getPacketDispatch().sendAnimationInterface(9810, 24, index);
if(getWorldTicks() % 30 == 0){
p.getSkills().decrementPrayerPoints(drain);
p.getLocks().lock("barrow:drain", (3 + RandomFunction.random(15)) * 3);
index = 1 + RandomFunction.random(6);
p.setAttribute("barrow:drain-index", index);
p.getPacketDispatch().sendItemZoomOnInterface(4761 + RandomFunction.random(12), 100, 24, index);
p.getPacketDispatch().sendAnimationInterface(9810, 24, index);
}
}
return end;
}
@@ -1,5 +1,6 @@
package core.game.content.activity.guild;
import static api.ContentAPIKt.*;
import core.cache.def.impl.SceneryDefinition;
import core.game.content.global.action.ClimbActionHandler;
import core.game.content.global.action.DoorActionHandler;
@@ -14,6 +15,8 @@ import core.game.world.update.flag.context.Animation;
import core.plugin.Initializable;
import core.plugin.Plugin;
import static api.ContentAPIKt.getDynLevel;
/**
* Represents the plugin used for the mining guild.
* @author 'Vexia
@@ -34,7 +37,7 @@ public final class MiningGuildPlugin extends OptionHandler {
public boolean handle(Player player, Node node, String option) {
if (option.equals("climb-down")) {
if (player.getLocation().withinDistance(Location.create(3019, 3339, 0), 4)) {
if (player.getSkills().getStaticLevel(Skills.MINING) < 60) {
if (getDynLevel(player, Skills.MINING) < 60) {
player.getDialogueInterpreter().open(382, NPC.create(382, Location.create(0, 0, 0)), 1);
return true;
}
@@ -45,7 +48,7 @@ public final class MiningGuildPlugin extends OptionHandler {
return true;
}
if (option.equals("open")) {
if (player.getSkills().getStaticLevel(Skills.MINING) < 60) {
if (getDynLevel(player, Skills.MINING) < 60) {
player.getDialogueInterpreter().open(382, NPC.create(382, Location.create(0, 0, 0)), 1);
return true;
}
@@ -65,6 +65,7 @@ public enum Consumables {
TRIANGLE_SANDWICH(new Food(new int[] {6962}, new HealingEffect(6))),
SQUARE_SANDWICH(new Food(new int[] {6965}, new HealingEffect(6))),
SEAWEED_SANDWICH(new FakeConsumable(3168, new String[] {"You really, really do not want to eat that."})),
FROGBURGER(new Food(new int[] {10962}, new HealingEffect(2))),
/** Kebabs */
UGTHANKI_KEBAB(new Food(new int[] {1883}, new UgthankiKebabEffect())),
@@ -86,7 +87,7 @@ public enum Consumables {
STEW(new Food(new int[] {2003, 1923}, new HealingEffect(11))),
SPICY_STEW(new Food(new int[] {7479, 1923}, new HealingEffect(11))),
CURRY(new Food(new int[] {2011, 1923}, new HealingEffect(19))),
BANANA_STEW(new Food(new int[] {4016}, new HealingEffect(11))),
BANANA_STEW(new Food(new int[] {4016, 1923}, new HealingEffect(11))),
/** Pizzas */
PLAIN_PIZZA(new HalfableFood(new int[] {2289, 2291}, new HealingEffect(7))),
@@ -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 };
}
}
@@ -45,33 +45,38 @@ public final class BarkerDialogue extends DialoguePlugin {
@Override
public boolean handle(int interfaceId, int buttonId) {
switch (stage) {
case 0:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You are looking for clothes, yes? You look at my", "products! I have very many nice clothes, yes?");
stage = 1;
break;
case 1:
interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks.");
stage = 2;
break;
case 2:
switch (buttonId) {
case 0:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You are looking for clothes, yes? You look at my", "products! I have very many nice clothes, yes?");
stage = 1;
break;
case 1:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please.");
stage = 10;
interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks.");
stage = 2;
break;
case 2:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks.");
switch (buttonId) {
case 1:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please.");
stage = 10;
break;
case 2:
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks.");
stage = 15;
break;
}
break;
case 15:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Unfortunate for you, yes?", "Many bargains, won't find elsewhere!");
stage = 20;
break;
}
break;
case 20:
end();
break;
case 10:
end();
npc.openShop(player);
break;
case 20:
end();
break;
case 10:
end();
npc.openShop(player);
break;
}
return true;
}
@@ -45,7 +45,7 @@ public class CabinBoyJenkins extends DialoguePlugin {
quest = player.getQuestRepository().getQuest("Dragon Slayer");
switch (quest.getStage(player)) {
case 20:
npc("Ahoy ! Whay d'ye think of yer ship then?");
npc("Ahoy! Whay d'ye think of yer ship then?");
stage = 0;
break;
case 40:
@@ -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.
* @author 'Vexia
* @version 1.0
* Fixed a typo -Nuggles
*/
@Initializable
public final class CuffsDialogue extends DialoguePlugin {
@@ -54,7 +55,7 @@ public final class CuffsDialogue extends DialoguePlugin {
stage = 2;
break;
case 2:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nope, we'd never do anuthing like that.", "Just a band of innocent walkers, that's us.");
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nope, we'd never do anything like that.", "Just a band of innocent walkers, that's us.");
stage = 3;
break;
case 3:
@@ -7,6 +7,7 @@ import core.plugin.Initializable;
/**
* Represents the dialogue plugin used for the goblin village guard npc.
* @author jamix77
* Fixed a typo -Nuggles
*/
@Initializable
public final class GoblinVillageGuardDialogue extends DialoguePlugin {
@@ -47,7 +48,7 @@ public final class GoblinVillageGuardDialogue extends DialoguePlugin {
public boolean handle(int interfaceId, int buttonId) {
switch (stage) {
case 0:
npc("I know. We guards uaully stay by banks and shops,", "but I got sent all the way out here to keep an eye on","the brigands loitering just south of here.");
npc("I know. We guards usually stay by banks and shops,", "but I got sent all the way out here to keep an eye on","the brigands loitering just south of here.");
stage = 1;
break;
case 1:
@@ -59,7 +60,7 @@ public final class GoblinVillageGuardDialogue extends DialoguePlugin {
stage++;
break;
case 3:
player("Honestly people these days just don't know how to behave!");
player("Honestly, people these days just don't know how to behave!");
stage++;
break;
case 4:
@@ -180,7 +180,7 @@ public final class HansDialoguePlugin extends DialoguePlugin {
} else {
stage = 15;
}
break;
break;
}
npc("One moment, please...");
break;
@@ -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:
switch (buttonId) {
case 1:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Why are you called Longbow Ben?");
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why are you called Longbow Ben?");
stage = 100;
break;
case 2:
@@ -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;
break;
case 112:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm sure I could, but I don't see why. The vampie wasn't", "bothering me.");
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm sure I could, but I don't see why. The vampire wasn't", "bothering me.");
stage = 113;
break;
case 113:
@@ -127,7 +127,7 @@ public final class MissSchismDialogue extends DialoguePlugin {
stage = 212;
break;
case 212:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "And who'd have ever thought such a sweet old genleman", "would do such a thing?");
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "And who'd have ever thought such a sweet old gentleman", "would do such a thing?");
stage = 213;
break;
case 213:
@@ -150,12 +150,12 @@ public final class MissSchismDialogue extends DialoguePlugin {
stage = 22;
break;
case 22:
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I also do voluntary work for the Draynor Manor", "Restoration Fund. We're campagning to have", "Draynor manor turned into a museum before the wet-rot", "destroys it completely.");
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I also do voluntary work for the Draynor Manor", "Restoration Fund. We're campaigning to have", "Draynor manor turned into a museum before the wet-rot", "destroys it completely.");
stage = 23;
break;
case 23:
if(player.getQuestRepository().isComplete("Vampire Slayer")) {
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, now that I've cleared the vampire out of the manor,", "I guess you won't have to mutch trouble turning it into a", "museum.");
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, now that I've cleared the vampire out of the manor,", "I guess you won't have too much trouble turning it into a", "museum.");
stage = 24;
} else {
end();
@@ -185,3 +185,6 @@ public final class MissSchismDialogue extends DialoguePlugin {
return new int[] { 2634 };
}
}
/**
* Fixed Vexia's crappy English in some sentences
*/
@@ -34,7 +34,7 @@ public final class MonkeyDialogue extends DialoguePlugin {
@Override
public boolean open(Object... args) {
player("Who's a cute little monkey?");
player("Hey little man, how's it goin'?");
return true;
}
@@ -46,15 +46,18 @@ public final class MonkeyDialogue extends DialoguePlugin {
stage++;
break;
case 1:
player(FacialExpression.HALF_GUILTY,"Yeah.");
stage = 5;
break;
case 5:
end();
break;
}
return true;
}
@Override
public int[] getIds() {
return new int[] { 2301 };
}
}
}
@@ -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 The previous notice is dubious
* @notice Spirit shard packs were released 9 September 2009, outside of 530. Option removed.
* Fixed multiple typos -Nuggles
*/
@Initializable
public final class PikkupstixDialogue extends DialoguePlugin {
@@ -438,7 +439,7 @@ public final class PikkupstixDialogue extends DialoguePlugin {
stage = 6;
break;
case 6:
npc("Well, for a start, it has the ability to perform a", "Summoning scroll that forces the oppnents to flee. That is", "what it will use on the giant wolpertinger, with the", "difference being that the giant wolpertinger will be so");
npc("Well, for a start, it has the ability to perform a", "Summoning scroll that forces the opponents to flee. That is", "what it will use on the giant wolpertinger, with the", "difference being that the giant wolpertinger will be so");
stage = 7;
break;
case 7:
@@ -624,10 +625,10 @@ public final class PikkupstixDialogue extends DialoguePlugin {
switch (stage) {
case 0:
if (player.getSkills().getStaticLevel(Skills.SUMMONING) == 99) {
options("So, what's Summmoning all about, then?", "Can I buy some Summoning supplies?", "Can I buy a Summoning skillcape?");
options("So, what's Summoning all about, then?", "Can I buy some Summoning supplies?", "Can I buy a Summoning skillcape?");
stage = 600;
} else {
options("So, what's Summmoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes.");
options("So, what's Summoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes.");
stage = 1;
}
break;
@@ -685,7 +686,7 @@ public final class PikkupstixDialogue extends DialoguePlugin {
stage = 102;
break;
case 102:
npc("These animals can also perform a special move, wich is", "specific to the species. For example, a spirit wolf can", "perform the Howl special move if you are holding the", "correct Howl scroll.");
npc("These animals can also perform a special move, which is", "specific to the species. For example, a spirit wolf can", "perform the Howl special move if you are holding the", "correct Howl scroll.");
stage = 103;
break;
case 103:
@@ -743,7 +744,7 @@ public final class PikkupstixDialogue extends DialoguePlugin {
stage = 401;
break;
case 401:
interpreter.sendOptions("Choose an option:", "So, what's Summmoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes.");
interpreter.sendOptions("Choose an option:", "So, what's Summoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes.");
stage = 1;
break;
case 600:
@@ -17,43 +17,45 @@ public enum BirdNest {
SEED(new ChanceItem(5073, 1, 65),
new ChanceItem(Items.ACORN_5312, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.APPLE_TREE_SEED_5283, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.WILLOW_SEED_5313, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.BANANA_TREE_SEED_5284, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.ORANGE_TREE_SEED_5285, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.WILLOW_SEED_5313, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.CURRY_TREE_SEED_5286, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.MAPLE_SEED_5314, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.PINEAPPLE_SEED_5287, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.PAPAYA_TREE_SEED_5288, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.ORANGE_TREE_SEED_5285, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.CURRY_TREE_SEED_5286, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.MAPLE_SEED_5314, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.PINEAPPLE_SEED_5287, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.PAPAYA_TREE_SEED_5288, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.PALM_TREE_SEED_5289, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.CALQUAT_TREE_SEED_5290, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3]),
new ChanceItem(Items.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3])),
new ChanceItem(Items.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3]),
new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3])),
RING(new ChanceItem(5074, 1, 30),
new ChanceItem(Items.GOLD_RING_1635, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.SAPPHIRE_RING_1637, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.EMERALD_RING_1639, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.RUBY_RING_1641, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.DIAMOND_RING_1643, 1, NPCDropTables.DROP_RATES[3])),
new ChanceItem(Items.EMERALD_RING_1639, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.RUBY_RING_1641, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.DIAMOND_RING_1643, 1, NPCDropTables.DROP_RATES[2])),
RED(new ChanceItem(5070, 1, 5), new ChanceItem(5076)),
GREEN(new ChanceItem(5071, 1, 5), new ChanceItem(5078)),
BLUE(new ChanceItem(5072, 1, 5), new ChanceItem(5077)),
RAVEN(new ChanceItem(11966, 1, 5), new ChanceItem(11964)),
WYSON(new ChanceItem(7413, 1, 1),
new ChanceItem(Items.CABBAGE_SEED_5324, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.SWEETCORN_SEED_5320, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.TOMATO_SEED_5322, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.ONION_SEED_5319, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.POTATO_SEED_5318, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.LIMPWURT_SEED_5100, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.STRAWBERRY_SEED_5323, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.TOADFLAX_SEED_5296, 1, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.WATERMELON_SEED_5321, 1, NPCDropTables.DROP_RATES[1]),
new ChanceItem(Items.POTATO_SEED_5318, 14, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.SWEETCORN_SEED_5320, 3, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.TOMATO_SEED_5322, 6, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.CABBAGE_SEED_5324, 9, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.LIMPWURT_SEED_5100, 2, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.ONION_SEED_5319, 11, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.STRAWBERRY_SEED_5323, 3, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.WATERMELON_SEED_5321, 2, NPCDropTables.DROP_RATES[0]),
new ChanceItem(Items.ACORN_5312, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.RANARR_SEED_5295, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.WILLOW_SEED_5313, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.MAPLE_SEED_5314, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[3]),
new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3]));
new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[2]),
new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3]),
new ChanceItem(Items.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3]));
/**
* The random nest items.
@@ -12,7 +12,7 @@ import core.game.world.map.Location;
import core.game.world.map.RegionManager;
import core.game.world.update.flag.context.Animation;
import core.plugin.Initializable;
import rs09.game.content.dialogue.DukeHoracioDialogue;
import rs09.game.content.dialogue.region.lumbridge.DukeHoracioDialogue;
import rs09.game.content.quest.free.dragonslayer.NedDialogue;
import rs09.game.world.GameWorld;
import rs09.plugin.PluginManager;
@@ -4,7 +4,7 @@ import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.quest.Quest;
import core.game.node.item.Item;
import core.plugin.Initializable;
import rs09.game.content.dialogue.KingRoaldDialogue;
import rs09.game.content.dialogue.region.varrock.KingRoaldDialogue;
import rs09.plugin.PluginManager;
/**
@@ -8,7 +8,7 @@ import core.game.node.entity.skill.Skills;
@Initializable
public class FishingContest extends Quest {
public FishingContest(){super("Fishing Contest",62,61,1,11,0,1,5);}
public FishingContest(){super("Fishing Contest",26,61,1,11,0,1,5);}
public static final Item FISHING_ROD = new Item(307);
public static final Item FISHING_PASS = new Item(27);
public static final Item RED_VINE_WORM = new Item(25);
@@ -3,6 +3,7 @@ package core.game.content.quest.members.merlinscrystal;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.quest.Quest;
import core.plugin.Initializable;
import rs09.game.content.quest.members.merlinsquest.TheLadyOfTheLake;
import rs09.plugin.PluginManager;
/**
@@ -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.
* @author Vexia
* @editor Nuggles
* fixed the default dialogue, the NPC and Player tags were swapped.
*/
public class SurokMagisDialogue extends DialoguePlugin {
@@ -105,31 +107,31 @@ public class SurokMagisDialogue extends DialoguePlugin {
default:
switch (stage) {
case 0:
player("What do you want? ...Oh, wait. I know! You're", "probably just like all the others, aren't you? After some", "fancy spell or potion from me, I bet!");
npc("What do you want? ...Oh, wait. I know! You're", "probably just like all the others, aren't you? After some", "fancy spell or potion from me, I bet!");
stage = 1;
break;
case 1:
npc("No! at least, I don't think so. What sort of spells", "do you have?");
player("No! at least, I don't think so. What sort of spells", "do you have?");
stage = 2;
break;
case 2:
player("Hah! I knew it! I expect you want my Aphro-Dizzy-", "Yak spell! Want someone to fall madly in love with you,", "eh?");
npc("Hah! I knew it! I expect you want my Aphro-Dizzy-", "Yak spell! Want someone to fall madly in love with you,", "eh?");
stage = 3;
break;
case 3:
npc("That spell sounds very interesting, but I didn't mean to", "disturb you!");
player("That spell sounds very interesting, but I didn't mean to", "disturb you!");
stage = 4;
break;
case 4:
player("Well, I see that you do have some manners. I'm glad", "to see that you use them.");
npc("Well, I see that you do have some manners. I'm glad", "to see that you use them.");
stage = 5;
break;
case 5:
player("Now, if it's all the same, I am very bust at the", "moment. Come back another time", "please and thank you.");
npc("Now, if it's all the same, I am very busy at the", "moment. Come back another time", "please and thank you.");
stage = 6;
break;
case 6:
npc("Yes, of course!");
player("Yes, of course!");
stage = 7;
break;
case 7:
@@ -1,10 +1,14 @@
package core.game.content.zone.rellekka;
import core.cache.def.impl.SceneryDefinition;
import core.game.system.task.LocationLogoutTask;
import core.game.system.task.LogoutTask;
import core.game.system.task.Pulse;
import core.plugin.Initializable;
import core.game.node.entity.skill.agility.AgilityHandler;
import core.game.interaction.Option;
import core.game.interaction.OptionHandler;
import core.game.component.Component;
import core.game.node.Node;
import core.game.node.entity.Entity;
import core.game.node.entity.impl.ForceMovement;
@@ -17,6 +21,7 @@ import core.game.world.map.zone.ZoneBorders;
import core.game.world.map.zone.ZoneBuilder;
import core.game.world.update.flag.context.Animation;
import core.plugin.Plugin;
import rs09.game.world.GameWorld;
import rs09.plugin.PluginManager;
/**
@@ -36,7 +41,6 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
ZoneBuilder.configure(this);
PluginManager.definePlugin(new SailorDialogue());
PluginManager.definePlugin(new JarvaldDialogue());
PluginManager.definePlugins(new RellekaOptionHandler(), new MariaGunnarsDialogue());
PluginManager.definePlugin(new OptionHandler() {
@@ -72,21 +76,9 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
* (option.equals("Trade") ? "buy clothes here" :
* "change their shoes here") + "."); return true;
*/
case 4165:
player.getDialogueInterpreter().open(1288);
return true;
case 4166:
player.sendMessage("This door is locked tightly shut.");
return true;
case 1288:
player.getDialogueInterpreter().sendDialogues((NPC) target, null, "I have no interest in talking to you just now", "outerlander.");
return true;
case 34286:
player.getDialogueInterpreter().sendDialogues(1289, null, "Outerlander... do not test my patience. I do not take", "kindly to people wandering in here and acting as though", "they own the place.");
return true;
case 4148:
player.getDialogueInterpreter().sendDialogues(1278, null, "Hey, outerlander. You can't go through there. Talent", "only, backstage.");
return true;
//case 4148:
// player.getDialogueInterpreter().sendDialogues(1278, null, "Hey, outerlander. You can't go through there. Talent", "only, backstage.");
// return true;
case 100:
player.getDialogueInterpreter().sendDialogue("You try to open the trapdoor but it won't budge! It looks like the", "trapdoor can only be opened from the other side.");
return true;
@@ -114,6 +106,35 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
register(new ZoneBorders(2602, 3639, 2739, 3741));
}
/**
* Sails a player using the relleka ships.
* @param player the player.
* @param name the name.
* @param destination the destination.
*/
public static void sail(final Player player, final String name, final Location destination) {
player.lock();
player.getInterfaceManager().open(new Component(224));
player.addExtension(LogoutTask.class, new LocationLogoutTask(5, destination));
GameWorld.getPulser().submit(new Pulse(1, player) {
int count;
@Override
public boolean pulse() {
switch (++count) {
case 5:
player.unlock();
player.getInterfaceManager().close();
player.getProperties().setTeleportLocation(destination);
player.getDialogueInterpreter().sendDialogue("The ship arrives at " + name + ".");
return true;
}
return false;
}
});
}
/**
* Handles options related to relleka.
* @author Vexia
@@ -126,6 +147,7 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
SceneryDefinition.forId(4615).getHandlers().put("option:cross", this);
SceneryDefinition.forId(5847).getHandlers().put("option:climb-over", this);
SceneryDefinition.forId(5008).getHandlers().put("option:enter",this);
SceneryDefinition.forId(15116).getHandlers().put("option:climb-down", this);
return this;
}
@@ -154,6 +176,13 @@ public final class RellekkaZone extends MapZone implements Plugin<Object> {
break;
}
break;
case "climb-down":
switch(node.getId()){
case 15116:
player.getProperties().setTeleportLocation(Location.create(2509, 10245, 0));
break;
}
break;
}
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 {
ItemDefinition.setOptionHandler("empty", this);
ItemDefinition.setOptionHandler("empty dish", this);
ItemDefinition.setOptionHandler("empty bowl", this);
return this;
}
public enum EmptyItem{
@@ -57,10 +58,19 @@ public final class EmptyOptionPlugin extends OptionHandler {
BUCKET_OF_SUPERCOMPOST(6034, BUCKET, "You empty the bucket of supercompost."),
BUCKET_OF_SLIME(4286, BUCKET, "You empty the contents of the bucket on the floor."),
VIAL_OF_WATER(227, VIAL, "You empty the vial."),
BOWL_OF_SAND(1921, 1923, "You empty the contents of the bowl onto the floor."),
BOWL_OF_WATER(1921, 1923, "You empty the contents of the bowl onto the floor."),
JUG_OF_WATER(1937, 1935, "You empty the contents of the jug onto the floor."),
BURNT_PIE(2329, 2313, "You empty the pie dish."),
POTION(91, VIAL,null);
POTION(91, VIAL,null),
BURNT_STEW(2005, 1923, "You empty the contents of the bowl onto the floor."),
NETTLE_TEA(4239, 1923, "You empty the contents of the bowl onto the floor."),
NETTLE_WATER(4237, 1923, "You empty the contents of the bowl onto the floor."),
NETTLE_TEA_MILKY(4240, 1923, "You empty the contents of the bowl onto the floor."),
BURNT_CURRY(2013, 1923, "You empty the contents of the bowl onto the floor."),
BURNT_GNOMEBOWL(2175, 2166, "You empty the contents of the gnomebowl onto the floor."),
BURNT_EGG(7090, 1923, "You empty the contents of the bowl onto the floor."),
BURNT_ONION(7092, 1923, "You empty the contents of the bowl onto the floor."),
BURNT_MUSHROOM(7094, 1923, "You empty the contents of the bowl onto the floor.");
int fullId, emptyId;
String emptyMessage;
@@ -24,6 +24,7 @@ public class SpadeDigOptionPlugin extends OptionHandler {
@Override
public boolean handle(final Player player, Node node, String option) {
player.getAudioManager().send(1470,1,1);
if (!DigSpadeHandler.dig(player)) {
player.sendMessage("You dig but find nothing.");
}
@@ -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.
*/
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.
@@ -4,6 +4,7 @@ import core.game.component.Component;
import core.game.component.ComponentDefinition;
import core.game.component.ComponentPlugin;
import core.game.content.global.action.DoorActionHandler;
import core.game.node.Node;
import core.game.node.entity.impl.ForceMovement;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.audio.Audio;
@@ -72,6 +73,31 @@ public final class WildernessInterfacePlugin extends ComponentPlugin {
ActivityManager.register(new BountyHunterActivity(CraterType.HIGH_LEVEL));
}*/
}
public static void handleBotDitch(final Player player, Node node) {
Scenery ditch = node.asScenery();
player.removeAttribute("wildy_ditch");
Location l = ditch.getLocation();
int x = player.getLocation().getX();
int y = player.getLocation().getY();
if (ditch.getRotation() % 2 == 0) {
if (y <= l.getY()) {
ForceMovement.run(player, Location.create(x, l.getY() - 1, 0), Location.create(x, l.getY() + 2, 0), ANIMATION, 20).setEndAnimation(null);
} else {
ForceMovement.run(player, Location.create(x, l.getY() + 2, 0), Location.create(x, l.getY() - 1, 0), ANIMATION, 20).setEndAnimation(null);
}
} else {
if (x > l.getX()) {
ForceMovement.run(player, Location.create(l.getX() + 2, y, 0), Location.create(l.getX() - 1, y, 0), ANIMATION, 20).setEndAnimation(null);
} else {
ForceMovement.run(player, Location.create(l.getX() - 1, y, 0), Location.create(l.getX() + 2, y, 0), ANIMATION, 20).setEndAnimation(null);
}
}
player.getAudioManager().send(new Audio(2462, 10, 30));
/*if (GameWorld.getSettings().isPvp()) {
ActivityManager.register(new BountyHunterActivity(CraterType.MID_LEVEL));
ActivityManager.register(new BountyHunterActivity(CraterType.HIGH_LEVEL));
}*/
}
public static void handleGate(final Player player){
Scenery gate = player.getAttribute("wildy_gate");
// Cleanup
@@ -211,11 +211,7 @@ public final class GiantMoleNPC extends AbstractNPC {
@Override
public void onImpact(final Entity entity, BattleState state) {
if (!getLocks().isInteractionLocked()) {
int chance = 15;
if (getSkills().getLifepoints() < getSkills().getMaximumLifepoints() >> 1) {
chance *= 3;
}
if (RandomFunction.randomize(100) < chance && inCombat()) {
if (RandomFunction.randomize(100) < 24 && inCombat() && getSkills().getLifepoints() < 100 && getSkills().getLifepoints() > 5){
dig();
return;
}
@@ -243,6 +239,7 @@ public final class GiantMoleNPC extends AbstractNPC {
public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) {
if (button == 17) {
player.getProperties().setTeleportLocation(Location.create(1752, 5237, 0));
player.getAudioManager().send(1384);
player.getPacketDispatch().sendMessage("You seem to have dropped down into a network of mole tunnels.");
if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0, 5)) {
@@ -8,6 +8,7 @@ import core.game.node.entity.combat.equipment.SwitchAttack;
import core.game.node.entity.impl.Projectile;
import core.game.node.entity.npc.AbstractNPC;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.audio.Audio;
import core.game.node.item.Item;
import core.game.world.map.Location;
import core.game.world.map.RegionManager;
@@ -62,7 +63,7 @@ public class ChaosElementalNPC extends AbstractNPC {
@Override
public void sendImpact(BattleState state) {
if (state.getEstimatedHit() > 28) {
state.setEstimatedHit(RandomFunction.random(20, 28));
state.setEstimatedHit(RandomFunction.random(20, 28)); //possibly absolutely mental "haha random" damage adjustment. not sure. - crash
}
super.sendImpact(state);
}
@@ -135,7 +136,11 @@ public class ChaosElementalNPC extends AbstractNPC {
if (player == null) {
return;
}
if (attack.getProjectile().getProjectileId() == 554) {
if (attack.getProjectile().getProjectileId() == 557) {
player.getAudioManager().send(new Audio(350), true); // C. Elemental Discord Impact SFX
}
else if (attack.getProjectile().getProjectileId() == 554) {
player.getAudioManager().send(new Audio(346), true); // C. Elemental Confusion Impact SFX
Location loc = getRandomLoc(entity);
while (!RegionManager.isTeleportPermitted(loc) || RegionManager.getObject(loc) != null) {
loc = getRandomLoc(entity);
@@ -145,6 +150,7 @@ public class ChaosElementalNPC extends AbstractNPC {
}
player.teleport(loc);
} else if (attack.getProjectile().getProjectileId() == 551) {
player.getAudioManager().send(new Audio(353), true); // C. Elemental Madness Impact SFX
if (player.getInventory().freeSlots() < 1 || player.getEquipment().itemCount() < 1) {
return;
}
@@ -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;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.summoning.familiar.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
import core.game.node.entity.Entity;
@@ -31,6 +33,7 @@ public class ArcticBearNPC extends Familiar {
*/
public ArcticBearNPC(Player owner, int id) {
super(owner, id, 2800, 12057, 6, WeaponInterface.STYLE_CONTROLLED);
boosts.add(new SkillBonus(Skills.HUNTER, 7));
}
@Override
@@ -16,6 +16,7 @@ import core.game.world.update.flag.player.FaceLocationFlag;
import core.plugin.Initializable;
import core.plugin.Plugin;
import rs09.plugin.PluginManager;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.firemaking.FireMakingPulse;
import core.game.node.entity.skill.firemaking.Log;
@@ -53,6 +54,7 @@ public class ForgeRegentNPC extends Familiar {
*/
public ForgeRegentNPC(Player owner, int id) {
super(owner, id, 4500, 12782, 6, WeaponInterface.STYLE_RANGE_ACCURATE);
boosts.add(new SkillBonus(Skills.FIREMAKING, 4));
}
@Override
@@ -30,6 +30,7 @@ public class LavaTitanNPC extends Familiar {
public LavaTitanNPC(Player owner, int id) {
super(owner, id, 6100, 12788, 4, WeaponInterface.STYLE_AGGRESSIVE);
boosts.add(new SkillBonus(Skills.MINING, 10));
boosts.add(new SkillBonus(Skills.FIREMAKING, 10));
}
@Override
@@ -1,5 +1,6 @@
package core.game.node.entity.npc.familiar;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.crafting.gem.Gems;
import core.game.node.entity.skill.summoning.familiar.Familiar;
@@ -38,6 +39,7 @@ public class MagpieNPC extends Forager {
*/
public MagpieNPC(Player owner, int id) {
super(owner, id, 3400, 12041, 3, ITEMS);
boosts.add(new SkillBonus(Skills.THIEVING, 3));
}
@Override
@@ -2,6 +2,7 @@ package core.game.node.entity.npc.familiar;
import core.game.node.entity.player.link.diary.DiaryType;
import core.plugin.Initializable;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting;
import core.game.node.entity.skill.firemaking.FireMakingPulse;
@@ -53,6 +54,7 @@ public class PyreLordNPC extends Familiar {
*/
public PyreLordNPC(Player owner, int id) {
super(owner, id, 3200, 12816, 6, WeaponInterface.STYLE_AGGRESSIVE);
boosts.add(new SkillBonus(Skills.FIREMAKING, 3));
}
@Override
@@ -1,5 +1,7 @@
package core.game.node.entity.npc.familiar;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.summoning.familiar.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
import core.game.node.entity.combat.equipment.WeaponInterface;
@@ -27,6 +29,7 @@ public class SpiritGraahkNPC extends Familiar {
*/
public SpiritGraahkNPC(Player owner, int id) {
super(owner, id, 4900, 12810, 3, WeaponInterface.STYLE_AGGRESSIVE);
boosts.add(new SkillBonus(Skills.HUNTER, 5));
}
@Override
@@ -1,5 +1,7 @@
package core.game.node.entity.npc.familiar;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.summoning.familiar.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
import core.game.node.entity.combat.equipment.WeaponInterface;
@@ -27,6 +29,7 @@ public class SpiritKyattNPC extends Familiar {
*/
public SpiritKyattNPC(Player owner, int id) {
super(owner, id, 4900, 12812, 3, WeaponInterface.STYLE_ACCURATE);
boosts.add(new SkillBonus(Skills.HUNTER, 5));
}
@Override
@@ -1,6 +1,7 @@
package core.game.node.entity.npc.familiar;
import core.plugin.Initializable;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.summoning.familiar.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
@@ -31,6 +32,7 @@ public class SpiritLarupiaNPC extends Familiar {
*/
public SpiritLarupiaNPC(Player owner, int id) {
super(owner, id, 4900, 12784, 6, WeaponInterface.STYLE_CONTROLLED);
boosts.add(new SkillBonus(Skills.HUNTER, 5));
}
@Override
@@ -2,6 +2,7 @@ package core.game.node.entity.npc.familiar;
import core.cache.def.impl.NPCDefinition;
import core.plugin.Initializable;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.summoning.familiar.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
@@ -97,6 +98,7 @@ public final class VoidFamiliarNPC implements Plugin<Object> {
*/
public VoidRavagerNPC(Player owner, int id) {
super(owner, id, 2700, 12818, 3, WeaponInterface.STYLE_AGGRESSIVE, ITEMS);
boosts.add(new SkillBonus(Skills.MINING, 1));
}
@Override
@@ -1,6 +1,7 @@
package core.game.node.entity.npc.familiar;
import core.plugin.Initializable;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.skill.summoning.familiar.Familiar;
import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial;
@@ -30,6 +31,7 @@ public class WolpertingerNPC extends Familiar {
*/
public WolpertingerNPC(Player owner, int id) {
super(owner, id, 6200, 12089, 1, WeaponInterface.STYLE_CAST);
boosts.add(new SkillBonus(Skills.HUNTER, 5));
}
@Override
@@ -16,7 +16,7 @@ public enum BuildHotspot {
/**
* Low level garden hotspots.
*/
CENTREPIECE_1(15361, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.PORTAL, Decoration.ROCK, Decoration.POND, Decoration.IMP_STATUE, Decoration.DUNGEON_ENTRANCE),
CENTREPIECE_1(15361, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.PORTAL, Decoration.ROCK, Decoration.POND, Decoration.IMP_STATUE, Decoration.SMALL_OBELISK, Decoration.DUNGEON_ENTRANCE),
BIG_TREE_1(15362, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.BIG_DEAD_TREE, Decoration.BIG_TREE, Decoration.BIG_OAK_TREE, Decoration.BIG_WILLOW_TREE, Decoration.BIG_MAPLE_TREE, Decoration.BIG_YEW_TREE, Decoration.BIG_MAGIC_TREE),
TREE_1(15363, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.DEAD_TREE, Decoration.TREE, Decoration.OAK_TREE, Decoration.WILLOW_TREE, Decoration.MAPLE_TREE, Decoration.YEW_TREE, Decoration.MAGIC_TREE),
BIG_PLANT_1(15364, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.FERN, Decoration.BUSH, Decoration.TALL_PLANT),
@@ -85,21 +85,21 @@ public final class BuildingUtils {
int c261Value = 0;
for (int i = 0; i < 7; i++) {
int itemsStringOffset = 97 + (i * 5);
for (int menuIndex = 0; menuIndex < 7; menuIndex++) {
int itemsStringOffset = 97 + (menuIndex * 5);
//97 +
if (i >= hotspot.getDecorations().length || (hotspot.getDecorations()[i] != null && hotspot.getDecorations()[i].isInvisibleNode())) {
if (menuIndex >= hotspot.getDecorations().length || (hotspot.getDecorations()[menuIndex] != null && hotspot.getDecorations()[menuIndex].isInvisibleNode())) {
for (int j = 0; j < 5; j++) {
player.getPacketDispatch().sendString("", 396, itemsStringOffset + j);
}
player.getPacketDispatch().sendString("", 396, 140 + i);
c261Value += (1 << (i + 1));
player.getPacketDispatch().sendString("", 396, 140 + menuIndex);
c261Value += (1 << (menuIndex + 1));
continue;
}
Decoration decoration = hotspot.getDecorations()[i];
items[BUILD_INDEXES[i]] = new Item(decoration.getInterfaceItem());
Decoration decoration = hotspot.getDecorations()[menuIndex];
items[BUILD_INDEXES[menuIndex]] = new Item(decoration.getInterfaceItem());
player.getPacketDispatch().sendString(ItemDefinition.forId(decoration.getInterfaceItem()).getName(), 396, itemsStringOffset);
boolean hasRequirements = player.getSkills().getLevel(Skills.CONSTRUCTION) >= decoration.getLevel();
for (int j = 0; j < 4; j++) {
@@ -127,14 +127,16 @@ public final class BuildingUtils {
continue;
}*/
player.getPacketDispatch().sendString(s, 396, (itemsStringOffset + 1) + j);
if (hasRequirements)
c261Value += (1 << (i + 1));
}
}
player.getConfigManager().set(1485 + i, hasRequirements || player.isStaff() ? 1 : 0);
player.getPacketDispatch().sendString("Lvl " + decoration.getLevel(), 396, 140 + i);
if (hasRequirements) {
c261Value += (1 << (menuIndex + 1));
}
player.getConfigManager().set(1485 + menuIndex, hasRequirements || player.isStaff() ? 1 : 0);
player.getPacketDispatch().sendString("Level " + decoration.getLevel(), 396, 140 + menuIndex);
//player.getPacketDispatch().sendItemZoomOnInterface(items[i].protocol(), 50000, 396, 49 + i);
}
System.out.println(c261Value);
player.getConfigManager().set(261, c261Value);
PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 396, 132, 8, items, false));
}
@@ -21,6 +21,7 @@ public enum Decoration {
ROCK(13406, 8169, 5, 100.0, new Item(3420, 5)),
POND(13407, 8170, 10, 100.0, new Item(1761, 10)),
IMP_STATUE(13408, 8171, 15, 150.0, new Item(3420, 5), new Item(1761, 5)),
SMALL_OBELISK(42004, 14657, 41, 676, new Item(8786, 1), new Item(12183, 1000), new Item(12160, 10), new Item(12163, 10)),
DUNGEON_ENTRANCE(13409, 8172, 70, 500.0, new Item(8786)),
@@ -20,7 +20,7 @@ public enum FishingOption {
CRAYFISH_CAGE(new Item(13431), 1, Animation.create(619), null, "cage", Fish.CRAYFISH),
SMALL_NET(new Item(303), 1, Animation.create(621), null, "net", Fish.SHRIMP, Fish.ANCHOVIE),
BAIT(new Item(307), 5, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.SARDINE, Fish.HERRING),
BAIT(new Item(307), 5, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.SARDINE, Fish.HERRING),
LURE(new Item(309), 20, new Animation(622), new Item[]{new Item(Items.FEATHER_314), new Item(Items.STRIPY_FEATHER_10087)}, "lure", Fish.TROUT, Fish.SALMON, Fish.RAINBOW_FISH),
L_BAIT(new Item(307), 25, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.PIKE),
CAGE(new Item(301), 40, Animation.create(619), null, "cage", Fish.LOBSTER),
@@ -29,10 +29,13 @@ public enum FishingOption {
BIG_NET(new Item(305), 16, Animation.create(620), null, "net", Fish.MACKEREL, Fish.COD, Fish.BASS, Fish.SEAWEED),
N_HARPOON(new Item(311), 76, Animation.create(618), null, "harpoon", Fish.SHARK),
H_NET(new Item(303), 62, Animation.create(621), null, "net", Fish.MONKFISH),
MORTMYRE_ROD(new Item(307), 5, Animation.create(622), new Item[]{new Item(313)},"bait", Fish.SLIMY_EEL),
LUMBDSWAMP_ROD(new Item(307), 5, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.SLIMY_EEL, Fish.FROG_SPAWN),
KBWANJI_NET(new Item(Items.SMALL_FISHING_NET_303), 5, Animation.create(621), null, "net", Fish.KARAMBWANJI),
KARAMBWAN_VES(new Item(Items.KARAMBWAN_VESSEL_3157), 65, Animation.create(1193), new Item[]{new Item(Items.RAW_KARAMBWANJI_3150)}, "fish", Fish.KARAMBWAN);
KARAMBWAN_VES(new Item(Items.KARAMBWAN_VESSEL_3157), 65, Animation.create(1193), new Item[]{new Item(Items.RAW_KARAMBWANJI_3150)}, "fish", Fish.KARAMBWAN),
OILY_FISHING_ROD(new Item(Items.OILY_FISHING_ROD_1585), 53, Animation.create(622), new Item[]{new Item(313)}, "bait", Fish.LAVA_EEL);
public static HashMap<String,FishingOption> nameMap = new HashMap<>();
public static final HashMap<String,FishingOption> nameMap = new HashMap<>();
static{
for(FishingOption option : FishingOption.values()){
nameMap.putIfAbsent(option.name,option);
@@ -79,18 +82,13 @@ public enum FishingOption {
* @param animation The animation.
* @param fish The fish to catch.
*/
private FishingOption(Item tool, int level, Animation animation, Item[] bait, String name, Fish... fish) {
FishingOption(Item tool, int level, Animation animation, Item[] bait, String name, Fish... fish) {
this.tool = tool;
this.level = level;
this.animation = animation;
this.bait = bait;
this.name = name;
Arrays.sort(fish, new Comparator<Fish>() {
@Override
public int compare(Fish x, Fish y) {
return y.getLevel() - x.getLevel();
}
});
Arrays.sort(fish, (x, y) -> y.getLevel() - x.getLevel());
this.fish = fish;
}
@@ -8,25 +8,25 @@ import java.util.HashMap;
*/
public enum FishingSpot {
NET_BAIT(new int[] { 952, 316, 319, 320, 323, 325, 326, 327, 330, 332, 404, 1331, 2067, 2068, 2724, 4908, 5748, 5749, 7045 }, FishingOption.SMALL_NET, FishingOption.BAIT),
NET_BAIT(new int[] { 952, 316, 319, 320, 323, 325, 326, 327, 330, 332, 404, 1331, 2724, 4908, 7045 }, FishingOption.SMALL_NET, FishingOption.BAIT),
LURE_BAIT(new int[] { 309, 310, 311, 314, 315, 317, 318, 328, 329, 331, 403, 927, 1189, 1190, 3019 }, FishingOption.LURE, FishingOption.L_BAIT),
CAGE_HARPOON(new int[] { 312, 321, 324, 333, 405, 1332, 1399, 3804, 5470, 7046}, FishingOption.CAGE, FishingOption.HARPOON),
NET_HARPOON(new int[] { 313, 322, 334, 406, 1191, 1333, 1405, 1406, 3574, 3575, 5471, 7044 }, FishingOption.BIG_NET, FishingOption.N_HARPOON),
HARPOON_NET(new int[] { 3848, 3849 }, FishingOption.HARPOON, FishingOption.H_NET, FishingOption.BARB_HARPOON),
SPOT_MORTMYRE(new int[] {5748, 5749}, FishingOption.MORTMYRE_ROD),
SPOT_LUMDSAWMP(new int[] {2067, 2068}, FishingOption.LUMBDSWAMP_ROD),
SPOT_KBWANJI(new int[] {1174}, FishingOption.KBWANJI_NET),
SPOT_KARAMBWAN(new int[] {1177}, FishingOption.KARAMBWAN_VES);
SPOT_KARAMBWAN(new int[] {1177}, FishingOption.KARAMBWAN_VES),
BAIT_EELS(new int[] {800}, FishingOption.OILY_FISHING_ROD);
public static HashMap<Integer,FishingSpot> spotMap = new HashMap<>();
static{
FishingSpot[] spots = values();
int spotsLength = spots.length;
for (int x = 0; x < spotsLength; x++) {
FishingSpot spot = spots[x];
for (FishingSpot spot : spots) {
int[] spotIds = spot.ids;
int spotIdsLength = spotIds.length;
for (int y = 0; y < spotIdsLength; y++) {
spotMap.putIfAbsent(spotIds[y],spot);
for (int spotId : spotIds) {
spotMap.putIfAbsent(spotId, spot);
}
}
}
@@ -50,7 +50,7 @@ public enum FishingSpot {
* Constructs a new {@code FishingSpot} {@code Object}.
* @param ids The NPC ids.
*/
private FishingSpot(int[] ids, FishingOption... options) {
FishingSpot(int[] ids, FishingOption... options) {
this.ids = ids;
this.options = options;
}
@@ -40,7 +40,7 @@ public class StringPulse extends SkillPulse<Item> {
@Override
public boolean checkRequirements() {
if (getDelay() == 1) {
setDelay(bow.string == 1777 ? 9 : 7);
setDelay(bow.string == 1777 ? 2 : 1);
}
if (player.getSkills().getLevel(Skills.FLETCHING) < bow.level) {
player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + bow.level + " to string this bow.");
@@ -180,6 +180,11 @@ public final class PotionDecantingPlugin extends UseWithHandler {
if (flagged(itemDose, otherDose)) {
return false;
}
if (item.getId() == item.getNoteChange() || other.getId() == item.getNoteChange()) {
return false;
}
final int[] newDoses = getDoses(itemDose, otherDose);
if (itemDose == 4 && otherDose == 0 || otherDose == 4 && itemDose == 0) {
player.getInventory().replace(getItem(item.getName().contains("Vial") ? otherName : itemName, newDoses[1]), item.getSlot());
@@ -7,7 +7,25 @@ import core.game.node.item.Item;
* @author 'Vexia
*/
public enum UnfinishedPotion {
GUAM(Herbs.GUAM.getProduct(), 3, new Item(91)), MARRENTILL(Herbs.MARRENTILL.getProduct(), 5, new Item(93)), TARROMIN(Herbs.TARROMIN.getProduct(), 12, new Item(95)), HARRALANDER(Herbs.HARRALANDER.getProduct(), 22, new Item(97)), RANARR(Herbs.RANARR.getProduct(), 30, new Item(99)), TOADFLAX(Herbs.TOADFLAX.getProduct(), 34, new Item(3002)), SPIRIT_WEED(Herbs.SPIRIT_WEED.getProduct(), 40, new Item(12181)), IRIT(Herbs.IRIT.getProduct(), 45, new Item(101)), AVANTOE(Herbs.AVANTOE.getProduct(), 50, new Item(103)), KWUARM(Herbs.KWUARM.getProduct(), 55, new Item(105)), SNAPDRAGON(Herbs.SNAPDRAGON.getProduct(), 63, new Item(3004)), CADANTINE(Herbs.CADANTINE.getProduct(), 66, new Item(107)), LANTADYME(Herbs.LANTADYME.getProduct(), 69, new Item(2483)), DWARF_WEED(Herbs.DWARF_WEED.getProduct(), 72, new Item(109)), TORSTOL(Herbs.TORSTOL.getProduct(), 75, new Item(111)), STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(6016), 73, new Item(5936)), SUPER_STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(2398), 82, new Item(5939)), STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.TOADFLAX.getProduct(), 68, new Item(5942)), SUPER_STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.IRIT.getProduct(), 79, new Item(5951));
GUAM(Herbs.GUAM.getProduct(), 3, new Item(91)),
MARRENTILL(Herbs.MARRENTILL.getProduct(), 5, new Item(93)),
TARROMIN(Herbs.TARROMIN.getProduct(), 12, new Item(95)),
HARRALANDER(Herbs.HARRALANDER.getProduct(), 22, new Item(97)),
RANARR(Herbs.RANARR.getProduct(), 30, new Item(99)),
TOADFLAX(Herbs.TOADFLAX.getProduct(), 34, new Item(3002)),
SPIRIT_WEED(Herbs.SPIRIT_WEED.getProduct(), 40, new Item(12181)),
IRIT(Herbs.IRIT.getProduct(), 45, new Item(101)),
AVANTOE(Herbs.AVANTOE.getProduct(), 50, new Item(103)),
KWUARM(Herbs.KWUARM.getProduct(), 55, new Item(105)),
SNAPDRAGON(Herbs.SNAPDRAGON.getProduct(), 63, new Item(3004)),
CADANTINE(Herbs.CADANTINE.getProduct(), 66, new Item(107)),
LANTADYME(Herbs.LANTADYME.getProduct(), 69, new Item(2483)),
DWARF_WEED(Herbs.DWARF_WEED.getProduct(), 72, new Item(109)),
TORSTOL(Herbs.TORSTOL.getProduct(), 75, new Item(111)),
STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(6016), 73, new Item(5936)),
SUPER_STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(2398), 82, new Item(5939)),
STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.TOADFLAX.getProduct(), 68, new Item(5942)),
SUPER_STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.IRIT.getProduct(), 79, new Item(5951));
/**
* Represents the base item.
@@ -16,6 +16,7 @@ import core.game.world.map.Location;
import core.game.world.map.zone.MapZone;
import core.game.world.map.zone.ZoneBorders;
import core.game.world.map.zone.ZoneBuilder;
import core.game.world.map.zone.ZoneRestriction;
import core.game.world.update.flag.context.Animation;
import core.plugin.Plugin;
import core.tools.RandomFunction;
@@ -31,7 +32,7 @@ public final class FremennikDungeon extends MapZone implements Plugin<Object> {
* Constructs a new {@code FremennikDungeon} {@code Object}.
*/
public FremennikDungeon() {
super("fremennik", true);
super("fremennik", true, ZoneRestriction.CANNON);
}
@Override
@@ -256,8 +256,8 @@ public final class WildernessZone extends MapZone {
p.getAppearance().sync();
} else if (e instanceof NPC) {
NPC n = (NPC) e;
if (n.getDefinition().hasAttackOption()) {
n.setAggressive(true);
if (n.getDefinition().hasAttackOption() && n.isAggressive()) {
//n.setAggressive(true);
n.setAggressiveHandler(new AggressiveHandler(n, AggressiveBehavior.WILDERNESS));
}
}
@@ -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.SceneryDefinition
import core.game.component.Component
import core.game.container.impl.EquipmentContainer
import core.game.container.impl.InventoryListener
import core.game.content.dialogue.FacialExpression
import core.game.content.global.action.SpecialLadders
import core.game.node.Node
@@ -19,6 +21,7 @@ import core.game.node.entity.player.link.TeleportManager
import core.game.node.entity.player.link.audio.Audio
import core.game.node.entity.player.link.emote.Emotes
import core.game.node.entity.player.link.quest.QuestRepository
import core.game.node.entity.skill.Skills
import core.game.node.entity.skill.gather.SkillingTool
import core.game.node.item.GroundItem
import core.game.node.item.GroundItemManager
@@ -35,6 +38,7 @@ import core.game.world.map.zone.ZoneBuilder
import core.game.world.update.flag.chunk.AnimateObjectUpdateFlag
import core.game.world.update.flag.context.Animation
import core.game.world.update.flag.context.Graphics
import core.plugin.Plugin
import rs09.game.content.dialogue.DialogueFile
import rs09.game.content.dialogue.SkillDialogueHandler
import rs09.game.content.global.GlobalKillCounter;
@@ -146,6 +150,18 @@ fun <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
* @param player the player whose container to modify
@@ -1345,3 +1361,56 @@ fun announceIfRare(player: Player, item: Item) {
GlobalKillCounter.incrementRareDrop(player, item);
}
}
/**
* Returns a Mutable List of player skills that are at 99, returns false if player has no 99s
* @param player the player
*/
fun getMasteredSkills(player: Player): MutableList<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()
}
+56 -46
View File
@@ -3,9 +3,7 @@ package rs09
import core.game.system.SystemShutdownHook
import core.game.world.map.Location
import core.tools.mysql.Database
import org.json.simple.JSONObject
import rs09.tools.secondsToTicks
import java.io.File
import java.math.BigInteger
/**
@@ -62,6 +60,9 @@ class ServerConstants {
@JvmField
var BOT_DATA_PATH: String? = null
@JvmField
var CELEDT_DATA_PATH: String? = null
//the max number of players.
@JvmField
var MAX_PLAYERS = 2000
@@ -114,50 +115,59 @@ class ServerConstants {
//location names for the ::to command.
val TELEPORT_DESTINATIONS = arrayOf(
arrayOf(Location.create(2974, 4383, 2), "corp", "corporal", "corporeal"),
arrayOf(Location.create(2659, 2649, 0), "pc", "pest control", "pest"),
arrayOf(Location.create(3293, 3184, 0), "al kharid", "alkharid", "kharid"),
arrayOf(Location.create(3222, 3217, 0), "lumbridge", "lumby"),
arrayOf(Location.create(3110, 3168, 0), "wizard tower", "wizards tower", "tower", "wizards"),
arrayOf(Location.create(3083, 3249, 0), "draynor", "draynor village"),
arrayOf(Location.create(3019, 3244, 0), "port sarim", "sarim"),
arrayOf(Location.create(2956, 3209, 0), "rimmington"),
arrayOf(Location.create(2965, 3380, 0), "fally", "falador"),
arrayOf(Location.create(2895, 3436, 0), "taverley"),
arrayOf(Location.create(3080, 3423, 0), "barbarian village", "barb"),
arrayOf(Location.create(3213, 3428, 0), "varrock"),
arrayOf(Location.create(3164, 3485, 0), "grand exchange", "ge"),
arrayOf(Location.create(2917, 3175, 0), "karamja"),
arrayOf(Location.create(2450, 5165, 0), "tzhaar"),
arrayOf(Location.create(2795, 3177, 0), "brimhaven"),
arrayOf(Location.create(2849, 2961, 0), "shilo village", "shilo"),
arrayOf(Location.create(2605, 3093, 0), "yanille"),
arrayOf(Location.create(2663, 3305, 0), "ardougne", "ardy"),
arrayOf(Location.create(2450, 3422, 0), "gnome stronghold", "gnome"),
arrayOf(Location.create(2730, 3485, 0), "camelot", "cammy", "seers"),
arrayOf(Location.create(2805, 3435, 0), "catherby"),
arrayOf(Location.create(2659, 3657, 0), "rellekka"),
arrayOf(Location.create(2890, 3676, 0), "trollheim"),
arrayOf(Location.create(2914, 3746, 0), "godwars", "gwd", "god wars"),
arrayOf(Location.create(3180, 3684, 0), "bounty hunter", "bh"),
arrayOf(Location.create(3272, 3687, 0), "clan wars", "clw"),
arrayOf(Location.create(3090, 3957, 0), "mage arena", "mage", "magearena", "arena"),
arrayOf(Location.create(3069, 10257, 0), "king black dragon", "kbd"),
arrayOf(Location.create(3359, 3416, 0), "digsite"),
arrayOf(Location.create(3488, 3489, 0), "canifis"),
arrayOf(Location.create(3428, 3526, 0), "slayer tower", "slayer"),
arrayOf(Location.create(3502, 9483, 2), "kalphite queen", "kq", "kalphite hive", "kalphite"),
arrayOf(Location.create(3233, 2913, 0), "pyramid"),
arrayOf(Location.create(3419, 2917, 0), "nardah"),
arrayOf(Location.create(3482, 3090, 0), "uzer"),
arrayOf(Location.create(3358, 2970, 0), "pollnivneach", "poln"),
arrayOf(Location.create(3305, 2788, 0), "sophanem"),
arrayOf(Location.create(2898, 3544, 0), "burthorpe", "burthorp"),
arrayOf(Location.create(3088, 3491, 0), "edge", "edgeville"),
arrayOf(Location.create(3169, 3034, 0), "bedabin"),
arrayOf(Location.create(3565, 3289, 0), "barrows"),
arrayOf(Location.create(3016, 3513, 0), "bkf", "black knights fortress"),
arrayOf(Location.create(3052, 3481, 0), "monastery")
arrayOf(Location.create(2974, 4383, 2), "corp", "corporal", "corporeal"),
arrayOf(Location.create(2659, 2649, 0), "pc", "pest control", "pest"),
arrayOf(Location.create(3293, 3184, 0), "al kharid", "alkharid", "kharid"),
arrayOf(Location.create(3222, 3217, 0), "lumbridge", "lumby"),
arrayOf(Location.create(3110, 3168, 0), "wizard tower", "wizards tower", "tower", "wizards"),
arrayOf(Location.create(3083, 3249, 0), "draynor", "draynor village"),
arrayOf(Location.create(3019, 3244, 0), "port sarim", "sarim"),
arrayOf(Location.create(2956, 3209, 0), "rimmington"),
arrayOf(Location.create(2965, 3380, 0), "fally", "falador"),
arrayOf(Location.create(2895, 3436, 0), "taverley"),
arrayOf(Location.create(3080, 3423, 0), "barbarian village", "barb"),
arrayOf(Location.create(3213, 3428, 0), "varrock"),
arrayOf(Location.create(3164, 3485, 0), "grand exchange", "ge"),
arrayOf(Location.create(2917, 3175, 0), "karamja"),
arrayOf(Location.create(2450, 5165, 0), "tzhaar"),
arrayOf(Location.create(2795, 3177, 0), "brimhaven"),
arrayOf(Location.create(2849, 2961, 0), "shilo village", "shilo"),
arrayOf(Location.create(2605, 3093, 0), "yanille"),
arrayOf(Location.create(2663, 3305, 0), "ardougne", "ardy"),
arrayOf(Location.create(2450, 3422, 0), "gnome stronghold", "gnome"),
arrayOf(Location.create(2730, 3485, 0), "camelot", "cammy", "seers"),
arrayOf(Location.create(2805, 3435, 0), "catherby"),
arrayOf(Location.create(2659, 3657, 0), "rellekka"),
arrayOf(Location.create(2890, 3676, 0), "trollheim"),
arrayOf(Location.create(2914, 3746, 0), "godwars", "gwd", "god wars"),
arrayOf(Location.create(3180, 3684, 0), "bounty hunter", "bh"),
arrayOf(Location.create(3272, 3687, 0), "clan wars", "clw"),
arrayOf(Location.create(3090, 3957, 0), "mage arena", "mage", "magearena", "arena"),
arrayOf(Location.create(3069, 10257, 0), "king black dragon", "kbd"),
arrayOf(Location.create(3359, 3416, 0), "digsite"),
arrayOf(Location.create(3488, 3489, 0), "canifis"),
arrayOf(Location.create(3428, 3526, 0), "slayer tower", "slayer"),
arrayOf(Location.create(3502, 9483, 2), "kalphite queen", "kq", "kalphite hive", "kalphite"),
arrayOf(Location.create(3233, 2913, 0), "pyramid"),
arrayOf(Location.create(3419, 2917, 0), "nardah"),
arrayOf(Location.create(3482, 3090, 0), "uzer"),
arrayOf(Location.create(3358, 2970, 0), "pollnivneach", "poln"),
arrayOf(Location.create(3305, 2788, 0), "sophanem"),
arrayOf(Location.create(2898, 3544, 0), "burthorpe", "burthorp"),
arrayOf(Location.create(3088, 3491, 0), "edge", "edgeville"),
arrayOf(Location.create(3169, 3034, 0), "bedabin"),
arrayOf(Location.create(3565, 3289, 0), "barrows"),
arrayOf(Location.create(3016, 3513, 0), "bkf", "black knights fortress"),
arrayOf(Location.create(3052, 3481, 0), "monastery"),
arrayOf(Location.create(1945, 4959, 0), "blast furnace", "blast"),
arrayOf(Location.create(2408, 4449, 0), "zanaris"),
arrayOf(Location.create(3656, 3517, 0), "ectofuntus", "ecto"),
arrayOf(Location.create(2408, 4449, 0), "tower of life lower"),
arrayOf(Location.create(2894, 4756, 0), "test area"),
arrayOf(Location.create(2722, 4886, 0), "quest the golem 1"),
arrayOf(Location.create(2704, 5349, 0), "dorgeshuun", "dorg"),
arrayOf(Location.create(2711, 10132, 0), "brine rats"),
arrayOf(Location.create(2328, 3677, 0), "piscatoris")
)
@JvmField
@@ -428,6 +428,9 @@ class Adventurer(val style: CombatStyle): Script() {
var lineAlt = ""
when {
//Celebrates Halloween!
dateCode == 1031 -> lineAlt = dialogue.getLines("halloween").rand()
//Celebrates lead up to Christmas!
until in 2..23 -> lineAlt = dialogue.getLines("approaching_christmas").rand()
@@ -5,6 +5,7 @@ import core.game.world.map.zone.ZoneRestriction
import core.tools.RandomFunction
import rs09.game.system.SystemLogger
import rs09.game.world.GameWorld
import kotlin.random.Random
private const val AVG_DELAY_TICKS = 6000 // 60 minutes
private const val MIN_DELAY_TICKS = AVG_DELAY_TICKS / 2
@@ -12,6 +13,7 @@ private const val MAX_DELAY_TICKS = MIN_DELAY_TICKS + AVG_DELAY_TICKS // window
class RandomEventManager(val player: Player) {
var event: RandomEventNPC? = null
var nextSpawn = 0
val skills = arrayOf("WoodcuttingSkillPulse","FishingPulse","MiningSkillPulse","BoneBuryingOptionPlugin")
fun tick() {
if (player.isArtificial) return
@@ -23,7 +25,26 @@ class RandomEventManager(val player: Player) {
nextSpawn = GameWorld.ticks + 3000
return
}
val ame = RandomEvents.values().random()
val currentAction = player.pulseManager.current.toString()
var ame = RandomEvents.values().random()
if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){
ame = RandomEvents.TREE_SPIRIT
}
else if(currentAction.contains("FishingPulse") && Random.nextBoolean()){
ame = RandomEvents.RIVER_TROLL
}
else if(currentAction.contains("MiningSkillPulse") && Random.nextBoolean()){
ame = RandomEvents.ROCK_GOLEM
}
else if(currentAction.contains("BoneBuryingOptionPlugin") && Random.nextBoolean()){
ame = RandomEvents.SHADE
}
else {
ame = RandomEvents.values().random()
while(ame.type == "skill"){
ame = RandomEvents.values().random()
}
}
event = ame.npc.create(player,ame.loot,ame.type)
if (event!!.spawnLocation == null) {
nextSpawn = GameWorld.ticks + 3000
@@ -1,18 +1,16 @@
package rs09.game.content.ame
import api.*
import api.poofClear
import core.game.interaction.MovementPulse
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.game.node.item.Item
import core.game.system.task.Pulse
import core.game.world.map.Location
import core.game.world.map.RegionManager
import core.game.world.map.path.Pathfinder
import core.game.world.update.flag.context.Graphics
import rs09.game.content.ame.events.MysteriousOldManNPC
import rs09.game.content.global.WeightBasedTable
import rs09.game.world.GameWorld.Pulser
import rs09.tools.secondsToTicks
import kotlin.random.Random
import kotlin.reflect.full.createInstance
@@ -23,66 +21,78 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
var spawnLocation: Location? = null
val SMOKE_GRAPHICS = Graphics(86)
var initialized = false
var ticksLeft = secondsToTicks(600)
var finalized = false
var timerPaused = false
var ticksLeft = secondsToTicks(180)
open fun create(player: Player, loot: WeightBasedTable? = null, type: String = ""): RandomEventNPC{
open fun create(player: Player, loot: WeightBasedTable? = null, type: String = ""): RandomEventNPC {
val event = this::class.createInstance()
if(event is MysteriousOldManNPC) event.type = type
if (event is MysteriousOldManNPC) event.type = type
event.loot = loot
event.player = player
event.spawnLocation = RegionManager.getSpawnLocation(player,this)
event.spawnLocation = RegionManager.getSpawnLocation(player, this)
return event
}
open fun terminate(){
open fun terminate() {
finalized = true
pulseManager.clear("amemovement")
player.antiMacroHandler.event = null
if(initialized){
if (initialized) {
poofClear(this)
}
}
open fun follow(){
pulseManager.run(object : MovementPulse(this,player, Pathfinder.DUMB){
open fun follow() {
pulseManager.run((object : MovementPulse(this, player, Pathfinder.DUMB) {
override fun pulse(): Boolean {
face(player)
return false
}
})
}), "amemovement")
}
override fun tick() {
super.tick()
ticksLeft--
if(!pulseManager.hasPulseRunning()) follow()
if(!player.isActive || !player.location.withinDistance(location,10)){
if (!player.getAttribute("random:pause", false)) {
ticksLeft--
}
if (!pulseManager.hasPulseRunning() && !finalized) {
follow()
}
if (!player.isActive || !player.location.withinDistance(location, 10)) {
terminate()
}
if(ticksLeft <= 0){
if (ticksLeft <= 0 && initialized) {
onTimeUp()
initialized = false
}
}
override fun init() {
initialized = true
finalized = false
timerPaused = false
spawnLocation ?: terminate()
location = spawnLocation
super.init()
}
open fun onTimeUp(){
open fun onTimeUp() {
noteAndTeleport()
terminate()
}
fun noteAndTeleport(){
for(item in player.inventory.toArray()){
if(item == null) continue
if(item.noteChange != item.id){
fun noteAndTeleport() {
for (item in player.inventory.toArray()) {
if (item == null) continue
if (item.noteChange != item.id) {
player.inventory.remove(item)
player.inventory.add(Item(item.noteChange,item.amount))
player.inventory.add(Item(item.noteChange, item.amount))
}
}
if(Random.nextBoolean()){
if (Random.nextBoolean()) {
player.properties.teleportLocation = Location.create(3197, 3223, 0)
} else {
player.properties.teleportLocation = Location.create(3212, 9620, 0)
@@ -5,8 +5,14 @@ import rs09.game.content.ame.events.MysteriousOldManNPC
import rs09.game.content.ame.events.certer.CerterNPC
import rs09.game.content.ame.events.drilldemon.SeargentDamienNPC
import rs09.game.content.ame.events.evilchicken.EvilChickenNPC
import rs09.game.content.ame.events.sandwichlady.SandwichLadyRENPC
import rs09.game.content.ame.events.genie.GenieNPC
import rs09.game.content.ame.events.rivertroll.RiverTrollRENPC
import rs09.game.content.ame.events.rockgolem.RockGolemRENPC
import rs09.game.content.ame.events.sandwichlady.SandwichLadyRENPC
import rs09.game.content.ame.events.shade.ShadeRENPC
import rs09.game.content.ame.events.treespirit.TreeSpiritRENPC
import rs09.game.content.ame.events.zombie.ZombieRENPC
import rs09.game.content.global.WeightBasedTable
import rs09.game.content.global.WeightedItem
@@ -14,25 +20,30 @@ enum class RandomEvents(val npc: RandomEventNPC, val loot: WeightBasedTable? = n
SANDWICH_LADY(SandwichLadyRENPC()),
GENIE(GenieNPC()),
CERTER(CerterNPC(),WeightBasedTable.create(
WeightedItem(Items.COINS_995,1,100,2.0),
WeightedItem(Items.SPINACH_ROLL_1969,1,1,2.0),
WeightedItem(Items.KEBAB_1971,1,1,2.0),
WeightedItem(Items.UNCUT_SAPPHIRE_1623,1,1,0.5),
WeightedItem(Items.SAPPHIRE_1607,1,1,0.5),
WeightedItem(Items.UNCUT_EMERALD_1621,1,1,0.25),
WeightedItem(Items.EMERALD_1605,1,1,0.25),
WeightedItem(Items.UNCUT_RUBY_1619,1,1,0.15),
WeightedItem(Items.RUBY_1603,1,1,0.15),
WeightedItem(Items.DIAMOND_1601,1,1,0.1),
WeightedItem(Items.UNCUT_DIAMOND_1617,1,1,0.1),
WeightedItem(Items.COSMIC_TALISMAN_1454,1,1,0.15),
WeightedItem(Items.NATURE_TALISMAN_1462,1,1,0.15),
WeightedItem(Items.TOOTH_HALF_OF_A_KEY_985,1,1,1.0),
WeightedItem(Items.LOOP_HALF_OF_A_KEY_987,1,1,1.0)
WeightedItem(Items.UNCUT_SAPPHIRE_1623,1,1,3.4),
WeightedItem(Items.KEBAB_1971,1,1,1.7),
WeightedItem(Items.UNCUT_EMERALD_1621,1,1,1.7),
WeightedItem(Items.SPINACH_ROLL_1969,1,1,1.5),
WeightedItem(Items.COINS_995,80,80,1.1),
WeightedItem(Items.COINS_995,160,160,1.1),
WeightedItem(Items.COINS_995,320,320,1.1),
WeightedItem(Items.COINS_995,480,480,1.1),
WeightedItem(Items.COINS_995,640,640,1.1),
WeightedItem(Items.UNCUT_RUBY_1619,1,1,0.86),
WeightedItem(Items.COINS_995,240,240,0.65),
WeightedItem(Items.COSMIC_TALISMAN_1454,1,1,0.43),
WeightedItem(Items.UNCUT_DIAMOND_1617,1,1,0.22),
WeightedItem(Items.TOOTH_HALF_OF_A_KEY_985,1,1,0.1),
WeightedItem(Items.LOOP_HALF_OF_A_KEY_987,1,1,0.1)
)),
DRILL_DEMON(SeargentDamienNPC()),
EVIL_CHICKEN(EvilChickenNPC()),
SURPRISE_EXAM(MysteriousOldManNPC(),"sexam");
SURPRISE_EXAM(MysteriousOldManNPC(),"sexam"),
TREE_SPIRIT(TreeSpiritRENPC(),"skill"),
RIVER_TROLL(RiverTrollRENPC(),"skill"),
ROCK_GOLEM(RockGolemRENPC(),"skill"),
SHADE(ShadeRENPC(),"skill"),
ZOMBIE(ZombieRENPC(),"skill");
var type: String = ""
private set
@@ -45,4 +56,5 @@ enum class RandomEvents(val npc: RandomEventNPC, val loot: WeightBasedTable? = n
@JvmField
val randomIDs = values().map { it.npc.id }.toList()
}
}
@@ -1,33 +1,58 @@
package rs09.game.content.ame.events.certer
import api.*
import api.addItemOrDrop
import core.game.component.Component
import core.game.node.item.GroundItemManager
import core.game.node.entity.player.link.emote.Emotes
import rs09.game.content.dialogue.DialogueFile
import rs09.tools.END_DIALOGUE
class CerterDialogue(val initial: Boolean) : DialogueFile() {
val CERTER_INTERFACE = 184
override fun handle(componentID: Int, buttonID: Int) {
if(initial){
when(stage){
0 -> npc("Ah, hello, ${player!!.username.capitalize()}. Could you","please help me identify this?").also { stage++ }
if (initial && !player!!.getAttribute("certer:reward", false)) {
when (stage) {
0 -> npc("Ah, hello, ${player!!.username.capitalize()}. Could you", "please help me identify this?").also { stage++ }
1 -> {
end()
player!!.interfaceManager.open(Component(CERTER_INTERFACE))
}
}
} else {
val isCorrect = player!!.getAttribute("certer:correct",false)
when(stage){
0 -> if(!isCorrect) npc("Sorry, I don't think so.").also { stage = END_DIALOGUE; player!!.antiMacroHandler.event?.terminate() } else npc("Oh yes! That's right.").also { stage++ }
1 -> {
npc("Please, take this as a thanks.")
player!!.antiMacroHandler.event?.loot!!.roll().forEach { addItemOrDrop(player!!, it.id, it.amount) }
player!!.antiMacroHandler.event?.terminate()
stage = END_DIALOGUE
player!!.setAttribute("random:pause", true)
val isCorrect = player!!.getAttribute("certer:correct", false)
val receivedReward = player!!.getAttribute("certer:reward", false)
if (receivedReward == true) {
stage = 1
}
when (stage) {
0 -> if (!isCorrect) {
npc("Sorry, I don't think so.").also {
player!!.setAttribute("certer:reward", true)
stage = END_DIALOGUE
player!!.antiMacroHandler.event?.terminate()
}
} else {
npc("Thank you, I hope you like your present. I must be", "leaving now though.").also {
player!!.setAttribute("certer:reward", true)
stage = END_DIALOGUE
player!!.antiMacroHandler.event?.loot!!.roll().forEach { addItemOrDrop(player!!, it.id, it.amount) }
}
}
}
}
}
override fun end() {
super.end()
if (player!!.getAttribute("certer:reward", false)) {
// Remove movement pulse to stop following player
npc!!.pulseManager.clear("amemovement")
// Wave goodbye
npc!!.animate(Emotes.WAVE.animation)
// Terminate the event
player!!.antiMacroHandler.event?.terminate()
} else {
player!!.setAttribute("random:pause", false)
}
}
}
@@ -1,6 +1,7 @@
package rs09.game.content.ame.events.certer
import core.game.node.entity.player.Player
import core.game.node.item.Item
import org.rs09.consts.Items
import rs09.game.interaction.InterfaceListener
@@ -11,51 +12,69 @@ class CerterEventInterface : InterfaceListener() {
val OPTION_C_CHILD = 3
val ITEM_CHILD = 7
val items = mapOf(
Items.BLACK_SWORD_1283 to "a sword",
Items.BRONZE_SWORD_1277 to "a sword",
Items.BRONZE_CHAINBODY_1103 to "a platebody",
Items.BLACK_CHAINBODY_1107 to "a platebody",
Items.WOODEN_SHIELD_1171 to "a shield",
Items.BRONZE_KITESHIELD_1189 to "a shield",
/*
* NOTE: We use these "NULL" items to get their model id + zoom values.
* These were the actual items used by this random event before they
* decided to swap over to using model ids instead.
*/
Items.BOWL_1923 to "A bowl.",
Items.NULL_6189 to "A fish.",
Items.NULL_6190 to "A bass.",
Items.NULL_6191 to "A sword.",
Items.NULL_6192 to "A battleaxe.",
Items.NULL_6193 to "A helmet.",
Items.NULL_6194 to "A kiteshield.",
Items.NULL_6195 to "A pair of shears.",
Items.NULL_6196 to "A shovel.",
Items.NULL_6197 to "A ring.",
Items.NULL_6198 to "A necklace."
)
val falseOptions = arrayOf("a ring","a dragon","a cat","a helmet","a pair of boots","a fish","a gun","a staff","a cannon","a dwarf","a bow","an arrow","a chinchompa","a chicken","a feather","a ninja","a bot")
val falseOptions = arrayOf("An axe.", "An arrow.", "A pair of boots.", "A pair of gloves.", "A staff.", "A bow.", "A feather.", "The disenfrachaised youth of 1940's Columbia.")
override fun defineListeners() {
on(CERTER_INTERFACE){player, _, _, buttonID, _, _ ->
on(CERTER_INTERFACE) { player, _, _, buttonID, _, _ ->
val answer = buttonID - 7
val correctAnswer = player.getAttribute("certer:correctIndex",0)
player.setAttribute("certer:correct",correctAnswer == answer)
val correctAnswer = player.getAttribute("certer:correctIndex", 0)
player.setAttribute("certer:correct", correctAnswer == answer)
player.interfaceManager.close()
player.dialogueInterpreter.open(CerterDialogue(false),player.antiMacroHandler.event?.asNpc())
player.dialogueInterpreter.open(CerterDialogue(false), player.antiMacroHandler.event?.asNpc())
return@on true
}
onOpen(CERTER_INTERFACE){player, _ ->
onOpen(CERTER_INTERFACE) { player, _ ->
generateOptions(player)
return@onOpen true
}
onClose(CERTER_INTERFACE) { player, _ ->
player.setAttribute("random:pause", false)
return@onClose true
}
}
fun generateOptions(player: Player) {
val correct = items.keys.random()
val indexes = arrayListOf(1,2,3)
val indexes = arrayListOf(1, 2, 3)
val correctIndex = indexes.random()
val correctItem = Item(correct).definition
val iFaceModelId = correctItem.interfaceModelId
val iFaceZoom = correctItem.modelZoom
indexes.remove(correctIndex)
player.setAttribute("certer:correctIndex",correctIndex)
player.setAttribute("certer:correctIndex", correctIndex)
player.packetDispatch.sendString(items[correct],CERTER_INTERFACE,optionFromIndex(correctIndex))
player.packetDispatch.sendString(items[correct], CERTER_INTERFACE, optionFromIndex(correctIndex))
val tempOptions = falseOptions.toMutableList()
val false1 = tempOptions.random()
tempOptions.remove(false1)
var false2 = tempOptions.random()
val false2 = tempOptions.random()
player.packetDispatch.sendString(false1,CERTER_INTERFACE,optionFromIndex(indexes[0]))
player.packetDispatch.sendString(false2,CERTER_INTERFACE,optionFromIndex(indexes[1]))
player.packetDispatch.sendItemOnInterface(correct,1,CERTER_INTERFACE,ITEM_CHILD)
player.packetDispatch.sendString(false1, CERTER_INTERFACE, optionFromIndex(indexes[0]))
player.packetDispatch.sendString(false2, CERTER_INTERFACE, optionFromIndex(indexes[1]))
player.packetDispatch.sendModelOnInterface(iFaceModelId, CERTER_INTERFACE, ITEM_CHILD, iFaceZoom)
}
fun optionFromIndex(index: Int): Int{
return when(index){
fun optionFromIndex(index: Int): Int {
return when (index) {
1 -> OPTION_A_CHILD
2 -> OPTION_B_CHILD
3 -> OPTION_C_CHILD
@@ -1,23 +1,49 @@
package rs09.game.content.ame.events.certer
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.link.emote.Emotes
import core.tools.RandomFunction
import org.rs09.consts.NPCs
import rs09.game.content.ame.RandomEventNPC
import rs09.game.content.global.WeightBasedTable
class CerterNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.GILES_2538) {
lateinit var pName: String
lateinit var phrases: Array<String>
override fun tick() {
// Don't speak if we have the interface opened
if (!timerPaused) {
// Over allotted time phrase
if (ticksLeft <= 2) {
player.lock(2)
sendChat(phrases[4])
// Say a phrase every 20 ticks starting at 280 ticks
// as to not interfere with the init chat phrase
} else if (ticksLeft <= 280 && ticksLeft % 20 == 0) {
sendChat(phrases[RandomFunction.random(1, 3)])
}
}
super.tick()
if(RandomFunction.random(1,10) == 5) sendChat(player.username.capitalize() + "! I need your assistance.")
}
override fun talkTo(npc: NPC) {
player.setAttribute("random:pause", true)
player.dialogueInterpreter.open(CerterDialogue(true),npc)
}
override fun init() {
super.init()
sendChat(player.username.capitalize() + "! I need your assistance.")
pName = player.username.capitalize()
phrases = arrayOf("Greetings $pName, I need your help.",
"ehem... Hello $pName, please talk to me!",
"Hello, are you there $pName?",
"It's really rude to ignore someone, $pName!",
"No-one ignores me!")
player.setAttribute("random:pause", false)
player.setAttribute("certer:reward", false)
sendChat(phrases[0])
api.animate(this, Emotes.BOW.animation, true)
}
}
@@ -1,5 +1,6 @@
package rs09.game.content.ame.events.evilchicken
import api.getWorldTicks
import core.game.node.entity.Entity
import core.game.node.entity.npc.NPC
import core.game.node.item.GroundItemManager
@@ -12,15 +13,16 @@ import rs09.game.content.global.WeightBasedTable
val ids = 2463..2468
class EvilChickenNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(2463) {
val phrases = arrayOf("Bwuk","Bwuk bwuk bwuk","Flee from me, @name!","Begone, @name!","Bwaaaauuuk bwuk bwuk","MUAHAHAHAHAAA!")
override fun talkTo(npc: NPC) {}
override fun init() {
super.init()
val index = (player.properties.combatLevel / 20) - 1
val id = ids.toList()[index]
this.transform(id)
this.attack(player)
sendChat(phrases.random().replace("@name",player.name.capitalize()))
this.isRespawn = false
}
@@ -30,6 +32,12 @@ class EvilChickenNPC(override var loot: WeightBasedTable? = null) : RandomEventN
}
override fun tick() {
if(!player.location.withinDistance(this.location,8)){
this.terminate()
}
if(getWorldTicks() % 10 == 0){
sendChat(phrases.random().replace("@name",player.name.capitalize()))
}
super.tick()
if(!player.viewport.currentPlane.npcs.contains(this)) this.clear()
}
@@ -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
import api.*
import core.game.container.Container
import core.game.container.impl.EquipmentContainer
import core.game.content.dialogue.DialoguePlugin
@@ -32,14 +33,14 @@ class DumpContainer(player: Player? = null) : DialoguePlugin(player) {
if (player.inventory.isEmpty) {
player.packetDispatch.sendMessage("You have nothing in your inventory to deposit.")
} else {
dump(player.inventory)
dumpContainer(player, player.inventory)
}
}
2 -> {
if (player.equipment.isEmpty) {
player.packetDispatch.sendMessage("You have no equipment to deposit.")
} else {
dump(player.equipment)
dumpContainer(player, player.equipment)
}
}
3 -> {
@@ -55,35 +56,4 @@ class DumpContainer(player: Player? = null) : DialoguePlugin(player) {
override fun getIds(): IntArray {
return intArrayOf(ID)
}
/**
* Dumps a container.
* @param inventory the player's inventory.
* @author ceik
* @author James Triantafylos
*/
fun dump(inventory: Container) {
val bank = player.bank
for (item: Item in inventory.toArray().filterNotNull()) {
if (!bank.hasSpaceFor(item)) {
player.packetDispatch.sendMessage("You have no more space in your bank.")
return
}
if (!bank.canAdd(item)) {
player.packetDispatch.sendMessage("A magical force prevents you from banking your " + item.name + ".")
} else {
if (inventory is EquipmentContainer) {
val plugin = item.definition.handlers["equipment"]
if (plugin != null && plugin is Plugin<*>) {
plugin.fireEvent("unequip", player, item)
}
}
inventory.remove(item)
bank.add(if (item.definition.isUnnoted) item else Item(item.noteChange, item.amount))
}
}
inventory.update()
bank.update()
}
}
@@ -1,87 +1,88 @@
package core.game.content.dialogue
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.plugin.Initializable
/**
* Represents the gem trader Dialogue plugin
* @author plex
* @version 2.0
*/
@Initializable
class GemTraderDialogue (player: Player? = null): DialoguePlugin(player){
override fun newInstance(player: Player?): DialoguePlugin {
return GemTraderDialogue(player)
}
override fun open(vararg args: Any?): Boolean {
npc = (args[0] as NPC).getShownNPC(player)
val qstage = player?.questRepository?.getStage("Family Crest") ?: -1
if(qstage == 12){
npc("Good day to you, traveller. ",
"Would you be interested in buying some gems?")
stage = 1
}
else{
npc("Good day to you, traveller. ",
"Would you be interested in buying some gems?")
stage = 2
}
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when(stage){
1 -> options("Yes, please.", "No, thank you.", "I'm in search of a man named Avan Fitzharmon").also{
stage = 10
}
2 -> options("Yes, please.", "No, thank you.").also{
stage = 20
}
10 -> when(buttonId){
1 -> npc.openShop(player).also { stage = 1000 };
2 -> player("No Thank you").also{stage = 1000}
3 -> npc("Fitzharmon, eh? Hmmm... If I'm not mistaken, ",
"that's the family name of a member ",
"of the Varrockian nobility.").also{stage = 100}
}
20 -> when(buttonId){
1 -> npc.openShop(player).also { stage = 1000 };
2 -> player("No Thank you").also{stage = 1000}
}
100 -> npc("You know, I HAVE seen someone of that" ,
" persuasion around here recently... " ,
"wearing a 'poncey' yellow cape, he was.").also{stage++}
101 -> npc("Came in here all la-di-dah, high and mighty,",
"asking for jewellery made from 'perfect gold' - " ,
"whatever that is - like 'normal' gold just isn't " ,
"good enough for 'little lord fancy pants' there!").also{stage ++}
102 -> npc("I told him to head to the desert 'cos " ,
"I know there's gold out there, in them there sand dunes. " ,
"And if it's not up to his lordship's " ,
"high standards of 'gold perfection', then...").also{stage++}
103 -> npc("Well, maybe we'll all get lucky ",
"and the scorpions will deal with him.").also{
stage = 1000;
player.questRepository.getQuest("Family Crest").setStage(player, 13)
}
1000 -> end()
}
return true
}
override fun getIds(): IntArray {
return intArrayOf(540)
}
package rs09.game.content.dialogue.region.alkharid
import core.game.content.dialogue.DialoguePlugin
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.plugin.Initializable
/**
* Represents the gem trader Dialogue plugin
* @author plex
* @version 2.0
*/
@Initializable
class GemTraderDialogue (player: Player? = null): DialoguePlugin(player){
override fun newInstance(player: Player?): DialoguePlugin {
return GemTraderDialogue(player)
}
override fun open(vararg args: Any?): Boolean {
npc = (args[0] as NPC).getShownNPC(player)
val qstage = player?.questRepository?.getStage("Family Crest") ?: -1
if(qstage == 12){
npc("Good day to you, traveller. ",
"Would you be interested in buying some gems?")
stage = 1
}
else{
npc("Good day to you, traveller. ",
"Would you be interested in buying some gems?")
stage = 2
}
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when(stage){
1 -> options("Yes, please.", "No, thank you.", "I'm in search of a man named Avan Fitzharmon").also{
stage = 10
}
2 -> options("Yes, please.", "No, thank you.").also{
stage = 20
}
10 -> when(buttonId){
1 -> npc.openShop(player).also { stage = 1000 };
2 -> player("No Thank you").also{stage = 1000}
3 -> npc("Fitzharmon, eh? Hmmm... If I'm not mistaken, ",
"that's the family name of a member ",
"of the Varrockian nobility.").also{stage = 100}
}
20 -> when(buttonId){
1 -> npc.openShop(player).also { stage = 1000 };
2 -> player("No Thank you").also{stage = 1000}
}
100 -> npc("You know, I HAVE seen someone of that" ,
" persuasion around here recently... " ,
"wearing a 'poncey' yellow cape, he was.").also{stage++}
101 -> npc("Came in here all la-di-dah, high and mighty,",
"asking for jewellery made from 'perfect gold' - " ,
"whatever that is - like 'normal' gold just isn't " ,
"good enough for 'little lord fancy pants' there!").also{stage ++}
102 -> npc("I told him to head to the desert 'cos " ,
"I know there's gold out there, in them there sand dunes. " ,
"And if it's not up to his lordship's " ,
"high standards of 'gold perfection', then...").also{stage++}
103 -> npc("Well, maybe we'll all get lucky ",
"and the scorpions will deal with him.").also{
stage = 1000;
player.questRepository.getQuest("Family Crest").setStage(player, 13)
}
1000 -> end()
}
return true
}
override fun getIds(): IntArray {
return intArrayOf(540)
}
}
@@ -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.FacialExpression
@@ -16,7 +16,7 @@ class AberabDialogue(player: Player? = null) : DialoguePlugin(player){
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
npc(FacialExpression.CHILD_SUSPICIOUS,"Grr ... Get out of my way...")
npc(FacialExpression.OLD_ANGRY1,"Grr ... Get out of my way...")
stage = 99
return true
}
@@ -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 core.game.content.dialogue.DialoguePlugin
@@ -1,4 +1,4 @@
package rs09.game.content.dialogue
package rs09.game.content.dialogue.region.canifis
import core.game.content.dialogue.DialoguePlugin
import core.game.content.dialogue.FacialExpression
@@ -0,0 +1,101 @@
package rs09.game.content.dialogue.region.digsite
import core.game.content.dialogue.DialoguePlugin
import core.game.content.dialogue.FacialExpression
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.NPCs
/**
* @author qmqz
*/
@Initializable
class ElissaDialogue(player: Player? = null) : DialoguePlugin(player){
var fr = FacialExpression.FRIENDLY
var ask = FacialExpression.ASKING
var ann = FacialExpression.ANNOYED
var neu = FacialExpression.ANNOYED
var ama = FacialExpression.AMAZED
var qb = 2
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
npc(FacialExpression.FRIENDLY,"Hello there.").also { stage = 0 }
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when(stage){
//three quest branches
//normal dialogue
0 -> (options("What do you do here?", "What is this place?")).also { stage++ }
1 -> {
when(qb) {
1 -> player(ask, "What do you do here?").also { stage = 10 }
2 -> player(ask, "What is this place?").also { stage = 20 }
}
}
10 -> npcl(fr, "I am helping with the dig. I am an expert on Third Age architecture.").also { stage = 99 }
20 -> npcl(ann, "In the Third Age, this was a great city, which would have put Varrock to shame!").also { stage++ }
21 -> options("I don't know, Varrock is pretty impressive.", "What happened to the city?").also { stage++ }
22 -> when(buttonId) {
1 -> player(fr, "I don't know, Varrock is pretty impressive.").also { stage = 30 }
2 -> player(ask, "What happened to the city?").also { stage = 40 }
}
30 -> npcl(ann, "Hmph. I don't think it will look this good when it's been buried in the ground for three thousand years!").also { stage = 99 }
40 -> npc(neu, "No one knows for sure.").also { stage++ }
41 -> npcl(neu, "But the The Third Age was a time of destruction, when the gods were violently at war. Many great civilizations were destroyed then.").also { stage = 99 }
//the golem quest dialogue first time talking
50 -> (options("What do you do here?", "What is this place?", "I found a letter in the desert with your name on.")).also { stage++ }
51 -> when (buttonId) {
1 -> player(ask, "What do you do here?").also { stage = 10 }
2 -> player(ask, "What is this place?").also { stage = 20 }
3 -> playerl(fr, "I found a letter in the desert with your name on.").also { stage = 60 }
}
60 -> npc(ama, "Ah, so you've found the ruins of Uzer.").also { stage++ }
61 -> npcl(ama, "I wrote that letter to my late husband when he was exploring there.").also { stage++ }
62 -> npcl(ama, "That was a great city as well, but the museum could only fund one excavation and this one was closer to home.").also { stage++ }
63 -> npcl(ama, "If you're interested in his expedition, the notes he made are in the library in the Exam Centre.").also { stage = 99 }
//talking to her again after the initial golem quest dialogue
70 -> (options("What do you do here?", "What is this place?", "Where did you say the notes were?")).also { stage++ }
71 -> when (buttonId) {
1 -> player(ask, "What do you do here?").also { stage = 10 }
2 -> player(ask, "What is this place?").also { stage = 20 }
3 -> playerl(fr, "Where did you say the notes were?").also { stage = 80 }
}
80 -> npc(fr, "They're on a bookcase in the Exam Centre.").also { stage = 99 }
//after reading varmen's notes
90 -> (options("What do you do here?", "What is this place?", "Where is the statuette that Varmen took back from Uzer?")).also { stage++ }
91 -> when (buttonId) {
1 -> player(ask, "What do you do here?").also { stage = 10 }
2 -> player(ask, "What is this place?").also { stage = 20 }
3 -> playerl(fr, "Where is the statuette that Varmen took back from Uzer?").also { stage = 100 }
}
100 -> npc(ask, "The statuette? Oh, yes...").also { stage++ }
101 -> npcl(neu, "That statuette was the only thing we had to show from that expedition.").also { stage++ }
102 -> npcl(ask, "It was very worn, but you can still make out a lot of detail. The Uzerians were expert sculptors. It's a pity we only have that small example.").also { stage++ }
103 -> npc(ask, "Now it's on display in the Varrock museum.").also { stage = 99 }
99 -> end()
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return ElissaDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.ELISSA_1912)
}
}
@@ -0,0 +1,241 @@
@file:Suppress("UNUSED_PARAMETER")
package rs09.game.content.dialogue.region.dorgeshuun
import api.*
import core.game.content.dialogue.DialoguePlugin
import core.game.content.dialogue.FacialExpression
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.game.node.entity.skill.Skills
import core.game.node.item.Item
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
import java.text.NumberFormat
/**
* @author qmqz
*/
@Initializable
class BarlakDialogue(player: Player? = null) : DialoguePlugin(player){
var pask = FacialExpression.ASKING
var pfr = FacialExpression.FRIENDLY
var pneu = FacialExpression.NEUTRAL
var nhap = FacialExpression.OLD_HAPPY
var ntalk1 = FacialExpression.OLD_CALM_TALK1
var ntalk2 = FacialExpression.OLD_CALM_TALK2
var f = NumberFormat.getIntegerInstance()
var curItem = 0
var toAddFromBank = 0
val sets = arrayOf(
intArrayOf(Items.LONG_BONE_10976, 1000, 1500, Skills.CONSTRUCTION),
intArrayOf(Items.CURVED_BONE_10977, 2000, 2250, Skills.CONSTRUCTION),
intArrayOf(Items.SNAIL_SHELL_7800, 600, 0, Skills.CONSTRUCTION),
intArrayOf(Items.PERFECT_SNAIL_SHELL_10996, 600, 500, Skills.CRAFTING),
intArrayOf(Items.TORTOISE_SHELL_7939, 600, 0, Skills.CRAFTING),
intArrayOf(Items.PERFECT_SHELL_10995, 600, 500, Skills.CRAFTING),
)
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
if (player.skills.getStaticLevel(Skills.CONSTRUCTION) >= 30 && player.houseManager.hasHouse()) {
if (player.inventory.contains(Items.LONG_BONE_10976, 1)) {
curItem = 0
npcl(nhap, "Those bones! Those are exactly the sort of thing I need! Will you sell them?").also { stage = 0 }
} else if (player.inventory.contains(Items.CURVED_BONE_10977, 1)) {
curItem = 1
npcl(nhap, "Those bones! Those are exactly the sort of thing I need! Will you sell them?").also { stage = 0 }
} else if (player.inventory.contains(Items.PERFECT_SHELL_10995, 1)) {
curItem = 5
npc(ntalk2, "That giant shell... what is it?").also { stage = 120 }
} else if (player.inventory.contains(Items.TORTOISE_SHELL_7939, 1)) {
curItem = 4
npc(ntalk2, "That giant shell... what is it?").also { stage = 100 }
} else if (player.inventory.contains(Items.PERFECT_SNAIL_SHELL_10996, 1)) {
curItem = 3
npc(ntalk1, "That giant shell... what is it?").also { stage = 60 }
} else if (player.inventory.contains(Items.SNAIL_SHELL_7800, 1)) {
curItem = 2
npc(ntalk1, "That giant shell... what is it?").also { stage = 50 }
} else {
npc(nhap, "Bones!").also { stage = 150 }
}
}
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when(stage){
0 -> npcl(ntalk1, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the bones you're carrying and for any you have in your bank.").also { stage++ }
1 -> npcl(ntalk2, "I'll try to teach you something about Construction as well, but it's highly technical so you won't understand if you don't already have level 30 Construction.").also { stage++ }
2 -> options("Okay.", "No, I'll keep the bones.").also { stage++ }
3 -> when (buttonId) {
1 -> player(pfr, "Okay.").also { stage = 10 }
2 -> player(pneu, "No thanks.").also { stage = 99 }
}
10 -> {
doDaMaffBish()
npc(ntalk1, "Thanks! Now, let me explain...").also { stage = 999 }
}
50 -> player(pfr, "It's a giant snail shell!").also { stage++ }
51 -> npcl(ntalk1, "Hmm... I think I might be able to make something out of them.").also { stage++ }
52 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the snail shells you're carrying.").also { stage++ }
53 -> options("Okay.", "No. I'll keep the bones.").also { stage++ }
54 -> when (buttonId) {
1 -> player(pfr, "Okay.").also { stage = 55 }
2 -> player(pneu, "No thanks.").also { stage = 99 }
}
55 -> {
doDaMaffBish()
npcl(ntalk1, "Thanks. If you find any more shells like these, please bring them to me!").also { stage = 99 }
}
60 -> player(pfr, "It's a giant snail shell!").also { stage++ }
61 -> {
when (player.inventory.getAmount(Items.PERFECT_SNAIL_SHELL_10996)) {
1 -> npcl(ntalk2, "Hmm... I think I might be able to make something out of them, especially that perfect one.").also { stage++ }
else -> npcl(ntalk1, "Hmm... I think I might be able to make something out of them, especially those perfect ones.").also { stage = 70 }
}
}
62 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the snail shell you're carrying, and I'll try to give you some advice on Crafting while I'm at it.").also { stage++ }
63 -> options("Okay.", "No. I'll keep the bones.").also { stage++ }
64 -> when (buttonId) {
1 -> player(pfr, "Okay.").also { stage = 65 }
2 -> player(pneu, "No thanks.").also { stage = 99 }
}
65 -> {
npcl(ntalk2, "Thanks! Now, I don't think I could use that for Construction, but maybe I could make something...").also { stage = 1000 }
doDaMaffBish()
}
70 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the snail shells you're carrying, and I'll try to give you some advice on Crafting while I'm at it.").also { stage++ }
71 -> options("Okay.", "No. I'll keep the bones.").also { stage++ }
72 -> when (buttonId) {
1 -> player(pfr, "Okay.").also { stage = 75 }
2 -> player(pneu, "No thanks.").also { stage = 99 }
}
75 -> {
npcl(ntalk2, "Thanks! Now, I don't think I could use that for Construction, but maybe I could make something...").also { stage = 1000 }
doDaMaffBish()
}
100 -> player(pfr, "It's a giant battle tortoise shell!").also { stage++ }
101 -> npcl(ntalk1, "Hmm... I think I might be able to make something out of them.").also { stage++ }
102 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the tortoise shells you're carrying.").also { stage++ }
103 -> options("Okay.", "No. I'll keep the bones.").also { stage++ }
104 -> when (buttonId) {
1 -> player(pfr, "Okay.").also { stage = 105 }
2 -> player(pneu, "No thanks.").also { stage = 99 }
}
105 -> {
npcl(ntalk2, "Thanks. If you find any more shells like these, please bring them to me!").also { stage = 130 }
doDaMaffBish()
}
120 -> player(pfr, "It's a giant battle tortoise shell!").also { stage++ }
121 -> {
when (player.inventory.getAmount(Items.PERFECT_SHELL_10995)) {
1 -> npcl(ntalk2, "Hmm... I think I might be able to make something out of them, especially that perfect one.").also { stage++ }
else -> npcl(ntalk1, "Hmm... I think I might be able to make something out of them, especially those perfect ones.").also { stage = 130 }
}
}
122 -> npcl(ntalk2, "I'll give you " + f.format(gibMeDaCoinz(curItem)) + " gp for the tortoise shell you're carrying, and I'll try to give you some advice on Crafting while I'm at it.").also { stage++ }
123 -> options("Okay.", "No. I'll keep the bones.").also { stage++ }
124 -> when (buttonId) {
1 -> player(pfr, "Okay.").also { stage = 125 }
2 -> player(pneu, "No thanks.").also { stage = 99 }
}
125 -> {
npcl(ntalk2, "Thanks! Now, I don't think I could use that for Construction, but maybe I could make something...").also { stage = 1001 }
doDaMaffBish()
}
130 -> {
if (player.inventory.contains(Items.SNAIL_SHELL_7800, 1)) {
curItem = 2
npc(ntalk1, "That giant shell... what is it?").also { stage = 50 }
} else if (player.inventory.contains(Items.PERFECT_SNAIL_SHELL_10996, 1)) {
curItem = 3
npc(ntalk1, "That giant shell... what is it?").also { stage = 60 }
} else {
end()
}
}
150 -> player(FacialExpression.THINKING, "What?").also { stage++ }
151 -> npc(FacialExpression.OLD_DISTRESSED, "I don't have any bones!").also { stage++ }
152 -> options("Then how do you stand up?", "What do you need bones for?", "Will you buy anything besides bones?", "What kind of bones do you need?", "Goodbye").also { stage++ }
153 -> when (buttonId) {
1 -> player(FacialExpression.THINKING, "Then how do you stand up?").also { stage = 200 }
2 -> player(FacialExpression.THINKING, "What do you need bones for?").also { stage = 220 }
3 -> player(FacialExpression.THINKING, "Will you buy anything besides bones?").also { stage = 240 }
4 -> player(FacialExpression.THINKING, "What kind of bones do you need?").also { stage = 260 }
5 -> player(pfr, "Goodbye.").also { stage = 280 }
}
200 -> npc(FacialExpression.OLD_CALM_TALK1, "What?").also { stage++ }
201 -> playerl(FacialExpression.FRIENDLY, "How do you stand up if you have no bones? Shouldn't you collapse into a gelatinous blob?").also { stage++ }
202 -> npc(FacialExpression.OLD_LAUGH1, "Ha, ha, ha, ha, ha!").also { stage = 152 }
220 -> npcl(FacialExpression.OLD_LAUGH1, "To stand up properly. Otherwise I'd collapse into a gelatinous blob! Ha, ha, ha, ha, ha! No, seriously, I need bones to use as a Construction material.").also { stage++ }
221 -> npcl(ntalk1, "We always need big bones to prop up the mine shafts and to make other temporary structures.").also { stage = 152 }
240 -> npcl(ntalk2, "Well, I've had a few people bring me some interesting giant shells. They say they came from giant snails and giant tortoises. Of course, like the bones, some shells are better than others.").also { stage++ }
241 -> npcl(ntalk1, "I'll give you 250gp for ordinary shells, but what I really need are perfect shells.").also { stage++ }
242 -> npcl(ntalk2, "I'll pay double for them and give you a few tips about Crafting too.").also { stage = 152 }
260 -> npcl(ntalk1, "Enormous bones, as big as you can get. Not just any big bones will do. Sometimes you might find a particularly long, straight bone. That's the kind of thing I need; I'll give you 1,000gp for one of them.").also { stage++ }
261 -> npcl(ntalk2, "Occasionally, you might find a long curved bone - these are especially valuable - I'll give you 2,000gp for them. I'll also teach you a bit about how we use the bones in Construction, if you like.").also { stage = 152 }
280 -> npc(ntalk2, "Goodbye.").also { stage = 99 }
999 -> sendDialogue("Barlak gives you a short lecture and you learn more about Construction.").also { stage = 99 }
1000 -> sendDialogue("Barlak gives you a short lecture and you learn more about Crafting.").also { stage = 99 }
1001 -> sendDialogue("Barlak gives you a short lecture and you learn more about Crafting.").also { stage = 130 }
99 -> end()
}
return true
}
private fun wotItem(): Item {
return Item(sets[curItem][0])
}
private fun doDaMaffBish() {
addItemOrDrop(player, 995, gibMeDaCoinz(curItem))
removeAll(player, wotItem(), Container.INVENTORY)
if (inBank(player, sets[curItem][0], 1)) {
removeAll(player, wotItem(), Container.BANK)
}
player.skills.addExperience(gibMeDaSkill(curItem), gibMeDaExp(curItem).toDouble())
}
private fun gibMeDaCoinz(a: Int): Int {
if (inBank(player, sets[curItem][0], 1)) {
toAddFromBank = amountInBank(player, sets[curItem][0])
} else {
toAddFromBank = 0
}
return (player.inventory.getAmount(sets[curItem][0]) * sets[curItem][1]) + (toAddFromBank * sets[curItem][1])
}
private fun gibMeDaExp(a: Int): Int {
return sets[curItem][2]
}
private fun gibMeDaSkill(a: Int): Int {
return sets[curItem][3]
}
override fun newInstance(player: Player?): DialoguePlugin {
return BarlakDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.BARLAK_5828)
}
}
@@ -0,0 +1,44 @@
package rs09.game.content.dialogue.region.dorgeshuun
import core.game.content.dialogue.DialoguePlugin
import core.game.content.dialogue.FacialExpression
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.NPCs
/**
* @author qmqz
*/
@Initializable
class BartakDialogue(player: Player? = null) : DialoguePlugin(player){
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
npc(FacialExpression.OLD_DISTRESSED,"Oh no! What's broken?").also { stage = 0 }
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when(stage){
0 -> player(FacialExpression.ASKING, "What? Nothing's broken?").also { stage++ }
1 -> npc(FacialExpression.OLD_DISTRESSED, "I'm sorry. I'm just a bit jumpy.").also { stage++ }
2 -> npcl(FacialExpression.OLD_DISTRESSED, "I'm in charge of all the metalworking of Dorgesh-Kaan. It's a big responsibility!").also { stage++ }
3 -> npcl(FacialExpression.OLD_DISTRESSED, "If something metal breaks I have to fix it. And lots of things are made of metal!").also { stage++ }
4 -> player(FacialExpression.FRIENDLY, "Don't worry, I'm sure you're up to the task!").also { stage++ }
5 -> npc(FacialExpression.OLD_DISTRESSED, "I hope you're right.").also { stage = 99 }
99 -> end()
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return BartakDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.BARTAK_5778)
}
}
@@ -0,0 +1,38 @@
package rs09.game.content.dialogue.region.dorgeshuun
import core.game.content.dialogue.DialoguePlugin
import core.game.content.dialogue.FacialExpression
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.NPCs
/**
* @author qmqz
*/
@Initializable
class CrateGoblinDialogue(player: Player? = null) : DialoguePlugin(player){
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
npc(FacialExpression.OLD_NORMAL,"Excuse me, I need to deliver this.").also { stage = 99 }
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when(stage){
99 -> end()
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return CrateGoblinDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.CRATE_GOBLIN_5784)
}
}
@@ -0,0 +1,72 @@
package rs09.game.content.dialogue.region.dorgeshuun
import core.game.content.dialogue.DialoguePlugin
import core.game.content.dialogue.FacialExpression
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.NPCs
/**
* @author qmqz
* todo add teleporting when areas are complete
*/
@Initializable
class DartogDialogue(player: Player? = null) : DialoguePlugin(player){
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
npc(FacialExpression.OLD_NORMAL,"Hello, surface-dweller.").also { stage = 0 }
return true
}
private var fr = FacialExpression.FRIENDLY
private var ask = FacialExpression.ASKING
private var nor = FacialExpression.OLD_NORMAL
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when(stage) {
0 -> options("Who are you?", "Can you show me the way to the mine?", "Can you show me the way to Lumbridge Castle cellar?").also { stage++ }
1 -> when (buttonId) {
1 -> player(ask, "Who are you?").also { stage = 10}
2 -> npcl(nor, "Of course! You're always welcome in our mines!").also { stage = 20 }
3 -> player(ask, "Can you show me the way to Lumbridge Castle cellar?").also { stage = 50 }
}
10 -> npcl(nor, "The council posted me here to guard this new tunnel. I can also give you directions through the tunnels. A hero like you is always welcome in our mines!").also { stage++ }
11 -> options("Can you show me the way to the mine?", "Can you show me the way to Lumbridge Castle cellar?", "Maybe some other time").also { stage++ }
12 -> when (buttonId) {
1 -> player(ask, "Can you show me the way to the mine?").also { stage = 40 }
2 -> player(ask, "Can you show me the way to Lumbridge Castle cellar?").also { stage = 50 }
3 -> player(fr, "Maybe some other time.").also { stage = 99 }
}
20 -> {
end()
//move player to mine
}
40 -> {
npcl(nor, "Of course! You're always welcome in our mines!").also { stage = 99 }
//move player to mine
}
50 -> {
npc(nor, "Of course!").also { stage = 99 }
//move to lumby castle celler
}
99 -> end()
}
return true
}
override fun newInstance(player: Player?): DialoguePlugin {
return DartogDialogue(player)
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.DARTOG_4314)
}
}

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