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:
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -218,10 +218,17 @@
|
||||
"no",
|
||||
"We are no strangers to love",
|
||||
"You know the rules and so do I",
|
||||
"A full commitments what Im thinking of",
|
||||
"A full commitment's what I'm thinking of",
|
||||
"You wouldn't get this from any other guy",
|
||||
"I just wanna tell you how I'm feeling",
|
||||
"Gotta make you understand",
|
||||
"You wouldnt get this from any other guy",
|
||||
"Never gonna give you up",
|
||||
"Never gonna let you down",
|
||||
"Never gonna run around and desert you",
|
||||
"Never gonna make you cry",
|
||||
"Never gonna say goodbye",
|
||||
"Never gonna tell a lie and hurt you",
|
||||
"why",
|
||||
"why",
|
||||
"why",
|
||||
@@ -243,7 +250,7 @@
|
||||
"A blessing in disguise @name",
|
||||
"Break a leg",
|
||||
"Cut somebody some slack",
|
||||
"Youre in the right place!",
|
||||
"You're in the right place!",
|
||||
"Thanks so much.",
|
||||
"I really appreciate you @name",
|
||||
"Excuse me @name?",
|
||||
@@ -252,7 +259,7 @@
|
||||
"How does that sound @name?",
|
||||
"That sounds great @name.",
|
||||
"I’m learning English.",
|
||||
"I dont understand.",
|
||||
"I don't understand.",
|
||||
"Could you repeat that please @name?",
|
||||
"Could you please talk slower @name?",
|
||||
"Thank you. That helps a lot.",
|
||||
@@ -310,11 +317,11 @@
|
||||
"bowdi boy",
|
||||
"i love bowdi... sometimes",
|
||||
"@name = @name",
|
||||
"Im bacon.. go on dad... say it",
|
||||
"Im going to leave.",
|
||||
"Im happy @name",
|
||||
"Im not ready yet @name",
|
||||
"Im very busy. I dont have time now.",
|
||||
"I'm bacon.. go on dad... say it",
|
||||
"I'm going to leave.",
|
||||
"I'm happy @name",
|
||||
"I'm not ready yet @name",
|
||||
"I'm very busy. I don't have time now.",
|
||||
"Is that enough @name?",
|
||||
"I thought the clothes were cheaper @name",
|
||||
"Ive been here for two days @name.",
|
||||
@@ -329,7 +336,7 @@
|
||||
"Very good, thanks @name",
|
||||
"Your things are all here i think?",
|
||||
"Long time no see @name",
|
||||
"I couldnt agree more @name",
|
||||
"I couldn't agree more @name",
|
||||
"It cost me a fortune @name",
|
||||
"I am dog tired",
|
||||
"Don’t take it personally",
|
||||
@@ -338,7 +345,187 @@
|
||||
"No problem",
|
||||
"Anyway I should get going @name",
|
||||
"I cant help you there @name",
|
||||
"I agree 100% @name"
|
||||
"I agree 100% @name",
|
||||
"I've gone mentally insane",
|
||||
"My descent into madness is complete",
|
||||
"Get real",
|
||||
"Cry about it",
|
||||
"Cope",
|
||||
"Seethe",
|
||||
"Yes mate",
|
||||
"I am mentally deranged",
|
||||
"I've gone past the point of insanity",
|
||||
"I am beyond the point of no return",
|
||||
"Sounds tricky.",
|
||||
"Guthiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxx!!!!!!",
|
||||
"530 gang for life",
|
||||
"${real.username}, have you read the rules?",
|
||||
"${real.username}, have you checked out the Discord?",
|
||||
"why are the leprechauns moving?",
|
||||
"I am beyond the point of no return!",
|
||||
"Nothin' personnel, kid.",
|
||||
"All your base are belong to us",
|
||||
"May Guthix bring you balance.",
|
||||
"May Guthix bring you balance.",
|
||||
"May Guthix bring you balance.",
|
||||
"Thy death was not in vain, for it brought some balance to the world. May Guthix bring you rest.",
|
||||
"May you walk the path, and never fall, for Guthix walks beside thee on thy journey. May Guthix bring you peace.",
|
||||
"All things must end, as all begin; Only Guthix knows the role thou must play. May Guthix bring you balance.",
|
||||
"In life, in death, in joy, in sorrow: May thine experience show thee balance. May Guthix bring you balance.",
|
||||
"Thou must do as thou must, no matter what. Thine actions bring balance to this world. May Guthix bring you balance.",
|
||||
"The river flows, the sun ignites, May you stand with Guthix in thy fights. May Guthix bring you balance.",
|
||||
"A journey of a single step, May take thee over a thousand miles. May Guthix bring you balance.",
|
||||
"Zamorak give me strength!",
|
||||
"Zamorak give me strength!",
|
||||
"Zamorak give me strength!",
|
||||
"May your bloodthirst never be sated, and may all your battles be glorious. Zamorak bring you strength.",
|
||||
"There is no opinion that cannot be proven true...by crushing those who choose to disagree with it. Zamorak give me strength!",
|
||||
"Battles are not lost and won; They simply remove the weak from the equation. Zamorak give me strength!",
|
||||
"Those who fight, then run away, shame Zamorak with their cowardice. Zamorak give me strength!",
|
||||
"Battle is by those who choose to disagree with it. Zamorak give me strength!",
|
||||
"Strike fast, strike hard, strike true: The strength of Zamorak will be with you. Zamorak give me strength!",
|
||||
"The weak deserve to die, so the strong may flourish. This is the creed of Zamorak.",
|
||||
"This is Saradomin's wisdom.",
|
||||
"This is Saradomin's wisdom.",
|
||||
"This is Saradomin's wisdom.",
|
||||
"Go in peace in the name of Saradomin; may his glory shine upon you like the sun.",
|
||||
"Thy cause was false, thy skills did lack; See you in Lumbridge when you get back.",
|
||||
"Protect your self, protect your friends. Mine is the glory that never ends. This is Saradomin's wisdom.",
|
||||
"The darkness in life may be avoided, by the light of wisdom shining. This is Saradomin's wisdom.",
|
||||
"Show love to your friends, and mercy to your enemies, and know that the wisdom of Saradomin will follow. This is Saradomin's wisdom.",
|
||||
"A fight begun, when the cause is just, will prevail over all others. This is Saradomin's wisdom.",
|
||||
"The currency of goodness is honour; It retains its value through scarcity. This is Saradomin's wisdom.",
|
||||
"For Camelot!",
|
||||
"Firmly grasp it!",
|
||||
"My legs!",
|
||||
"Build more farms.",
|
||||
"B sale at Varrock ${real.username}, don't miss out!",
|
||||
"Drop party follow me",
|
||||
"Ryan where is barbass, you said two days Ryan",
|
||||
"Barbass never",
|
||||
"What da dog doin' doe?",
|
||||
"A",
|
||||
"Ae",
|
||||
"Mof",
|
||||
"Moth",
|
||||
"Fluff",
|
||||
"Bwuh",
|
||||
"I'm literally just mothin' bro",
|
||||
"Certified 2009scape classic.",
|
||||
"Make sure to like, comment and subscribe ${real.username} it really helps",
|
||||
"Real 2009scape hours!!! Murder that like if you up!!!!",
|
||||
"W00t!",
|
||||
"Owned!",
|
||||
"Pwned!",
|
||||
"Lol n00b",
|
||||
"Epic ownage ${real.username}",
|
||||
"Gielinor is a strange place, ${real.username}. Best have your wits about you.",
|
||||
"Mad bloggers bro",
|
||||
"Vibe check",
|
||||
"Drip check",
|
||||
"Uhuhuhuhuhuhuhuhu",
|
||||
"Ahhhhhhhhhhhhhhhh",
|
||||
"yall got any deez?",
|
||||
"Deez nuts",
|
||||
"When she give you that yoinky sploinky",
|
||||
"Sir, this is a 2009scape.",
|
||||
"Oh dear! You are dead!",
|
||||
"Cor blimey, mate! What are ye doing in me pockets?",
|
||||
"yeah i got funnies",
|
||||
"read muv luv",
|
||||
"Why doesn't she love me bros?",
|
||||
"${real.username} is off the goop don't listen to the clown",
|
||||
"do yall got laptops",
|
||||
"cfunny play the alien warp sound effect",
|
||||
"Ware to all whom doom hither, where cope is all yet constant.",
|
||||
"Who wants to come GWD?",
|
||||
"How do I make money?",
|
||||
"Ironmen stand alone together!",
|
||||
"based",
|
||||
"where is she",
|
||||
"*S N I I I I I I I I I F F F F F F F F F F F*",
|
||||
"Hey ${real.username}, who was in Paris?",
|
||||
"Huh whuh?",
|
||||
"who's lone?",
|
||||
"who *is* he?",
|
||||
"Hi ${real.username}, I'm Dad!",
|
||||
"anyone wanna play melty blood after I high alch these bows?",
|
||||
"buru nyaaaa",
|
||||
"Number 15, Taverley Dungeon Black Dragons.",
|
||||
"House party at Rimmington! Host: ${real.username}!",
|
||||
"Spending 200m! Trade me, no junk!",
|
||||
"Surprise exam, ${real.username}!",
|
||||
"Nice outfit ${real.username}, does it come in mens?",
|
||||
"Nice outfit ${real.username}, does it come in womens?",
|
||||
"Nice outfit ${real.username}, does it come in children's size 12?",
|
||||
":)",
|
||||
":D",
|
||||
"die screaming",
|
||||
"Only on Tuesdays",
|
||||
"we stan 2009scape",
|
||||
"There is no spoon",
|
||||
"Where's the cow level?",
|
||||
"Join 2009scape Clan Chat!",
|
||||
"Join 2009scape Cc!",
|
||||
"Chop chop!",
|
||||
"Runescape rox my sox!!!!!!1",
|
||||
"Type ::scripts for all 99s",
|
||||
"Help I just died to Evil Chicken and I lost my stuff!",
|
||||
"Can you fight Bandos in this game?",
|
||||
"one bad gloop",
|
||||
"${real.username} is not cute or funny",
|
||||
"You have committed crimes against Gielinor and her people. What say you?",
|
||||
"Barrows trauma",
|
||||
"Uhuhuhuhuhu please Barrows give me the K top ahhhhhh",
|
||||
"Selling rare lobby 1m",
|
||||
"Rise and grind bloatscapers, let's get this bread",
|
||||
"Nice",
|
||||
"Sandwiches, ${real.username}!",
|
||||
"What a grand and intoxicating innocence!",
|
||||
"With this character's death, the thread of prophecy is severed.",
|
||||
"You must gather your party before venturing forth.",
|
||||
"Praise Andrew Gower",
|
||||
"Please help me I can't stop playing 2009scape",
|
||||
"Are you ignoring me, ${real.username}?!",
|
||||
"i agree with this rfc can we put it in the game please"
|
||||
],
|
||||
"halloween": [
|
||||
"Trick or treat!!!",
|
||||
"Boo! Hahahahaha!!",
|
||||
"Have you got your costume on, ${real.username}?",
|
||||
"How much candy did you get, ${real.username}?",
|
||||
"Don't dead open inside",
|
||||
"Costume party at my POH!! Follow me!",
|
||||
"Trick, then!",
|
||||
"Brrrainssssssss...",
|
||||
"'Cause this is thriller, thriller night, and no one's gonna save you from the beast about to strike!",
|
||||
"This is Hallowe'en, this is Hallowe'en, pumpkins scream in the dead of night!",
|
||||
"This is Hallowe'en, everybody make a scene, Trick or treat till the neighbors gonna die of fright!",
|
||||
"In this town we call home, everyone hail to the pumpkin song!",
|
||||
"Watch out for Skeleton Jack!",
|
||||
"The headless-what-man? Horse? Never heard of those.",
|
||||
"Bring me their souls!",
|
||||
"I'll take any sweets you don't want, ${real.username}",
|
||||
"Whatever you do, don't come to Draynor Manor on this spooky night.",
|
||||
"Ahhhh! ${real.username}, you scared me! :(",
|
||||
"I'm making soup from some leftover pumpkins, want any?",
|
||||
"I'm gonna be so sick from eating all these sweets...",
|
||||
"Rise from the grave, my minions! Tis' Hallowe'en!",
|
||||
"This Scream Fortress 2 update hits kinda different...",
|
||||
"Nice costume Woah",
|
||||
"Nice costume, ${real.username}!",
|
||||
"Ooh, a piece of candy.",
|
||||
"Time to join the skeleton war, ${real.username}.",
|
||||
"Spooky scary skeletons!",
|
||||
"Spooky scary skeletons!",
|
||||
"Spooky scary skeletons!",
|
||||
"Spooky scary skeletons, send shivers down your spine!",
|
||||
"Shrieking skulls will shock your soul, seal your doom tonight!",
|
||||
"Spooky scary skeletons, speak with such a screech!",
|
||||
"You'll shake and shudder in surprise, when you hear these zombies shriek!",
|
||||
"'Cause spooky scary skeletons, shout startling shrilly screams!",
|
||||
"Spooky scary skeletons, will wake you with a boo!",
|
||||
"*doot doot*"
|
||||
],
|
||||
"approaching_christmas": [
|
||||
"Only @timer days left till christmas!",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -5862,6 +5862,7 @@
|
||||
"name": "Wizard hat",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "579",
|
||||
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
|
||||
},
|
||||
@@ -6590,9 +6591,11 @@
|
||||
{
|
||||
"ge_buy_limit": "100",
|
||||
"grand_exchange_price": "677",
|
||||
"examine": "A silly pointed hat.",
|
||||
"durability": null,
|
||||
"name": "Hat",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "656",
|
||||
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
|
||||
"equipment_slot": "0"
|
||||
@@ -6609,9 +6612,11 @@
|
||||
{
|
||||
"ge_buy_limit": "100",
|
||||
"grand_exchange_price": "480",
|
||||
"examine": "A silly pointed hat.",
|
||||
"durability": null,
|
||||
"name": "Hat",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "658",
|
||||
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
|
||||
"equipment_slot": "0"
|
||||
@@ -6628,9 +6633,11 @@
|
||||
{
|
||||
"ge_buy_limit": "100",
|
||||
"grand_exchange_price": "421",
|
||||
"examine": "A silly pointed hat.",
|
||||
"durability": null,
|
||||
"name": "Hat",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "660",
|
||||
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
|
||||
"equipment_slot": "0"
|
||||
@@ -6647,9 +6654,11 @@
|
||||
{
|
||||
"ge_buy_limit": "100",
|
||||
"grand_exchange_price": "1102",
|
||||
"examine": "A silly pointed hat.",
|
||||
"durability": null,
|
||||
"name": "Hat",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "662",
|
||||
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
|
||||
"equipment_slot": "0"
|
||||
@@ -6669,12 +6678,14 @@
|
||||
"durability": null,
|
||||
"name": "Hat",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "664",
|
||||
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
|
||||
"equipment_slot": "0"
|
||||
},
|
||||
{
|
||||
"ge_buy_limit": "100",
|
||||
"examine": "A silly pointed hat.",
|
||||
"grand_exchange_price": "295",
|
||||
"durability": null,
|
||||
"name": "Hat",
|
||||
@@ -6794,7 +6805,7 @@
|
||||
"id": "676"
|
||||
},
|
||||
{
|
||||
"examine": "An empty tray for panning./This tray contains mud.",
|
||||
"examine": "An empty tray for panning.",
|
||||
"durability": null,
|
||||
"name": "Panning tray",
|
||||
"high_alchemy": "1",
|
||||
@@ -6802,7 +6813,7 @@
|
||||
"id": "677"
|
||||
},
|
||||
{
|
||||
"examine": "An empty tray for panning./This tray contains mud.",
|
||||
"examine": "This tray contains gold nuggets.",
|
||||
"durability": null,
|
||||
"name": "Panning tray",
|
||||
"high_alchemy": "1",
|
||||
@@ -6810,7 +6821,7 @@
|
||||
"id": "678"
|
||||
},
|
||||
{
|
||||
"examine": "An empty tray for panning./This tray contains mud.",
|
||||
"examine": "This tray contains mud.",
|
||||
"durability": null,
|
||||
"name": "Panning tray",
|
||||
"high_alchemy": "1",
|
||||
@@ -7275,6 +7286,7 @@
|
||||
"name": "Blue hat",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "740",
|
||||
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
|
||||
},
|
||||
@@ -10047,6 +10059,7 @@
|
||||
"name": "Wizard hat",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "1017",
|
||||
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
|
||||
},
|
||||
@@ -10458,6 +10471,7 @@
|
||||
"name": "Santa hat",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "1050"
|
||||
},
|
||||
{
|
||||
@@ -15843,7 +15857,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "1391",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,0,0,0",
|
||||
"bonuses": "7,-1,25,12,0,2,3,1,12,0,0,32,0,0,0",
|
||||
"requirements": "{0,30}-{6,30}",
|
||||
"shop_price": "7000",
|
||||
"durability": null,
|
||||
@@ -15882,7 +15896,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "1393",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
|
||||
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
|
||||
"requirements": "{0,30}-{6,30}",
|
||||
"shop_price": "19600",
|
||||
"durability": null,
|
||||
@@ -15922,7 +15936,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "1395",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
|
||||
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
|
||||
"requirements": "{0,30}-{6,30}",
|
||||
"durability": null,
|
||||
"high_alchemy": "9300",
|
||||
@@ -15961,7 +15975,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "1397",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
|
||||
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
|
||||
"requirements": "{0,30}-{6,30}",
|
||||
"shop_price": "7000",
|
||||
"durability": null,
|
||||
@@ -16001,7 +16015,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "1399",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
|
||||
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
|
||||
"requirements": "{0,30}-{6,30}",
|
||||
"shop_price": "1500",
|
||||
"durability": null,
|
||||
@@ -16041,7 +16055,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "1401",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
|
||||
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
|
||||
"requirements": "{0,40}-{6,40}",
|
||||
"durability": null,
|
||||
"high_alchemy": "25500",
|
||||
@@ -16079,7 +16093,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "1403",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
|
||||
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
|
||||
"requirements": "{0,40}-{6,40}",
|
||||
"durability": null,
|
||||
"high_alchemy": "25500",
|
||||
@@ -16116,7 +16130,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "1405",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
|
||||
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
|
||||
"requirements": "{0,40}-{6,40}",
|
||||
"durability": null,
|
||||
"high_alchemy": "25500",
|
||||
@@ -16154,7 +16168,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "1407",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
|
||||
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
|
||||
"requirements": "{0,40}-{6,40}",
|
||||
"shop_price": "40000",
|
||||
"durability": null,
|
||||
@@ -27879,6 +27893,7 @@
|
||||
"name": "Robin hood hat",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "2581",
|
||||
"bonuses": "0,0,0,-10,8,4,6,8,4,4,7,0,0,0,0"
|
||||
},
|
||||
@@ -28788,6 +28803,7 @@
|
||||
"low_alchemy": "72",
|
||||
"high_alchemy": "108",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "2651",
|
||||
"equipment_slot": "0"
|
||||
},
|
||||
@@ -28873,7 +28889,7 @@
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "2657",
|
||||
"bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0"
|
||||
"bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,1"
|
||||
},
|
||||
{
|
||||
"ge_buy_limit": "2",
|
||||
@@ -28942,7 +28958,7 @@
|
||||
{
|
||||
"requirements": "{1,40}",
|
||||
"ge_buy_limit": "2",
|
||||
"examine": "Rune platelegs in the colours of Saradomin!",
|
||||
"examine": "Rune platelegs in the colours of Saradomin.",
|
||||
"durability": null,
|
||||
"low_alchemy": "25600",
|
||||
"high_alchemy": "38400",
|
||||
@@ -29095,7 +29111,7 @@
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "2673",
|
||||
"bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0"
|
||||
"bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,1,0,0"
|
||||
},
|
||||
{
|
||||
"ge_buy_limit": "2",
|
||||
@@ -30882,6 +30898,7 @@
|
||||
"name": "Hat",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "2900",
|
||||
"bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0",
|
||||
"equipment_slot": "0"
|
||||
@@ -32495,7 +32512,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "3053",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
|
||||
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
|
||||
"requirements": "{0,30}-{6,30}",
|
||||
"durability": null,
|
||||
"high_alchemy": "10200",
|
||||
@@ -32525,7 +32542,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "3054",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
|
||||
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
|
||||
"requirements": "{0,40}-{6,40}",
|
||||
"shop_price": "160",
|
||||
"durability": null,
|
||||
@@ -39292,7 +39309,7 @@
|
||||
"id": "4020"
|
||||
},
|
||||
{
|
||||
"examine": "It's an unstrung Amulet of Monkey Speak. It makes vague chattering noises.",
|
||||
"examine": "It's an Amulet of Monkey Speak. It makes vague chattering noises.",
|
||||
"durability": null,
|
||||
"name": "M'speak amulet",
|
||||
"weight": "1.3",
|
||||
@@ -63469,7 +63486,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "6562",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
|
||||
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
|
||||
"requirements": "{0,30}-{6,30}",
|
||||
"durability": null,
|
||||
"high_alchemy": "10200",
|
||||
@@ -63497,7 +63514,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "6563",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
|
||||
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
|
||||
"requirements": "{0,40}-{6,40}",
|
||||
"shop_price": "40000",
|
||||
"durability": null,
|
||||
@@ -71231,16 +71248,17 @@
|
||||
{
|
||||
"ge_buy_limit": "2",
|
||||
"examine": "A silly pointed hat with colourful trim.",
|
||||
"grand_exchange_price": "1400000",
|
||||
"durability": null,
|
||||
"name": "Wizard hat (g)",
|
||||
"tradeable": "true",
|
||||
"high_alchemy": "1",
|
||||
"weight": "1",
|
||||
"equipment_slot": "0",
|
||||
"grand_exchange_price": "1400000",
|
||||
"name": "Wizard hat (g)",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "7394",
|
||||
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0",
|
||||
"equipment_slot": "0"
|
||||
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
|
||||
},
|
||||
{
|
||||
"ge_buy_limit": "2",
|
||||
@@ -71254,16 +71272,17 @@
|
||||
{
|
||||
"ge_buy_limit": "2",
|
||||
"examine": "A silly pointed hat, with colourful trim.",
|
||||
"grand_exchange_price": "352700",
|
||||
"durability": null,
|
||||
"name": "Wizard hat (t)",
|
||||
"tradeable": "true",
|
||||
"high_alchemy": "1",
|
||||
"weight": "0.4",
|
||||
"equipment_slot": "0",
|
||||
"grand_exchange_price": "352700",
|
||||
"name": "Wizard hat (t)",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"hat": "true",
|
||||
"id": "7396",
|
||||
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0",
|
||||
"equipment_slot": "0"
|
||||
"bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0"
|
||||
},
|
||||
{
|
||||
"ge_buy_limit": "2",
|
||||
@@ -93676,7 +93695,7 @@
|
||||
"id": "10371"
|
||||
},
|
||||
{
|
||||
"requirements": "{1,40}-{4,70}",
|
||||
"requirements": "{4,70}",
|
||||
"ge_buy_limit": "2",
|
||||
"examine": "Zamorak blessed dragonhide chaps.",
|
||||
"durability": null,
|
||||
@@ -93781,7 +93800,7 @@
|
||||
"id": "10379"
|
||||
},
|
||||
{
|
||||
"requirements": "{1,40}-{4,70}",
|
||||
"requirements": "{4,70}",
|
||||
"ge_buy_limit": "2",
|
||||
"examine": "Guthix blessed dragonhide chaps.",
|
||||
"durability": null,
|
||||
@@ -93888,7 +93907,7 @@
|
||||
"id": "10387"
|
||||
},
|
||||
{
|
||||
"requirements": "{1,40}-{4,70}",
|
||||
"requirements": "{4,70}",
|
||||
"ge_buy_limit": "2",
|
||||
"examine": "Saradomin blessed dragonhide chaps.",
|
||||
"durability": null,
|
||||
@@ -98229,7 +98248,7 @@
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "10780",
|
||||
"bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,1"
|
||||
"bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,0"
|
||||
},
|
||||
{
|
||||
"examine": "Rune platebody with complete gold trim & plating.",
|
||||
@@ -105823,9 +105842,9 @@
|
||||
"examine": "Part of the Godsword blade.",
|
||||
"grand_exchange_price": "150200",
|
||||
"durability": null,
|
||||
"rare_item": "true",
|
||||
"name": "Godsword shard 1",
|
||||
"tradeable": "true",
|
||||
"rare_item": "true",
|
||||
"low_alchemy": "100000",
|
||||
"high_alchemy": "150000",
|
||||
"weight": "2",
|
||||
@@ -105844,15 +105863,15 @@
|
||||
{
|
||||
"ge_buy_limit": "10",
|
||||
"examine": "Part of the Godsword blade.",
|
||||
"grand_exchange_price": "149100",
|
||||
"durability": null,
|
||||
"name": "Godsword shard 2",
|
||||
"tradeable": "true",
|
||||
"rare_item": "true",
|
||||
"low_alchemy": "100000",
|
||||
"high_alchemy": "150000",
|
||||
"destroy": "true",
|
||||
"weight": "2",
|
||||
"grand_exchange_price": "149100",
|
||||
"name": "Godsword shard 2",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "11712"
|
||||
},
|
||||
@@ -105870,9 +105889,9 @@
|
||||
"examine": "Part of the Godsword blade.",
|
||||
"grand_exchange_price": "149800",
|
||||
"durability": null,
|
||||
"rare_item": "true",
|
||||
"name": "Godsword shard 3",
|
||||
"tradeable": "true",
|
||||
"rare_item": "true",
|
||||
"low_alchemy": "100000",
|
||||
"high_alchemy": "150000",
|
||||
"weight": "2",
|
||||
@@ -106206,7 +106225,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "11736",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0",
|
||||
"bonuses": "7,-1,28,12,0,2,3,1,12,0,0,35,0,0,0",
|
||||
"requirements": "{0,30}-{6,30}",
|
||||
"durability": null,
|
||||
"high_alchemy": "10200",
|
||||
@@ -106243,7 +106262,7 @@
|
||||
"archery_ticket_price": "0",
|
||||
"id": "11738",
|
||||
"stand_turn_anim": "1209",
|
||||
"bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0",
|
||||
"bonuses": "10,-1,40,14,0,2,3,1,14,0,0,50,0,0,0",
|
||||
"requirements": "{0,40}-{6,40}",
|
||||
"durability": null,
|
||||
"high_alchemy": "27000",
|
||||
@@ -129223,7 +129242,7 @@
|
||||
"bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0"
|
||||
},
|
||||
{
|
||||
"examine": "Rune platelegs in the colours of Saradomin!",
|
||||
"examine": "Rune platelegs in the colours of Saradomin.",
|
||||
"durability": null,
|
||||
"low_alchemy": "25600",
|
||||
"high_alchemy": "38400",
|
||||
@@ -129661,7 +129680,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "12,6,0",
|
||||
"equipment_slot": "4",
|
||||
@@ -129669,6 +129688,7 @@
|
||||
"remove_sleeves": "true",
|
||||
"grand_exchange_price": "1412812",
|
||||
"name": "Zuriel's robe top",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13858",
|
||||
"bonuses": "0,0,0,35,-10,63,45,74,35,0,60,0,0,0,0"
|
||||
@@ -129680,7 +129700,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "1412812",
|
||||
@@ -129715,13 +129735,14 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "8,4,0",
|
||||
"equipment_slot": "7",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "986668",
|
||||
"name": "Zuriel's robe bottom",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13861",
|
||||
"bonuses": "0,0,0,25,-7,38,35,44,24,0,30,0,0,0,0"
|
||||
@@ -129733,7 +129754,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "986668",
|
||||
@@ -129768,13 +129789,14 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "100000",
|
||||
"high_alchemy": "150000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "6,3,0",
|
||||
"equipment_slot": "0",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "361542",
|
||||
"name": "Zuriel's hood",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13864",
|
||||
"bonuses": "0,0,0,8,-2,20,16,22,8,0,15,0,0,0,0"
|
||||
@@ -129786,7 +129808,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "100000",
|
||||
"high_alchemy": "150000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "361542",
|
||||
@@ -129830,6 +129852,7 @@
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "2116989",
|
||||
"stand_anim": "813",
|
||||
"tradeable": "true",
|
||||
"run_anim": "1210",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13867",
|
||||
@@ -129839,7 +129862,7 @@
|
||||
"shop_price": "300000",
|
||||
"durability": null,
|
||||
"high_alchemy": "180000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"weapon_interface": "1",
|
||||
"render_anim": "28",
|
||||
"attack_audios": "2555,0,0,0",
|
||||
@@ -129852,7 +129875,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "120000",
|
||||
"high_alchemy": "180000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "2116989",
|
||||
@@ -129899,7 +129922,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "0,12,6",
|
||||
"equipment_slot": "4",
|
||||
@@ -129907,6 +129930,7 @@
|
||||
"remove_sleeves": "true",
|
||||
"grand_exchange_price": "926341",
|
||||
"name": "Morrigan's leather body",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13870",
|
||||
"bonuses": "0,0,0,-15,36,61,53,66,75,62,60,0,0,0,0"
|
||||
@@ -129918,7 +129942,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "926341",
|
||||
@@ -129953,13 +129977,14 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "0,8,4",
|
||||
"equipment_slot": "7",
|
||||
"destroy_message": "Drop, Destroy after degrading.",
|
||||
"grand_exchange_price": "510395",
|
||||
"name": "Morrigan's leather chaps",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13873",
|
||||
"bonuses": "0,0,0,-10,23,35,29,37,46,35,30,0,0,0,0"
|
||||
@@ -129971,7 +129996,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop, Destroy after degrading.",
|
||||
"grand_exchange_price": "510395",
|
||||
@@ -130006,13 +130031,14 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "100000",
|
||||
"high_alchemy": "150000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "0,6,3",
|
||||
"equipment_slot": "0",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "236411",
|
||||
"name": "Morrigan's coif",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13876",
|
||||
"bonuses": "0,0,0,-5,13,8,11,14,8,12,15,0,0,0,0"
|
||||
@@ -130024,7 +130050,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "100000",
|
||||
"high_alchemy": "150000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "236411",
|
||||
@@ -130060,7 +130086,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "1600",
|
||||
"high_alchemy": "2400",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "6",
|
||||
"weapon_interface": "18",
|
||||
"absorb": "0,0,0",
|
||||
@@ -130069,6 +130095,7 @@
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "19944",
|
||||
"name": "Morrigan's javelin",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13879",
|
||||
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
|
||||
@@ -130081,7 +130108,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "1600",
|
||||
"high_alchemy": "2400",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "6",
|
||||
"weapon_interface": "18",
|
||||
"absorb": "0,0,0",
|
||||
@@ -130090,6 +130117,7 @@
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "19944",
|
||||
"name": "Morrigan's javelin(p)",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13880",
|
||||
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
|
||||
@@ -130102,7 +130130,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "1600",
|
||||
"high_alchemy": "2400",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "6",
|
||||
"weapon_interface": "18",
|
||||
"absorb": "0,0,0",
|
||||
@@ -130111,6 +130139,7 @@
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "19944",
|
||||
"name": "Morrigan's javelin(p+)",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13881",
|
||||
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
|
||||
@@ -130123,7 +130152,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "1600",
|
||||
"high_alchemy": "2400",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "6",
|
||||
"weapon_interface": "18",
|
||||
"absorb": "0,0,0",
|
||||
@@ -130132,6 +130161,7 @@
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "19944",
|
||||
"name": "Morrigan's javelin(p++)",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13882",
|
||||
"bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,0,0,0"
|
||||
@@ -130144,7 +130174,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "1600",
|
||||
"high_alchemy": "2400",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "5",
|
||||
"weapon_interface": "18",
|
||||
"absorb": "0,0,0",
|
||||
@@ -130152,6 +130182,7 @@
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "9994",
|
||||
"name": "Morrigan's throwing axe",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13883",
|
||||
"bonuses": "0,0,0,0,93,0,0,0,0,0,0,0,0,0,0"
|
||||
@@ -130163,7 +130194,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "6,0,12",
|
||||
"equipment_slot": "4",
|
||||
@@ -130171,6 +130202,7 @@
|
||||
"remove_sleeves": "true",
|
||||
"grand_exchange_price": "1619096",
|
||||
"name": "Statius's platebody",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13884",
|
||||
"bonuses": "5,5,7,-30,-10,154,145,121,-6,157,60,5,0,0,0"
|
||||
@@ -130182,7 +130214,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "1619096",
|
||||
@@ -130217,7 +130249,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "6,0,12",
|
||||
"equipment_slot": "4",
|
||||
@@ -130225,6 +130257,7 @@
|
||||
"remove_sleeves": "true",
|
||||
"grand_exchange_price": "2154168",
|
||||
"name": "Vesta's chainbody",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13887",
|
||||
"bonuses": "5,7,7,-15,0,120,131,145,-3,140,60,6,0,0,0"
|
||||
@@ -130236,7 +130269,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop, Destroy once it has been degraded.",
|
||||
"grand_exchange_price": "2154168",
|
||||
@@ -130271,13 +130304,14 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "4,0,8",
|
||||
"equipment_slot": "7",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "1735029",
|
||||
"name": "Statius's platelegs",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13890",
|
||||
"bonuses": "3,3,5,-21,-7,110,106,97,-4,121,30,3,0,0,0"
|
||||
@@ -130289,7 +130323,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "1735029",
|
||||
@@ -130323,13 +130357,14 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "4,0,8",
|
||||
"equipment_slot": "7",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "1860767",
|
||||
"name": "Vesta's plateskirt",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13893",
|
||||
"bonuses": "3,5,5,-17,-4,86,100,112,-2,118,30,3,0,0,0"
|
||||
@@ -130341,7 +130376,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "200000",
|
||||
"high_alchemy": "300000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "1860767",
|
||||
@@ -130376,13 +130411,14 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "100000",
|
||||
"high_alchemy": "150000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"absorb": "3,0,6",
|
||||
"equipment_slot": "0",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "1301986",
|
||||
"name": "Statius's full helm",
|
||||
"tradeable": "true",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13896",
|
||||
"bonuses": "3,3,4,-6,-2,65,70,63,-1,71,15,3,0,0,0"
|
||||
@@ -130394,7 +130430,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "100000",
|
||||
"high_alchemy": "150000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "1301986",
|
||||
@@ -130438,6 +130474,7 @@
|
||||
"attack_anims": "381,390,390,390",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "10464249",
|
||||
"tradeable": "true",
|
||||
"run_anim": "824",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13899",
|
||||
@@ -130447,7 +130484,7 @@
|
||||
"shop_price": "300000",
|
||||
"durability": null,
|
||||
"high_alchemy": "180000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"weapon_interface": "5",
|
||||
"render_anim": "1426",
|
||||
"attack_audios": "2500,2500,2517,2500",
|
||||
@@ -130460,7 +130497,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "120000",
|
||||
"high_alchemy": "180000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "10464249",
|
||||
@@ -130516,6 +130553,7 @@
|
||||
"destroy_message": "Drop, Destroy once it has been degraded.",
|
||||
"grand_exchange_price": "7424450",
|
||||
"stand_anim": "808",
|
||||
"tradeable": "true",
|
||||
"run_anim": "1210",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13902",
|
||||
@@ -130525,7 +130563,7 @@
|
||||
"shop_price": "300000",
|
||||
"durability": null,
|
||||
"high_alchemy": "180000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"weapon_interface": "10",
|
||||
"attack_audios": "2504,0,0,0",
|
||||
"name": "Statius's warhammer"
|
||||
@@ -130537,7 +130575,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "120000",
|
||||
"high_alchemy": "180000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"destroy_message": "Drop, Destroy once it has been degraded.",
|
||||
"grand_exchange_price": "7424450",
|
||||
@@ -130593,6 +130631,7 @@
|
||||
"destroy_message": "Drop",
|
||||
"grand_exchange_price": "5264612",
|
||||
"stand_anim": "813",
|
||||
"tradeable": "true",
|
||||
"run_anim": "1210",
|
||||
"archery_ticket_price": "0",
|
||||
"id": "13905",
|
||||
@@ -130602,7 +130641,7 @@
|
||||
"shop_price": "300000",
|
||||
"durability": null,
|
||||
"high_alchemy": "180000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"weight": "4.2",
|
||||
"weapon_interface": "14",
|
||||
"render_anim": "28",
|
||||
@@ -130615,7 +130654,7 @@
|
||||
"durability": null,
|
||||
"low_alchemy": "120000",
|
||||
"high_alchemy": "180000",
|
||||
"destroy": "true",
|
||||
"destroy": "false",
|
||||
"attack_speed": "4",
|
||||
"two_handed": "true",
|
||||
"destroy_message": "Drop",
|
||||
@@ -139623,5 +139662,10 @@
|
||||
"render_anim": "28",
|
||||
"attack_audios": "2555,0,0,0",
|
||||
"name": "Staff of the raven"
|
||||
},
|
||||
{
|
||||
"examine": "Item container for C. Ele Minor Drop Table. You should not be able to obtain this item.",
|
||||
"name": "C. Ele Minor Drop Table",
|
||||
"id": "799"
|
||||
}
|
||||
]
|
||||
]
|
||||
@@ -2181,7 +2181,7 @@
|
||||
"id": "573",
|
||||
"name": "The Mad Mole",
|
||||
"indexId": "393",
|
||||
"borders": "{1728,5120,1791,5183}"
|
||||
"borders": "{1728,5120,1791,5247}"
|
||||
},
|
||||
{
|
||||
"id": "575",
|
||||
|
||||
+1235
-27233
File diff suppressed because it is too large
Load Diff
@@ -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}"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
]
|
||||
+16
-11
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
-264
@@ -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};
|
||||
}
|
||||
}
|
||||
+9
-7
@@ -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.
|
||||
|
||||
+26
@@ -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
-2
@@ -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;
|
||||
}
|
||||
|
||||
+1
-1
@@ -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.
|
||||
|
||||
+2
-1
@@ -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()
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
+40
-21
@@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
+87
-86
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+54
@@ -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)
|
||||
}
|
||||
}
|
||||
+145
@@ -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)
|
||||
}
|
||||
}
|
||||
+94
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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
|
||||
}
|
||||
+64
@@ -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)
|
||||
}
|
||||
}
|
||||
+63
@@ -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)
|
||||
}
|
||||
}
|
||||
+39
@@ -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)
|
||||
}
|
||||
}
|
||||
+71
@@ -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)
|
||||
}
|
||||
}
|
||||
+82
@@ -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
-1
@@ -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
-1
@@ -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)
|
||||
}
|
||||
}
|
||||
+241
@@ -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)
|
||||
}
|
||||
}
|
||||
+38
@@ -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
Reference in New Issue
Block a user