forked from 2009Scape/Server
Compare commits
No commits in common. "master" and "Nov-11-2023" have entirely different histories.
master
...
Nov-11-202
1404 changed files with 40668 additions and 114170 deletions
|
|
@ -149,4 +149,4 @@ These credits can be spent in the 2009Scape Reward Shop. It's important to be cl
|
|||
|
||||
Testers are not the only people who can gain credits - other ways of earning credits can be found on [the 2009Scape website](https://2009scape.org/site/game_guide/credits.html).
|
||||
|
||||
Please be patient! The Credit system is not fully complete yet, so it will take a long time for credits to be awarded.
|
||||
Please be patient! The Credit system is not fully complete yet, so it will take a long time for credits to be awarded.
|
||||
|
|
|
|||
1
Server/.gitignore
vendored
1
Server/.gitignore
vendored
|
|
@ -2,7 +2,6 @@ bin/**
|
|||
out/**
|
||||
data/logs/**
|
||||
data/profile/**
|
||||
data/playerstats/**
|
||||
.idea/**
|
||||
/bin
|
||||
.DS_Store**
|
||||
|
|
|
|||
|
|
@ -25,7 +25,4 @@
|
|||
<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"/>
|
||||
|
||||
<ObjectAction mode="add" id="2489" x="2839" y="3282" z="0" direction="w"/>
|
||||
<ObjectAction mode="add" id="36695" x="2894" y="3510" z="0" direction="w"/>
|
||||
|
||||
</parsing>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
"This is my own dialogue",
|
||||
"@name run.",
|
||||
"@name you cant hide from me.",
|
||||
"Jajajajajaja",
|
||||
"jajajajajaja",
|
||||
"How do i get to Varrock @name?",
|
||||
"How do i get to Camelot @name?",
|
||||
"How do i get to Taverly @name?",
|
||||
|
|
@ -21,17 +21,17 @@
|
|||
"How do i get to Yanille @name?",
|
||||
"How do i get to Catherby @name?",
|
||||
"Gotta go srry.",
|
||||
"Wiggle wiggle wiggle yeah",
|
||||
"wiggle wiggle wiggle yeah",
|
||||
"@name lookin goofy",
|
||||
"@name lookin stoopid",
|
||||
"@name lookin like a red bracket",
|
||||
"@name get yo weasel lookin ass outta here",
|
||||
"@name lookin like some sort of twocan sam",
|
||||
" /hop world 1 got a noob here!",
|
||||
"Woot",
|
||||
"woot",
|
||||
"Hows your day been @name?",
|
||||
"Heyy @name :)",
|
||||
"Gtg srry",
|
||||
"heyy @name :)",
|
||||
"gtg srry",
|
||||
"I wont answer your questions @name",
|
||||
"Stop asking questions @name",
|
||||
"Roflmao",
|
||||
|
|
@ -48,7 +48,7 @@
|
|||
"Nice Armor @name!",
|
||||
"Nice Weapon @name!",
|
||||
"Venezuela #1",
|
||||
"2009scape and chill @name?",
|
||||
"2009Scape and chill @name?",
|
||||
"@name is my girlfriend",
|
||||
"Buying gf",
|
||||
"Bank sale pm me for info",
|
||||
|
|
@ -61,14 +61,14 @@
|
|||
"Fuckin sit @name.",
|
||||
"Error: Botting client broken tell Evilwaffles.",
|
||||
"@name bots all the time",
|
||||
"Report @name",
|
||||
"Apparently @name bots",
|
||||
"report @name",
|
||||
"apparently @name bots",
|
||||
"@name hates kermit",
|
||||
"There are no mods on to help you",
|
||||
"Report me, you wont",
|
||||
"Yes, Im botting. And?",
|
||||
"ERROR: BOTSCRIPT 404. REPORT TO BOT OWNER (Evilwaffles)",
|
||||
"Flash2:wave: FUCK",
|
||||
"flash2:wave: FUCK",
|
||||
"I love 2009Scape!",
|
||||
"Ja Ja Ja Ja",
|
||||
"This is fun!",
|
||||
|
|
@ -105,9 +105,9 @@
|
|||
"Trade me @name",
|
||||
"LOL",
|
||||
"How do I get to lumbrich",
|
||||
"Bruh",
|
||||
"Poggers",
|
||||
"Shitpost",
|
||||
"bruh",
|
||||
"poggers",
|
||||
"shitpost",
|
||||
"I wish i could find an RS Gf",
|
||||
"Where do you find runite ore @name?",
|
||||
"Where is the best coal location @name?",
|
||||
|
|
@ -135,33 +135,33 @@
|
|||
"Im not a bot",
|
||||
"Nah Im a real person",
|
||||
"Bruh are you even a real person lol?",
|
||||
"E",
|
||||
"e",
|
||||
"Hellooooo @name",
|
||||
"Wc lvl @name?",
|
||||
"Fletching level @name?",
|
||||
"Firemaking level @name?",
|
||||
"wc lvl @name?",
|
||||
"fletching level @name?",
|
||||
"firemaking level @name?",
|
||||
"Have you seen the dude in the ge?",
|
||||
"Wonderful weather today @name",
|
||||
"Lowkey drunk af rn",
|
||||
"I am so tired",
|
||||
"Wassup @name",
|
||||
"Follow me @name!",
|
||||
"follow me @name!",
|
||||
"Server goes brrrr",
|
||||
"Bruh i am not a bot",
|
||||
"bruh i am not a bot",
|
||||
"I think @name is a bot",
|
||||
"Are you a bot @name?",
|
||||
"Insert spiderman meme here",
|
||||
"Pot calling the kettle black etc",
|
||||
"Ooh, a piece of candy",
|
||||
"insert spiderman meme here",
|
||||
"pot calling the kettle black etc",
|
||||
"ooh, a piece of candy",
|
||||
"I love woodcutting",
|
||||
"Im going to go level up later",
|
||||
"I love mining shooting stars",
|
||||
" /this @name looks dumb",
|
||||
"AAAAAAAAAAAAAAAAAAAAAAAAHHHHHH!!!",
|
||||
"Como estas @name",
|
||||
"So how about that ceikry guy",
|
||||
"So how about that kermit dude",
|
||||
"Woah is an abusive mod",
|
||||
"como estas @name",
|
||||
"so how about that ceikry guy",
|
||||
"so how about that kermit dude",
|
||||
"woah is an abusive mod",
|
||||
"I heard Woah and Ceikry are dating now",
|
||||
"House party in Yanille!",
|
||||
"Can i have some gp @name?",
|
||||
|
|
@ -188,33 +188,33 @@
|
|||
"NobodyCLP has big feet",
|
||||
"Chicken tendies for dindin",
|
||||
"Spicey Chicken tendies is litty as a mf titty",
|
||||
"Red bracket stinky",
|
||||
"Ra ra rasputin",
|
||||
"Lover of the russian queen",
|
||||
"red bracket stinky",
|
||||
"ra ra rasputin",
|
||||
"lover of the russian queen",
|
||||
"Whens the next update coming out?",
|
||||
"How many players are maxed?",
|
||||
"I dont use discord @name",
|
||||
"I dont use the CC @name",
|
||||
"Why should i use discord?",
|
||||
"2009Scape is life",
|
||||
"Brb gotta make dinner",
|
||||
"brb gotta make dinner",
|
||||
"I need to go to the GE",
|
||||
"@name can i have a ge tele?",
|
||||
"Lol @name shut up",
|
||||
"lol @name shut up",
|
||||
"Where are teak trees?",
|
||||
"How do i make planks @name?",
|
||||
"Idk about that scraggley ass alex guy.",
|
||||
"Rusty? More like Crusty af lmfao.",
|
||||
"I need to sell some stuff on the ge",
|
||||
"I have so many logs to sell lol",
|
||||
"Nah",
|
||||
"Yes",
|
||||
"nah",
|
||||
"yes",
|
||||
"Where can i mine iron?",
|
||||
"Where can i mine tin?",
|
||||
"Where can i mine copper?",
|
||||
"Where can i mine clay?",
|
||||
"Where can i mine coal?",
|
||||
"No",
|
||||
"no",
|
||||
"We are no strangers to love",
|
||||
"You know the rules and so do I",
|
||||
"A full commitment's what I'm thinking of",
|
||||
|
|
@ -228,10 +228,10 @@
|
|||
"Never gonna make you cry",
|
||||
"Never gonna say goodbye",
|
||||
"Never gonna tell a lie and hurt you",
|
||||
"Why",
|
||||
"Why",
|
||||
"Why",
|
||||
"Why",
|
||||
"why",
|
||||
"why",
|
||||
"why",
|
||||
"why",
|
||||
"Why does it not show your messages in the chatbox?",
|
||||
"Why do you not show up in chat?",
|
||||
"Why do you not show up in chat @name?",
|
||||
|
|
@ -239,7 +239,7 @@
|
|||
"When did you start playing @name?",
|
||||
"When did you start on this server @name?",
|
||||
"When did you first get here @name?",
|
||||
"Russias greatest love machine",
|
||||
"russias greatest love machine",
|
||||
"Never gonna run around and desert you",
|
||||
"Two things are infinite, the universe & @names stupidity",
|
||||
"If you tell the truth, you dont have to remember anything.",
|
||||
|
|
@ -257,7 +257,7 @@
|
|||
"What do you think @name?",
|
||||
"How does that sound @name?",
|
||||
"That sounds great @name.",
|
||||
"I'm learning English.",
|
||||
"I’m learning English.",
|
||||
"I don't understand.",
|
||||
"Could you repeat that please @name?",
|
||||
"Could you please talk slower @name?",
|
||||
|
|
@ -281,26 +281,26 @@
|
|||
"@name?",
|
||||
"@name how long have you played",
|
||||
"@name world 1 or world 2?",
|
||||
"What is your main world @name?",
|
||||
"what is your main world @name?",
|
||||
"I prefer world 1 tbh",
|
||||
"I prefer world 2 tbh",
|
||||
"@name world 1 for life",
|
||||
"@name fog bots when?",
|
||||
"Damn somalian pirates",
|
||||
"Bracket more like brrrrrr acket",
|
||||
"Why the racket bracket",
|
||||
"damn somalian pirates",
|
||||
"bracket more like brrrrrr acket",
|
||||
"why the racket bracket",
|
||||
"Hi @name I am dad",
|
||||
"@name likes dad jokes",
|
||||
"Ur nuts @name",
|
||||
"Lootshare go brr",
|
||||
"Partay with froggay",
|
||||
"ur nuts @name",
|
||||
"lootshare go brr",
|
||||
"partay with froggay",
|
||||
"Know what else is lame? Not being able to play 2009scape right now",
|
||||
"Can you even grind on osrs",
|
||||
"I botted to 88 fishing",
|
||||
"i botted to 88 fishing",
|
||||
"Do not forget to vote in running polls!",
|
||||
"Always check announcments",
|
||||
"We thrivin",
|
||||
"Ship @name",
|
||||
"we thrivin",
|
||||
"ship @name",
|
||||
"Dont forget to vote 2009scape!",
|
||||
"Kermit is too legit 2 quit",
|
||||
"Out here on the range we are having fun",
|
||||
|
|
@ -310,11 +310,11 @@
|
|||
"I dont like him @name",
|
||||
"I dont like it @name",
|
||||
"Im an American.",
|
||||
"Ima go pickup my lady ting",
|
||||
"That portuguese dude is something else",
|
||||
"ima go pickup my lady ting",
|
||||
"that portuguese dude is something else",
|
||||
"@name!! @name!!",
|
||||
"Bowdi boy",
|
||||
"I love bowdi... sometimes",
|
||||
"bowdi boy",
|
||||
"i love bowdi... sometimes",
|
||||
"@name = @name",
|
||||
"I'm bacon.. go on dad... say it",
|
||||
"I'm going to leave.",
|
||||
|
|
@ -338,7 +338,7 @@
|
|||
"I couldn't agree more @name",
|
||||
"It cost me a fortune @name",
|
||||
"I am dog tired",
|
||||
"Don't take it personally",
|
||||
"Don’t take it personally",
|
||||
"We will be having a good time",
|
||||
"Same as always @name",
|
||||
"No problem",
|
||||
|
|
@ -360,23 +360,40 @@
|
|||
"530 gang for life",
|
||||
"@name, have you read the rules?",
|
||||
"@name, have you checked out the forums?",
|
||||
"Why are the leprechauns moving?",
|
||||
"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!",
|
||||
|
|
@ -393,7 +410,7 @@
|
|||
"Fluff",
|
||||
"Bwuh",
|
||||
"I'm literally just mothin' bro",
|
||||
"Certified 2009Scape Classic.",
|
||||
"Certified 2009scape classic.",
|
||||
"Make sure to like, comment and subscribe @name it really helps",
|
||||
"Real 2009scape hours!!! Murder that like if you up!!!!",
|
||||
"W00t!",
|
||||
|
|
@ -407,32 +424,32 @@
|
|||
"Drip check",
|
||||
"Uhuhuhuhuhuhuhuhu",
|
||||
"Ahhhhhhhhhhhhhhhh",
|
||||
"Yall got any deez?",
|
||||
"yall got any deez?",
|
||||
"Deez nuts",
|
||||
"When she give you that yoinky sploinky",
|
||||
"Sir, this is a 2009Scape.",
|
||||
"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",
|
||||
"yeah i got funnies",
|
||||
"read muv luv",
|
||||
"Why doesn't she love me bros?",
|
||||
"@name is off the goop don't listen to the clown",
|
||||
"Do yall got laptops",
|
||||
"Cfunny play the alien warp sound effect",
|
||||
"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 G W D?",
|
||||
"How do I make money?",
|
||||
"Ironmen stand alone together!",
|
||||
"Based",
|
||||
"Where is she",
|
||||
"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 @name, who was in Paris?",
|
||||
"Huh whuh?",
|
||||
"Who's lone?",
|
||||
"Who *is* he?",
|
||||
"who's lone?",
|
||||
"who *is* he?",
|
||||
"Hi @name, I'm Dad!",
|
||||
"Anyone wanna play melty blood after I high alch these bows?",
|
||||
"Buru nyaaaa",
|
||||
"anyone wanna play melty blood after I high alch these bows?",
|
||||
"buru nyaaaa",
|
||||
"Number 15, Taverley Dungeon Black Dragons.",
|
||||
"House party at Rimmington! Host: @name!",
|
||||
"Spending 200m! Trade me, no junk!",
|
||||
|
|
@ -442,19 +459,19 @@
|
|||
"Nice outfit @name, does it come in children's size 12?",
|
||||
":)",
|
||||
":D",
|
||||
"Die screaming",
|
||||
"die screaming",
|
||||
"Only on Tuesdays",
|
||||
"We stan 2009scape",
|
||||
"we stan 2009scape",
|
||||
"There is no spoon",
|
||||
"Where's the cow level?",
|
||||
"Join 2009scape Clan Chat!",
|
||||
"Join 2009scape Cc!",
|
||||
"Chop chop!",
|
||||
"2009Scape rox my sox!!!!!!1",
|
||||
"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",
|
||||
"one bad gloop",
|
||||
"@name is not cute or funny",
|
||||
"You have committed crimes against Gielinor and her people. What say you?",
|
||||
"Barrows trauma",
|
||||
|
|
@ -469,7 +486,7 @@
|
|||
"Praise Andrew Gower",
|
||||
"Please help me I can't stop playing 2009scape",
|
||||
"Are you ignoring me, @name?!",
|
||||
"I agree with this rfc can we put it in the game please",
|
||||
"i agree with this rfc can we put it in the game please",
|
||||
"@name, we've been trying to reach you about your car's extended warranty",
|
||||
"Trimming armour, 25k gp",
|
||||
"Hey why does my furniture disappear?",
|
||||
|
|
@ -479,525 +496,21 @@
|
|||
"Shlisshalpshlaap",
|
||||
"Somebody call for an exterminator?",
|
||||
"Decisive action. Should work.",
|
||||
"R E A D Y T O R A I S E S O M E H E L L",
|
||||
"Darkness overpowering.",
|
||||
"Got any questions about propane? Or propane accessories?",
|
||||
"When someone asks me if I am a god, I say Y E S!!!",
|
||||
"You run out of Marines?",
|
||||
"Goliath Online",
|
||||
"I'm escaping to the one place that hasn't been corrupted by Capitalism. Lunar Isle!",
|
||||
"Selling wildy protection, 100k gp",
|
||||
"Can't we get you on Mastermind, @name?",
|
||||
"Listen, don't mention the war! I mentioned it once, but I think I got away with it all right.",
|
||||
"Can’t we get you on Mastermind, @name? Next contestant – @name from Lumbridge. Special subject – the bleedin’ obvious.",
|
||||
"Oh, you’re German! I’m sorry, I thought there was something wrong with you.",
|
||||
"Listen, don’t mention the war! I mentioned it once, but I think I got away with it all right.",
|
||||
"Cunnilingus and psychiatry brought us to this.",
|
||||
"Ah, the Wilderness... where dreams of riches meet a swift demise.",
|
||||
"Who needs a quest guide? I've got the whole wiki memorized.",
|
||||
"Buying GF 10k coins. Must have at least 70 Agility.",
|
||||
"I swear, the goblins in Goblin Village have it out for me.",
|
||||
"Why do wizards always hang out in towers? Is it a zoning thing?",
|
||||
"I'm training my Construction skill. My house is gonna be lit!",
|
||||
"The GE is like the stock market, but with dragon bones.",
|
||||
"Why do we need a cabbage patch in Draynor? Seriously.",
|
||||
"I've been mining rune essence for hours. My pickaxe hates me.",
|
||||
"@name hit 99 Cooking. Time to open a gourmet restaurant in Varrock.",
|
||||
"I'm convinced the @name is actually a time-traveling wizard.",
|
||||
"Anyone up for a Castle Wars match? I need that decorative armor.",
|
||||
"Accidentally clicked Attack on a guard. Now I'm a wanted criminal.",
|
||||
"Why do we even have a Duel Arena? It's just a fancy boxing ring.",
|
||||
"I've got a stack of burnt lobsters. Anyone want to buy them?",
|
||||
"Greetings, @name! Looking for a quest?",
|
||||
"Just got a rare drop! The RNG gods are smiling upon me!",
|
||||
"Anyone need help with a boss fight? I've got my dragon dagger ready.",
|
||||
"Buying feathers! Will pay top price!",
|
||||
"The Lumbridge cows are my favorite training spot.",
|
||||
"Who needs a teleport? I've got my magic runes stocked.",
|
||||
"@name hit 99 Woodcutting. Time to chop some yews!",
|
||||
"Anyone seen the Wise Old Man lately? I owe him a visit.",
|
||||
"Selling lobsters! Freshly caught from Catherby.",
|
||||
"Swear, the Wilderness is scarier than my nightmares.",
|
||||
"Looking for a clan to join. Any takers?",
|
||||
"I'm an ironman, so no trading for me!",
|
||||
"Anyone up for a Castle Wars match?",
|
||||
"The Grand Exchange prices are crashing. Panic sell!",
|
||||
"Who else remembers the Falador Massacre?",
|
||||
"I'm saving up for a party hat. Wish me luck!",
|
||||
"Barrows runs are my addiction. Those crypts are spooky.",
|
||||
"I'm convinced the Wise Old Man is secretly Zamorak.",
|
||||
"I'm a completionist, so I'm grinding out all the achievements.",
|
||||
"The music in this game is surprisingly epic.",
|
||||
"Tried to trade with a tree... It didn't go well.",
|
||||
"My bank is like a black hole. Items disappear forever.",
|
||||
"I'm convinced the Wise Old Man is just a confused tourist.",
|
||||
"My character's fashion sense? Let's just say it's 'unique.'",
|
||||
"Challenged a cow to a dance-off. It won.",
|
||||
"Why does the Lumbridge Guide always look so lost?",
|
||||
"I'm training Agility, but my real-life agility is zero.",
|
||||
"Tried to fish in the desert. Sandfish are elusive.",
|
||||
"The Grand Exchange is like a chaotic stock market.",
|
||||
"I'm a master at clicking 'Continue' during quests.",
|
||||
"I'm convinced the chickens are plotting world domination.",
|
||||
"I'm a woodcutter, but I've never seen a talking tree.",
|
||||
"I'm a vegetarian, except when it comes to killing dragons.",
|
||||
"Why do wizards wear pointy hats? Is it a fashion statement?",
|
||||
"Challenged a guard to a staring contest. He won.",
|
||||
"I'm collecting cabbage. It's a noble pursuit.",
|
||||
"Accidentally set my cat on fire. It's now a firecat.",
|
||||
"I'm convinced the Wise Old Man is secretly a time traveler.",
|
||||
"I'm a quest completionist, but I still can't find my keys.",
|
||||
"I'm convinced the ducks are spying on us.",
|
||||
"I'm a pro at avoiding the Lumbridge swamp. Too many frogs.",
|
||||
"Hey, can someone lend me 10k? I promise I'll pay it back... eventually.",
|
||||
"Why do I always find the one square where the random event spawns?",
|
||||
"I'm training Prayer by burying bones. It's like a spiritual workout.",
|
||||
"The Wise Old Man's fashion sense is questionable.",
|
||||
"I'm convinced the ducks are secretly plotting world domination.",
|
||||
"Why do wizards wear pointy hats? Is it a dress code?",
|
||||
"I'm collecting cabbage. It's a noble pursuit, really.",
|
||||
"I'm a vegetarian, except when it comes to killing dragons.",
|
||||
"Why does the Lumbridge Guide always look so lost?",
|
||||
"Training Agility, but my real-life agility is zero.",
|
||||
"I'm convinced the Wise Old Man is secretly a time traveler.",
|
||||
"Tried to mine air. It's an untapped resource.",
|
||||
"I'm a quest completionist, but I still can't find my keys.",
|
||||
"Challenged a guard to a staring contest. He won.",
|
||||
"I'm saving up for a party hat. Priorities, you know?",
|
||||
"Why do goblins drop coins? Do they moonlight as accountants?",
|
||||
"I'm convinced the chickens are plotting something.",
|
||||
"Clicked 'Attack' on a chicken. Now I'm a poultry murderer.",
|
||||
"My character's fashion sense? Let's just say it's 'unique.'",
|
||||
"Do you know where I can find the entrance to the Taverley Dungeon?",
|
||||
"Hey, anyone here familiar with the Barrows? I need some tips.",
|
||||
"Is there a bank nearby? My inventory is overflowing with loot",
|
||||
"I'm clueless about clue scrolls",
|
||||
"Where's the best spot to catch sharks? I'm aiming for 99 Fishing.",
|
||||
"Is there a shortcut to the Karamja Volcano?",
|
||||
"Can someone explain the mechanics of the Jad fight in the Fight Caves?",
|
||||
"I'm stuck on the Elemental Workshop quest. Any hints?",
|
||||
"Where can I find a loom to spin flax into bowstrings?",
|
||||
"What's the best gear setup for killing dragons? I want that visage drop!",
|
||||
"I'm trying to unlock the fairy rings",
|
||||
"How do I recharge my amulet of glory?",
|
||||
"Why do goblins drop coins?",
|
||||
"The Grand Exchange is like the stock market",
|
||||
"My real-life agility is more like a lumbering tortoise.",
|
||||
"The Wise Old Man's fashion sense is like Woahs",
|
||||
"I challenged a cow to a dance off, surprisingly smooth mooves.",
|
||||
"Why does the Lumbridge Guide always look lost?",
|
||||
"I'm convinced the ducks in Lumbridge are plotting world domination!",
|
||||
"I accidentally ate my prayer potion I'm blessed with heartburn",
|
||||
"I'm a vegetarian, except when it comes to slaying dragons.",
|
||||
"Why do wizards wear pointy hats? Is it a magical dress code?",
|
||||
"I'm a quest completionist, but I still can't find my keys in real life.",
|
||||
"I challenged a guard to a staring contest. He won.",
|
||||
"I'm saving up for a party hat. Priorities, ya know?",
|
||||
"What's the deal with the Wilderness?",
|
||||
"I'm convinced the chickens are secretly plotting world domination!",
|
||||
"Accidentally clicked 'Attack' on a guard. Now I'm on a watchlist.",
|
||||
"My character's fashion sense? Let's just say it's 'unique'",
|
||||
"Lobsters heal my soul",
|
||||
"Trimmed armor or bust!",
|
||||
"Wilderness: Where friendships go to die",
|
||||
"Buying gf 10k",
|
||||
"Dancing for coins at Lumbridge",
|
||||
"Wearing full rune like a boss",
|
||||
"Teleporting to Camelot for quests",
|
||||
"Fishing for hours at Catherby",
|
||||
"PKing with a rune 2h",
|
||||
"World 1 Falador Park parties",
|
||||
"Staking my bank at the Duel Arena",
|
||||
"Dying to Elvarg's fiery breath sums up my life",
|
||||
"Got the Quest cape finally on my main!",
|
||||
"Wearing a party hat with pride",
|
||||
"Castle Wars: Red vs Blue",
|
||||
"Trading in Varrock Square",
|
||||
"Barrows runs for that sweet loot",
|
||||
"Spending hours in Pest Control is life",
|
||||
"Killing cows for leather armor is a good start",
|
||||
"Farming herbs in Ardougne can be good money",
|
||||
"Clan chat drama LOL",
|
||||
"Mining rune essence endlessly",
|
||||
"Agility courses: A love-hate relationship",
|
||||
"Dueling for honor.... and GP",
|
||||
"Buying runes from Aubury is decent money",
|
||||
"Chasing the Easter Bunny like a scam",
|
||||
"Wearing a skillcape with pride",
|
||||
"Fletching yew longbows for profit",
|
||||
"Going to implings in Puro-Puro",
|
||||
"Castle Wars barricade wars",
|
||||
"Dropping party hats at drop parties like pennies",
|
||||
"Killing lesser demons in Karamja is part of my holy conquest",
|
||||
"@name lures noobs into the Wilderness",
|
||||
"Farming ranarrs for cash",
|
||||
"Getting lost in the Underground Pass",
|
||||
"Selling coal at the Grand Exchange",
|
||||
"Fighting the Kalphite Queen",
|
||||
"Picking flax in Seers' Village",
|
||||
"Begging for free stuff in Lumbridge",
|
||||
"Smithing rune platebodies for profit",
|
||||
"Logging out in Lumbridge Castle",
|
||||
"Hey @name, how do I get to the Grand Exchange?",
|
||||
"Veteran here! @name, what's your favorite quest?",
|
||||
"@name, how do I make money fast?",
|
||||
"Hey @name, what's the best combat style for bossing?",
|
||||
"@name, always carry an emergency teleport!",
|
||||
"New player here! @name, what's the Wilderness like?",
|
||||
"Hey @name, how do I join a clan?",
|
||||
"@name, prioritize Prayer levels!",
|
||||
"@name, what's the best way to train Agility?",
|
||||
"Hey @name, what's your favorite minigame?",
|
||||
"@name, never trust a PKer in Lumbridge!",
|
||||
"@name, how do I get a fire cape?",
|
||||
"Hey @name, what's the fastest way to level up Magic?",
|
||||
"@name, try the Barrows tunnels!",
|
||||
"@name, what's the deal with Pest Control?",
|
||||
"Hey @name, how do I unlock the Fairy Rings?",
|
||||
"@name, remember the old random events?",
|
||||
"@name, should I train Strength or Attack first?",
|
||||
"Hey @name, what's your favorite skillcape?",
|
||||
"@name, can't do the Fight Caves!",
|
||||
"@name, how do I get a pet?",
|
||||
"Hey @name, what's the best food for boss fights?",
|
||||
"@name, Castle Wars or Clan Wars?",
|
||||
"@name, what's a clue scroll?",
|
||||
"Hey @name, how do I defeat Jad?",
|
||||
"@name, use Protect from Melee at KBD!",
|
||||
"@name, should I train Ranged or Magic?",
|
||||
"Hey @name, what's the best way to level up Crafting?",
|
||||
"@name, don't forget your anti-dragon shield!",
|
||||
"@name, what's the Stronghold of Security?",
|
||||
"Hey @name, how do I access the Legends' Guild?",
|
||||
"@name, remember the old PvP worlds?",
|
||||
"@name, how do I get a dragon defender?",
|
||||
"Hey @name, what's the best way to level up Herblore?",
|
||||
"@name, always carry a charged amulet of glory!",
|
||||
"@name, should I train Fishing or Cooking?",
|
||||
"Hey @name, how do I defeat the Chaos Elemental?",
|
||||
"@name, try the TzHaar Fight Pit!",
|
||||
"@name, what's the best way to level up Smithing?",
|
||||
"Hey @name, what's your favorite Slayer master?",
|
||||
"@name, use the Ardougne cloak teleports!",
|
||||
"@name, what's the Legends' Quest about?",
|
||||
"Hey @name, how do I unlock the Ancient Magicks?",
|
||||
"@name, remember the old Pest Control boats?",
|
||||
"@name, what's the best way to level up Construction?",
|
||||
"Hey @name, what's the fastest way to level up Prayer?",
|
||||
"@name, the old Duel Arena stakes!",
|
||||
"@name, what's the Warriors' Guild?",
|
||||
"Hey @name, how do I defeat the Kalphite Queen?",
|
||||
"@name, use the fairy ring code BIP!",
|
||||
"@name, should I train Attack or Defense first?",
|
||||
"Hey @name, what's the best way to level up Thieving?",
|
||||
"@name, don't forget your charged glory amulet!",
|
||||
"@name, what's the Legends' Cape?",
|
||||
"Hey @name, how do I access the Heroes' Guild?",
|
||||
"@name, remember the old Pest Control void gear?",
|
||||
"@name, how do I get a firemaking skillcape?",
|
||||
"Buying gf 10k",
|
||||
"Trimming armor for free!",
|
||||
"Wanna join my clan? We're called The Mighty Cabbages'!",
|
||||
"I'll meet you at the Falador Party Room!",
|
||||
"Dancing for coins in Varrock Square!",
|
||||
"Remember when the Wilderness was dangerous?",
|
||||
"I got a rune scimitar drop from Lesser Demons!",
|
||||
"Lumbridge Swamp is haunted!",
|
||||
"Anyone up for Castle Wars?",
|
||||
"I miss the old random events!",
|
||||
"World 2 is the trading hub!",
|
||||
"I'm going to train my Agility at the Gnome Stronghold!",
|
||||
"I just got 99 Cooking!",
|
||||
"Fishing lobsters at Catherby is life!",
|
||||
"The Legends' Guild is so exclusive!",
|
||||
"Who needs a quest guide? I'll figure it out!",
|
||||
"I'm mining rune essence for hours!",
|
||||
"Barrows armor looks sick!",
|
||||
"I'm stuck in the Underground Pass!",
|
||||
"The Stronghold of Security taught me about account security!",
|
||||
"I'm going to farm herbs in Ardougne!",
|
||||
"I'm getting my fire cape!",
|
||||
"I love the music in RuneScape!",
|
||||
"I'm alching my maple longbows!",
|
||||
"I'm doing the Recipe for Disaster subquests!",
|
||||
"I'm going to train my combat stats at the Rock Crabs!",
|
||||
"I'm going for the Quest Cape!",
|
||||
"I'm going to mine pure essence!",
|
||||
"I'm hunting chinchompas in the Feldip Hills!",
|
||||
"I'm going to train my Woodcutting at Seers' Village!",
|
||||
"I'm going to fish sharks at the Fishing Guild!",
|
||||
"I'm going to train my Thieving at Ardougne Knights!",
|
||||
"I'm going to hunt implings in Puro-Puro!",
|
||||
"I'm going to train my Hunter at the Falconry!",
|
||||
"I'm smithing rune platebodies!",
|
||||
"I'm going to train my Farming at the Tree Gnome Stronghold!",
|
||||
"I'm going to hunt red chinchompas in the Wilderness!",
|
||||
"I'm doing the Underground Pass quest!",
|
||||
"I'm going to fish monkfish in Piscatoris!",
|
||||
"Meet me in Varrock, @name, for an epic trade",
|
||||
"@name, join my clan; we'll conquer the Wilderness together!",
|
||||
"Beware the dragons, @name, they're fiercer than you think",
|
||||
"Crafting runes with @name, the best mage in Gielinor",
|
||||
"Fishing lobsters with @name, the sea's no match for us",
|
||||
"@name, your swordsmanship at Duel Arena is unmatched!",
|
||||
"Questing through dark caves, @name always leads the way",
|
||||
"Share your wisdom, @name, how'd you master those spells?",
|
||||
"Legends speak of @name bravery at the God Wars",
|
||||
"Need more arrows, @name? I've got plenty to spare",
|
||||
"Cooking's a breeze when @name around, no burnt lobsters!",
|
||||
"Mining together, @name and I strike gold every time",
|
||||
"@name, let's barter; your herbs for my potions?",
|
||||
"Training agility with @name, leaping like graceful gazelles",
|
||||
"Heard @name got the best magic beans in town",
|
||||
"Fletching bows with @name, aiming for perfection",
|
||||
"Smithing with @name, our anvils never cool down",
|
||||
"Adventuring with @name, every quest is a thrill",
|
||||
"Battling demons, @name courage inspires us all",
|
||||
"Slaying dragons, @name the hero we need",
|
||||
"Gathering at Falador, @name party room is legendary",
|
||||
"Hunting chinchompas, @name traps are always full",
|
||||
"Farming's fun with @name, our crops never fail",
|
||||
"Brewing potions, @name mixtures are magical",
|
||||
"Casting spells with @name, we're invincible",
|
||||
"Building fires, @name flames warm the coldest nights",
|
||||
"Sailing to Pest Control, @name our fearless captain",
|
||||
"Trading runes, @name deals are the fairest",
|
||||
"Exploring dungeons, @name the light in the darkness",
|
||||
"Charging orbs with @name, our energy knows no bounds",
|
||||
"Dancing in Draynor, @name moves are enchanting",
|
||||
"Playing Gnomeball, @name the star player",
|
||||
"Harvesting willows, @name axe swings true",
|
||||
"Enchanting jewelry, @name touch turns copper to gold",
|
||||
"Summoning familiars, @name spirit wolf leads the pack",
|
||||
"Thieving from stalls, @name hands are lightning-fast",
|
||||
"Crafting runes, @name essence never runs dry",
|
||||
"Fishing at Catherby, @name catch feeds us all",
|
||||
"Cooking feasts, @name dishes delight the gods",
|
||||
"Mining runite, @name pickaxe strikes rich veins",
|
||||
"Bartering at Grand Exchange, @name a trading master",
|
||||
"Training prayer, @name piety moves mountains",
|
||||
"Fighting revenants, @name valor shines bright",
|
||||
"Building homes, @name construction is flawless",
|
||||
"Hunting imps, @name net is always full",
|
||||
"Brewing ale, @name tavern is the town's favorite",
|
||||
"Casting high alchemy, @name turns junk into treasure",
|
||||
"Sailing to Karamja, @name adventures are legendary",
|
||||
"Forging alliances, @name charisma unites clans",
|
||||
"Defeating bosses, @name name echoes in legends",
|
||||
"Are you mewing @name???",
|
||||
"Check out that gyatt @name",
|
||||
"Bruhhhhh @name got that rizz",
|
||||
"@name rizzing up the bots",
|
||||
"Ironman? More like copperboy LOL",
|
||||
"What that gyatt do @name",
|
||||
"He's got the zoomies!",
|
||||
"@name likes pickles and dipped in mayo",
|
||||
"Lmaaooooooo",
|
||||
"Bruh she said she loved me...",
|
||||
"I caught @name rizzing a mewing teacher",
|
||||
"What that mouth do bb",
|
||||
"Ayo tf he say",
|
||||
"Ayo",
|
||||
"Ayo @name a freak lowkey",
|
||||
"Ayo tf",
|
||||
"@name catch me outside howbout that",
|
||||
"Wasssssuuuuppppppp",
|
||||
"Knock knock @name",
|
||||
"Oh boy howdy do i have a surprise for you",
|
||||
"Noooooo",
|
||||
"What do you mean I haven't done anything wtf",
|
||||
"Redrocket redrocket!!!",
|
||||
"I made 20,000 crochet sock puppets for ceikry",
|
||||
"Come on @name",
|
||||
"Are we rading tonight @name?",
|
||||
"Why would he say that",
|
||||
"Penguins are technically reptiles",
|
||||
"Brb smell something burning",
|
||||
"Need pest control partner, you handle the portals, i will afk",
|
||||
"Bruhhhh the skibiddi rizz in my gyatt makes my mewing sesh rough",
|
||||
"@name jajajajaja",
|
||||
"Wait, I can't raid tonight @name",
|
||||
"Brb, pizza's here. Hope they ask why I'm a grown man dressed like an elf",
|
||||
"Sorry, gotta go AFK. My dog just ate my gaming headset.",
|
||||
"Brb, my grandma just fell down the stairs",
|
||||
"Hold on, the baby's crying, aka @name",
|
||||
"Oops, spilled my drink",
|
||||
"Guys, I need to log off, my plants are staging a revolt for not watering them",
|
||||
"AFK a sec, my neighbor's llama is in my backyard again",
|
||||
"My pizza rolls are ready",
|
||||
"Lost track of time, i'm late for my own wedding",
|
||||
"Sorry, can't hear you over the sound of my laundry",
|
||||
"Turn HDR off in windows @name",
|
||||
"Www. no one cares .com",
|
||||
"Hey @name www dot stfu dot com",
|
||||
"Like pitching a tent in a pair of britches",
|
||||
"Mad as a bag of ferrets",
|
||||
"I dont think beavers built the hoover dam",
|
||||
"How do beavers get the concrete for dams?",
|
||||
"@name show me the way",
|
||||
"@name onwards brutha",
|
||||
"@name eats fried rat tails",
|
||||
"@name is a rat",
|
||||
"Why are there so many people farming right now",
|
||||
"@name fuck the police",
|
||||
"@name says the like pickles on their hotdogs",
|
||||
"Fuck the guards, free woah in varrock prison",
|
||||
"Ayo fuck u mean",
|
||||
"Woop woop thats da sound of the beast",
|
||||
"How are you the way that you are",
|
||||
"She sells seashells by the sea shore",
|
||||
"@name certified rat",
|
||||
"@name buys skimmed milk",
|
||||
"Got milk?",
|
||||
"Are you JSON because i want you to get array from me",
|
||||
"@name likes string manipulation",
|
||||
"@name sells legos",
|
||||
"JUST DO IT",
|
||||
"Why are there so many motherfucking options",
|
||||
"Just hit the fucking auto hide thing",
|
||||
"Just play",
|
||||
"Hell no this shit is fuzzy as balls",
|
||||
"@name is fuzzy as balls",
|
||||
"Turn your brightness up @name",
|
||||
"On my pc it runs perfectly",
|
||||
"I know why mine seems a little jumpy",
|
||||
"Stream the window not the monitor",
|
||||
"Discords a bitch",
|
||||
"Why are there so many handsome people at the ge like @name",
|
||||
"I'll make you squeel of fortune",
|
||||
"You will get it in due time @name",
|
||||
"I was one turn away",
|
||||
"It do be pipe time @name",
|
||||
"Sometimes i like to cover myself in vaseline and pretend i'm a slug",
|
||||
"Woah is a greased pig",
|
||||
"Sometimes i dig holes in my backyard and pretend i'm a carrot",
|
||||
"It's pipe time @name",
|
||||
"If i am not pipe timing i am programming",
|
||||
"Yes i have thigh high socks, no you cannot have them",
|
||||
"I scream when i wear my programming socks",
|
||||
"Anyone wanna buy @name's bathwater?",
|
||||
"Anyone wanna buy my used socks?",
|
||||
"@name be getting bags",
|
||||
"What the fuck is this",
|
||||
"Hi i noticed you haven't taken a break in hours @name",
|
||||
"I really am seething rn",
|
||||
"I am so fucking tilted",
|
||||
"Go back to your fucking frogs",
|
||||
"Life is simple as frog farmer",
|
||||
"A q p",
|
||||
"Oooooh that's a first",
|
||||
"Been a minute @name",
|
||||
"Hey @name",
|
||||
"Oh shit it's @name",
|
||||
"Hey @name wyd today?",
|
||||
"Ayo @name",
|
||||
"Wyd @name",
|
||||
"Wbu @name?",
|
||||
"Good fuck em, that's what they get",
|
||||
"Deathknight lookin rat ass mf @name",
|
||||
"@name sucks slugs",
|
||||
"Brb gotta take a shit",
|
||||
"@name will brb went to take a shit",
|
||||
"Tell me when he is coming",
|
||||
"This guy is being incredibly based",
|
||||
"@name is based af",
|
||||
"Taking l's all day today @name",
|
||||
"That sucks massive dongus",
|
||||
"Ah i was about to type that",
|
||||
"Where is stormwind?",
|
||||
"How do i buy gold",
|
||||
"@name sells gold",
|
||||
"@name is a gold digger",
|
||||
"Ayo @name wanna buy some frog legs?",
|
||||
"Brb fucking burnt my pizza rolls",
|
||||
"I swear @name if you need roll again",
|
||||
"@name you are a hunter you don't need plate armor",
|
||||
"Dragonriding is satisfying",
|
||||
"There's an old TzHarrian saying, you fuck up once, you lose two teeth",
|
||||
"FUCK",
|
||||
"@name i am ready when you are",
|
||||
"Anyone selling logs?",
|
||||
"That is hilarious @name",
|
||||
"Alright @name",
|
||||
"I need to go get my quest cape",
|
||||
"500 barrows runs dry",
|
||||
"Back to back to back barrows items, easy game",
|
||||
"@name did you know them?",
|
||||
"@name sucks eggs",
|
||||
"@name eats snails",
|
||||
"Who is that?",
|
||||
"I've gotta go in 20 minutes",
|
||||
"Bonk",
|
||||
"Gtg in 30 minutes",
|
||||
"They left 50 minutes ago",
|
||||
"I think it's just gonna be us",
|
||||
"Who is that?",
|
||||
"Stop following me",
|
||||
"@name stop following me",
|
||||
"I think @name is watching me",
|
||||
"@name wouldn't let me get a hit in at clan wars",
|
||||
"Clan wars and chill?",
|
||||
"Quick mewing sesh",
|
||||
"Don't you stickbug me",
|
||||
"Get stick bugged",
|
||||
"Wtf why are you a dragon",
|
||||
"Fun fact, woah eats eggs whole like a snake",
|
||||
"Ceikys there's a rare over there",
|
||||
"Where is goldshire?",
|
||||
"How long have you played @name?",
|
||||
"Wanna quest?",
|
||||
"TROGDORRRRRR",
|
||||
"Fuck this shit i'm out",
|
||||
"Wait till you get your first 99",
|
||||
"How is that even possible",
|
||||
"That's the max",
|
||||
"@name is trying to max",
|
||||
"Complesionist cape?",
|
||||
"How can you increase your run speed?",
|
||||
"@name where is barrows?",
|
||||
"@name where are rune rocks?",
|
||||
"@name where is yanille?",
|
||||
"@name how long have you played for?",
|
||||
"Yes these quotes were hand typed",
|
||||
"Kermit was here",
|
||||
"World of Warcraft died after Wrath",
|
||||
"Ceikry needs to add talent trees",
|
||||
"How do you get to the wilderness?",
|
||||
"Anyone tryna lure @name?",
|
||||
"@name tried to lure me",
|
||||
"@name bots all the time",
|
||||
"Anyone want chicken tendies",
|
||||
"Brb foods ready",
|
||||
"Brb",
|
||||
"Gotta go get food",
|
||||
"Anyone else from northern alaska?",
|
||||
"Fishing 4 gp",
|
||||
"Looking for gf",
|
||||
"Anyone wanna be my discord kitten?",
|
||||
"Selling discord kittens",
|
||||
"@name is a discord kitten",
|
||||
"Add me on discord",
|
||||
"Are you in the 09discord",
|
||||
"Where are you going @name?",
|
||||
"Idk what i am going to cook today",
|
||||
"What should i eat tonight",
|
||||
"He is in the cave",
|
||||
"Don't forget to save game before logging out",
|
||||
"American horror story died after season 1",
|
||||
"Prequels are better than the sequels",
|
||||
"Disney star wars is the best star wars",
|
||||
"Halo 5 sucked",
|
||||
"Selling xbox live gold and 1600 microsoft points for 50k gp",
|
||||
"Buying gf 25gp and a bucket",
|
||||
"@name i heard evilwaffles bots",
|
||||
"@name hopefully ceikry doesn't find out about evilwaffles",
|
||||
"Honk honk",
|
||||
"Where is the road to mordor?",
|
||||
"Golem lookin ass bitch",
|
||||
"@name rat looking mf",
|
||||
"@name uses sand paper to wipe",
|
||||
"@name said Woah is cute",
|
||||
"You need 25 of 40 to do that",
|
||||
"Over 1000 unique lines of dialogue",
|
||||
"What should i get to eat",
|
||||
"Ge be poppin today",
|
||||
"Where all the woahs at",
|
||||
"Ayo woahscam got that gyatt",
|
||||
"That is one i haven't seen before"
|
||||
"Oh, poor baby. What do you want, a Brimstail's Sampler?",
|
||||
"There's an old TzHarrian saying, you fuck up once, you lose two teeth.",
|
||||
"The lineup consisted simply of six hydrocoptic marzelvanes so fitted to the ambifacient lunar waneshaft that sidefumbling was prevented."
|
||||
],
|
||||
"halloween": [
|
||||
"Trick or treat!!!",
|
||||
|
|
@ -1008,9 +521,9 @@
|
|||
"Costume party at my P O H!! Follow me!",
|
||||
"Trick, then!",
|
||||
"Brrrainssssssss...",
|
||||
"'Cause this is thriller, thriller night!",
|
||||
"This is Hallowe'en, this is Hallowe'en!",
|
||||
"This is Hallowe'en, everybody make a scene!",
|
||||
"'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.",
|
||||
|
|
@ -1081,7 +594,7 @@
|
|||
"Rusty = the grinch, @name = santa",
|
||||
"@name the red nose reindeer",
|
||||
"Put one foot in front of the other",
|
||||
"And soon you will be walking out the doooor",
|
||||
"and soon you will be walking out the doooor",
|
||||
"Elf on the shelf time",
|
||||
"@name loves pinecones",
|
||||
"I love the smell of pinecones",
|
||||
|
|
@ -1180,21 +693,21 @@
|
|||
"Woah got those roofies strapped",
|
||||
"Why is my drink cloudy?",
|
||||
"@name and woah be wrestlin",
|
||||
"Bekky want sum fuk?",
|
||||
"bekky want sum fuk?",
|
||||
"Damn @name you got an ass",
|
||||
"Is that a footlong in your pants or are you happy to see me?",
|
||||
"@name so hot i gotta change my pants",
|
||||
"@name is a sex god",
|
||||
"Bruh we hype today",
|
||||
"Dont be silly wrap the willy @name!",
|
||||
"Wrap it before you smack it @name",
|
||||
"Can i get a reeeeee @name?",
|
||||
"Valentines day is the best day",
|
||||
"bruh we hype today",
|
||||
"dont be silly wrap the willy @name!",
|
||||
"wrap it before you smack it @name",
|
||||
"can i get a reeeeee @name?",
|
||||
"valentines day is the best day",
|
||||
"@name shut up before i smack you with my crusty sock",
|
||||
"Valentines day, more like me and my hand day smh",
|
||||
"If you think these quotes are wild just wait @name",
|
||||
"All im saying is we have never seen @name and biden in the same room",
|
||||
"Red rocket, red rocket!",
|
||||
"red rocket, red rocket!",
|
||||
"Woahs favourite game is red rocket",
|
||||
"@name sexy af today",
|
||||
"Happy Valentines day @name!!!",
|
||||
|
|
@ -1239,4 +752,4 @@
|
|||
"@name and i are going to look for the easter bunny!!",
|
||||
"Hint for anyone who sees this you must dig above eagles peak"
|
||||
]
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
BIN
Server/data/cache/main_file_cache.dat2
(Stored with Git LFS)
vendored
BIN
Server/data/cache/main_file_cache.dat2
(Stored with Git LFS)
vendored
Binary file not shown.
BIN
Server/data/cache/main_file_cache.idx19
(Stored with Git LFS)
vendored
BIN
Server/data/cache/main_file_cache.idx19
(Stored with Git LFS)
vendored
Binary file not shown.
BIN
Server/data/cache/main_file_cache.idx255
(Stored with Git LFS)
vendored
BIN
Server/data/cache/main_file_cache.idx255
(Stored with Git LFS)
vendored
Binary file not shown.
BIN
Server/data/cache/main_file_cache.idx5
(Stored with Git LFS)
vendored
BIN
Server/data/cache/main_file_cache.idx5
(Stored with Git LFS)
vendored
Binary file not shown.
|
|
@ -949,7 +949,7 @@
|
|||
{
|
||||
"minAmount": 1,
|
||||
"weight": "5",
|
||||
"id": 7336,
|
||||
"id": 10667,
|
||||
"maxAmount": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -961,7 +961,7 @@
|
|||
{
|
||||
"minAmount": 1,
|
||||
"weight": "5",
|
||||
"id": 7342,
|
||||
"id": 10670,
|
||||
"maxAmount": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -973,7 +973,7 @@
|
|||
{
|
||||
"minAmount": 1,
|
||||
"weight": "5",
|
||||
"id": 7348,
|
||||
"id": 10673,
|
||||
"maxAmount": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -985,7 +985,7 @@
|
|||
{
|
||||
"minAmount": 1,
|
||||
"weight": "5",
|
||||
"id": 7354,
|
||||
"id": 10676,
|
||||
"maxAmount": 1
|
||||
},
|
||||
{
|
||||
|
|
@ -997,7 +997,7 @@
|
|||
{
|
||||
"minAmount": 1,
|
||||
"weight": "5",
|
||||
"id": 7360,
|
||||
"id": 10679,
|
||||
"maxAmount": 1
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@
|
|||
},
|
||||
{
|
||||
"id": "92",
|
||||
"replaceId": "91",
|
||||
"replaceId": "17317",
|
||||
"fence": "false",
|
||||
"metal": "false"
|
||||
},
|
||||
|
|
@ -301,7 +301,7 @@
|
|||
},
|
||||
{
|
||||
"id": "2025",
|
||||
"replaceId": "2026",
|
||||
"replaceId": "1534",
|
||||
"fence": "false",
|
||||
"metal": "false"
|
||||
},
|
||||
|
|
@ -312,7 +312,7 @@
|
|||
"metal": "false"
|
||||
},
|
||||
{
|
||||
"id": "1530",
|
||||
"id": "2036",
|
||||
"replaceId": "1531",
|
||||
"fence": "false",
|
||||
"metal": "false"
|
||||
|
|
@ -925,7 +925,7 @@
|
|||
},
|
||||
{
|
||||
"id": "3747",
|
||||
"replaceId": "3748",
|
||||
"replaceId": "1534",
|
||||
"fence": "false",
|
||||
"metal": "false"
|
||||
},
|
||||
|
|
@ -943,7 +943,7 @@
|
|||
},
|
||||
{
|
||||
"id": "4148",
|
||||
"replaceId": "4246",
|
||||
"replaceId": "4248",
|
||||
"fence": "false",
|
||||
"metal": "false"
|
||||
},
|
||||
|
|
@ -1759,7 +1759,7 @@
|
|||
},
|
||||
{
|
||||
"id": "14245",
|
||||
"replaceId": "14246",
|
||||
"replaceId": "14248",
|
||||
"fence": "true",
|
||||
"metal": "false"
|
||||
},
|
||||
|
|
@ -1984,14 +1984,16 @@
|
|||
"replaceId": "28518",
|
||||
"fence": "false",
|
||||
"metal": "true",
|
||||
"autowalk": "true"
|
||||
"autowalk": "true",
|
||||
"questRequirement": "Icthlarin's Little Helper"
|
||||
},
|
||||
{
|
||||
"id": "28514",
|
||||
"replaceId": "28518",
|
||||
"fence": "false",
|
||||
"metal": "true",
|
||||
"autowalk": "true"
|
||||
"autowalk": "true",
|
||||
"questRequirement": "Icthlarin's Little Helper"
|
||||
},
|
||||
{
|
||||
"id": "21065",
|
||||
|
|
@ -2185,6 +2187,18 @@
|
|||
"fence": "false",
|
||||
"metal": "false"
|
||||
},
|
||||
{
|
||||
"id": "24560",
|
||||
"replaceId": "15515",
|
||||
"fence": "true",
|
||||
"metal": "false"
|
||||
},
|
||||
{
|
||||
"id": "24561",
|
||||
"replaceId": "15517",
|
||||
"fence": "true",
|
||||
"metal": "false"
|
||||
},
|
||||
{
|
||||
"id": "24565",
|
||||
"replaceId": "36316",
|
||||
|
|
@ -2675,7 +2689,7 @@
|
|||
},
|
||||
{
|
||||
"id": "31815",
|
||||
"replaceId": "31817",
|
||||
"replaceId": "31816",
|
||||
"fence": "false",
|
||||
"metal": "false"
|
||||
},
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,670 +1,634 @@
|
|||
[
|
||||
{
|
||||
"item_id": "20",
|
||||
"loc_data": "{1,2577,9655,0,100}-"
|
||||
},
|
||||
{
|
||||
"item_id": "21",
|
||||
"loc_data": "{1,2613,9639,0,100}-"
|
||||
},
|
||||
{
|
||||
"item_id": "22",
|
||||
"loc_data": "{1,2574,9633,0,100}-"
|
||||
},
|
||||
{
|
||||
"item_id": "23",
|
||||
"loc_data": "{1,2583,9613,0,100}-"
|
||||
},
|
||||
{
|
||||
"item_id": "24",
|
||||
"loc_data": "{1,2564,9662,0,100}-"
|
||||
},
|
||||
{
|
||||
"item_id": "28",
|
||||
"loc_data": "{1,2807,3450,0,90}-"
|
||||
"loc_data": "{1,2807,3450,0,7864410}"
|
||||
},
|
||||
{
|
||||
"item_id": "33",
|
||||
"loc_data": "{1,2547,3114,0,10}-{1,3208,3395,1,30}-"
|
||||
"loc_data": "{1,2547,3114,0,983050}-{1,3208,3395,1,3932190}"
|
||||
},
|
||||
{
|
||||
"item_id": "39",
|
||||
"loc_data": "{1,2672,3433,0,90}-"
|
||||
"loc_data": "{1,2672,3433,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "41",
|
||||
"loc_data": "{1,3125,9997,0,90}-"
|
||||
"loc_data": "{1,3125,9997,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "53",
|
||||
"loc_data": "{3,3240,3940,0,44}-{2,3237,3948,0,44}-{3,3235,3949,0,44}-"
|
||||
},
|
||||
{
|
||||
"item_id": "83",
|
||||
"loc_data": "{1,2637,9819,0,30}-"
|
||||
},
|
||||
{
|
||||
"item_id": "84",
|
||||
"loc_data": "{1,2638,9906,0,30}-"
|
||||
},
|
||||
{
|
||||
"item_id": "85",
|
||||
"loc_data": "{1,2628,9859,0,30}-"
|
||||
"loc_data": "{3,3240,3940,0,300}-{2,3237,3948,0,300}-{3,3235,3949,0,300}"
|
||||
},
|
||||
{
|
||||
"item_id": "88",
|
||||
"loc_data": "{1,2654,9767,0,63}-"
|
||||
"loc_data": "{1,2654,9767,0,4587583}"
|
||||
},
|
||||
{
|
||||
"item_id": "90",
|
||||
"loc_data": "{1,2570,9604,0,30}-"
|
||||
"loc_data": "{1,2570,9604,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "185",
|
||||
"loc_data": "{1,2467,3176,0,90}-"
|
||||
"loc_data": "{1,2467,3176,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "223",
|
||||
"loc_data": "{1,3179,9881,0,90}-{1,3177,9880,0,90}-{1,3128,9956,0,90}-{1,3129,9954,0,90}-{1,3126,9958,0,90}-{1,3117,9951,0,90}-{1,3118,9948,0,90}-{1,3119,9949,0,90}-"
|
||||
"loc_data": "{1,3128,9956,0,7864410}-{1,3129,9954,0,7864410}-{1,3126,9958,0,7864410}-{1,3117,9951,0,7864410}-{1,3118,9948,0,7864410}-{1,3119,9949,0,7864410}-{1,3179,9881,0,7864410}-{1,3177,9880,0,7864410}"
|
||||
},
|
||||
{
|
||||
"item_id": "229",
|
||||
"loc_data": "{1,2588,3090,2,90}-{1,2587,3090,2,90}-{1,2809,3342,0,100}-{1,2808,3343,0,100}-{1,3186,3836,0,60}-{1,3195,3849,0,60}-"
|
||||
"loc_data": "{1,2809,3342,0,7864420}-{1,2808,3343,0,7864420}-{1,2588,3090,2,7209050}-{1,2587,3090,2,7209050}-{1,3195,3849,0,6553660}-{1,3186,3836,0,6553660}"
|
||||
},
|
||||
{
|
||||
"item_id": "231",
|
||||
"loc_data": "{1,2905,3297,0,10}-{1,2907,3295,0,10}-{1,2553,3751,0,90}-{1,2553,3754,0,90}-{1,2552,3757,0,90}-{1,2546,3763,0,90}-{1,2542,3765,0,90}-{1,2540,3765,0,90}-{1,2528,3716,0,90}-{1,2501,3727,0,90}-{1,2502,3726,0,90}-{1,2501,3729,0,90}-{1,2500,3730,0,90}-{1,2500,3731,0,90}-{1,2501,3732,0,90}-{1,2503,3733,0,90}-{1,2504,3732,0,90}-{1,2506,3731,0,90}-{1,2529,3735,0,90}-{1,2531,3736,0,90}-{1,2527,3746,0,90}-{1,2525,3751,0,90}-{1,2532,3762,0,90}-{1,2503,3757,0,30}-{1,2502,3756,0,30}-{1,2502,3754,0,30}-{1,2502,3752,0,30}-{1,2503,3751,0,30}-{1,2505,3753,0,30}-"
|
||||
"loc_data": "{1,2905,3297,0,1310730}-{1,2907,3295,0,1310730}-{1,2553,3751,0,7864410}-{1,2553,3754,0,7864410}-{1,2552,3757,0,7864410}-{1,2546,3763,0,7864410}-{1,2542,3765,0,7864410}-{1,2540,3765,0,7864410}-{1,2528,3716,0,7864410}-{1,2501,3727,0,7864410}-{1,2502,3726,0,7864410}-{1,2501,3729,0,7864410}-{1,2500,3730,0,7864410}-{1,2500,3731,0,7864410}-{1,2501,3732,0,7864410}-{1,2503,3733,0,7864410}-{1,2504,3732,0,7864410}-{1,2506,3731,0,7864410}-{1,2529,3735,0,7864410}-{1,2531,3736,0,7864410}-{1,2527,3746,0,7864410}-{1,2525,3751,0,7864410}-{1,2532,3762,0,7864410}-{1,2503,3757,0,5898270}-{1,2502,3756,0,5898270}-{1,2502,3754,0,5898270}-{1,2502,3752,0,5898270}-{1,2503,3751,0,5898270}-{1,2505,3753,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "239",
|
||||
"loc_data": "{1,3217,3812,0,2}-{1,3210,3808,0,2}-"
|
||||
"loc_data": "{1,3217,3812,0,196610}-{1,3210,3808,0,196610}"
|
||||
},
|
||||
{
|
||||
"item_id": "243",
|
||||
"loc_data": "{1,2910,9809,0,30}-{1,2908,9805,0,30}-{1,2902,9806,0,30}-{1,2906,9796,0,30}-{1,2905,9801,0,30}-"
|
||||
"loc_data": "{1,2910,9809,0,30}-{1,2908,9805,0,30}-{1,2902,9806,0,30}-{1,2906,9796,0,30}-{1,2905,9801,0,30}"
|
||||
},
|
||||
{
|
||||
"item_id": "245",
|
||||
"loc_data": "{1,2931,3515,0,50}-"
|
||||
"loc_data": "{1,2931,3515,0,4587570}"
|
||||
},
|
||||
{
|
||||
"item_id": "247",
|
||||
"loc_data": "{1,2512,3080,0,30}-{1,2517,3082,0,30}-{1,2509,3088,0,30}-{1,2508,3084,0,30}-"
|
||||
"loc_data": "{1,2512,3080,0,5898270}-{1,2517,3082,0,5898270}-{1,2509,3088,0,5898270}-{1,2508,3084,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "272",
|
||||
"loc_data": "{1,3108,3356,1,140}-"
|
||||
"loc_data": "{1,3108,3356,1,10485900}"
|
||||
},
|
||||
{
|
||||
"item_id": "273",
|
||||
"loc_data": "{1,3097,3366,0,140}-"
|
||||
"loc_data": "{1,3097,3366,0,10485900}"
|
||||
},
|
||||
{
|
||||
"item_id": "276",
|
||||
"loc_data": "{1,3111,3367,0,50}-"
|
||||
"loc_data": "{1,3111,3367,0,4587570}"
|
||||
},
|
||||
{
|
||||
"item_id": "277",
|
||||
"loc_data": "{1,3092,9755,0,50}-"
|
||||
"loc_data": "{1,3092,9755,0,4587570}"
|
||||
},
|
||||
{
|
||||
"item_id": "278",
|
||||
"loc_data": "{1,2604,3358,0,50}-"
|
||||
"loc_data": "{1,2604,3358,0,4587570}"
|
||||
},
|
||||
{
|
||||
"item_id": "301",
|
||||
"loc_data": "{1,2608,3397,0,90}-"
|
||||
"loc_data": "{1,2608,3397,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "303",
|
||||
"loc_data": "{1,3245,3155,0,140}-{1,3244,3159,0,140}-{1,3429,4784,0,75}-{1,3432,4783,0,75}-{1,3414,4768,0,75}-{1,3429,4769,0,75}-{1,3431,4772,0,75}-{1,3415,4786,0,75}-{1,3412,4784,0,75}-"
|
||||
"loc_data": "{1,3245,3155,0,10485900}-{1,3244,3159,0,10485900}-{1,3429,4784,0,75}-{1,3432,4783,0,75}-{1,3414,4768,0,75}-{1,3429,4769,0,75}-{1,3431,4772,0,75}-{1,3415,4786,0,75}-{1,3412,4784,0,75}"
|
||||
},
|
||||
{
|
||||
"item_id": "305",
|
||||
"loc_data": "{1,2605,3395,0,90}-"
|
||||
"loc_data": "{1,2605,3395,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "307",
|
||||
"loc_data": "{1,2860,3335,0,190}-"
|
||||
"loc_data": "{1,2860,3335,0,13762750}"
|
||||
},
|
||||
{
|
||||
"item_id": "311",
|
||||
"loc_data": "{1,2605,3396,0,90}-"
|
||||
"loc_data": "{1,2605,3396,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "347",
|
||||
"loc_data": "{1,2563,9511,0,30}-"
|
||||
"loc_data": "{1,2563,9511,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "357",
|
||||
"loc_data": "{1,2820,3453,0,90}-"
|
||||
"loc_data": "{1,2820,3453,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "401",
|
||||
"loc_data": "{1,2959,2959,0,160}-{1,2943,2950,0,160}-{1,2866,2976,0,160}-{1,2854,2977,0,160}-{1,2839,2975,0,160}-{1,2757,2947,0,160}-{1,2755,2952,0,160}-{1,2786,2960,0,160}-{1,2782,2987,0,160}-{1,2771,2995,0,160}-{1,2761,3000,0,160}-{1,3829,3053,0,160}-{1,3813,3066,0,160}-{1,3814,3064,0,160}-{1,3808,3060,0,160}-{1,2945,3068,0,160}-{1,2975,3013,0,160}-{1,2955,3010,0,160}-{1,2755,3008,0,160}-{1,2754,3017,0,160}-{1,2756,3060,0,160}-{1,2755,3070,0,160}-{1,2896,3119,0,160}-{1,2914,3111,0,160}-{1,2926,3110,0,160}-{1,2939,3102,0,160}-{1,2938,3073,0,160}-{1,2756,3074,0,160}-{1,2806,3128,0,160}-{1,2764,3131,0,160}-{1,2753,3125,0,160}-{1,2757,3109,0,160}-{1,2864,3195,0,160}-{1,2810,3387,0,160}-{1,2809,3388,0,160}-{1,2809,3385,0,160}-{1,2807,3386,0,160}-{1,2804,3385,0,160}-{1,2807,3384,0,160}-{1,2805,3384,0,160}-{1,2802,3382,0,160}-{1,2805,3381,0,160}-{1,2804,3380,0,160}-{1,2693,3727,0,160}-{1,2698,3729,0,160}-{1,2700,3731,0,160}-{1,2708,3728,0,160}-{1,2725,3731,0,160}-{1,2721,3730,0,160}-{1,2719,3733,0,160}-{1,2714,3733,0,160}-{1,2712,3732,0,160}-"
|
||||
"loc_data": "{1,2810,3387,0,11796640}-{1,2809,3388,0,11796640}-{1,2809,3385,0,11796640}-{1,2807,3386,0,11796640}-{1,2804,3385,0,11796640}-{1,2807,3384,0,11796640}-{1,2805,3384,0,11796640}-{1,2802,3382,0,11796640}-{1,2805,3381,0,11796640}-{1,2804,3380,0,11796640}-{1,3829,3053,0,11796640}-{1,3813,3066,0,11796640}-{1,3814,3064,0,11796640}-{1,3808,3060,0,11796640}-{1,2693,3727,0,11796640}-{1,2698,3729,0,11796640}-{1,2700,3731,0,11796640}-{1,2708,3728,0,11796640}-{1,2725,3731,0,11796640}-{1,2721,3730,0,11796640}-{1,2719,3733,0,11796640}-{1,2714,3733,0,11796640}-{1,2712,3732,0,11796640}-{1,2896,3119,0,11796640}-{1,2914,3111,0,11796640}-{1,2926,3110,0,11796640}-{1,2939,3102,0,11796640}-{1,2938,3073,0,11796640}-{1,2945,3068,0,11796640}-{1,2975,3013,0,11796640}-{1,2955,3010,0,11796640}-{1,2959,2959,0,11796640}-{1,2943,2950,0,11796640}-{1,2866,2976,0,11796640}-{1,2854,2977,0,11796640}-{1,2840,2974,0,11796640}-{1,2757,2947,0,11796640}-{1,2755,2952,0,11796640}-{1,2786,2960,0,11796640}-{1,2782,2987,0,11796640}-{1,2771,2995,0,11796640}-{1,2761,3000,0,11796640}-{1,2755,3008,0,11796640}-{1,2754,3017,0,11796640}-{1,2756,3060,0,11796640}-{1,2755,3070,0,11796640}-{1,2756,3074,0,11796640}-{1,2806,3128,0,11796640}-{1,2864,3195,0,11796640}-{1,2764,3131,0,11796640}-{1,2753,3125,0,11796640}-{1,2757,3109,0,11796640}"
|
||||
},
|
||||
{
|
||||
"item_id": "444",
|
||||
"loc_data": "{1,3231,3739,0,250}-{1,3236,3741,0,250}-{1,3195,9821,0,150}-"
|
||||
"loc_data": "{1,3195,9821,0,11141270}-{1,3231,3739,0,19661050}-{1,3236,3741,0,19661050}"
|
||||
},
|
||||
{
|
||||
"item_id": "480",
|
||||
"loc_data": "{1,3298,3313,0,30}-"
|
||||
"loc_data": "{1,3298,3313,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "526",
|
||||
"loc_data": "{1,2510,3080,0,30}-{1,2516,3084,0,30}-{1,2509,3090,0,30}-{1,2512,3084,0,30}-{1,2510,3084,0,30}-{1,2505,3114,0,30}-{1,2507,3116,0,30}-{1,2503,3118,0,30}-{1,2510,3114,0,30}-{1,3238,3606,0,100}-{1,3236,3605,0,100}-{1,3238,3603,0,100}-{1,3240,3603,0,100}-{1,3242,3604,0,100}-{1,3244,3611,0,100}-{1,3247,3614,0,100}-{1,3238,3610,0,100}-{1,3238,3608,0,100}-{1,3232,3948,0,100}-{1,3237,3938,0,100}-{1,3250,3952,0,100}-{1,2966,9772,0,90}-{1,2968,9771,0,90}-{1,2831,9766,0,90}-{1,2829,9764,0,90}-{1,2917,9796,0,90}-{1,2914,9796,0,90}-{1,2910,9797,0,90}-{1,2908,9794,0,90}-{1,2926,9801,0,90}-{1,2924,9801,0,90}-{1,2924,9804,0,90}-{1,2927,9805,0,90}-{1,2929,9807,0,90}-{1,2938,9792,0,90}-{1,2938,9796,0,90}-{1,2935,9799,0,90}-{1,2930,9794,0,90}-{1,2932,9792,0,90}-{1,2903,9826,0,90}-{1,2906,9823,0,90}-{1,2906,9825,0,90}-{1,2907,9824,0,90}-{1,2910,9825,0,90}-{1,3101,9825,0,90}-{1,3107,9823,0,90}-{1,3109,9823,0,90}-{1,3110,9825,0,90}-{1,3138,9880,0,90}-{1,3141,9879,0,90}-{1,3142,9880,0,90}-{1,3143,9878,0,90}-{1,3097,9902,0,90}-{1,3094,9907,0,90}-{1,3093,9884,0,90}-{1,3098,9886,0,90}-{1,3093,9879,0,90}-{1,3122,9891,0,90}-{1,3116,9891,0,90}-{1,3119,9894,0,90}-{1,3120,9894,0,90}-{1,3103,9953,0,90}-{1,3104,9950,0,90}-{1,3110,9952,0,90}-{1,3111,9956,0,90}-{1,3110,9958,0,90}-{1,3111,9959,0,90}-{1,3116,9950,0,90}-{1,3127,9957,0,90}-"
|
||||
"loc_data": "{1,2917,9796,0,7864410}-{1,2914,9796,0,7864410}-{1,2910,9797,0,7864410}-{1,2908,9794,0,7864410}-{1,3103,9953,0,7864410}-{1,3104,9950,0,7864410}-{1,3110,9952,0,7864410}-{1,3111,9956,0,7864410}-{1,3110,9958,0,7864410}-{1,3111,9959,0,7864410}-{1,3116,9950,0,7864410}-{1,3127,9957,0,7864410}-{1,2926,9801,0,7864410}-{1,2924,9801,0,7864410}-{1,2924,9804,0,7864410}-{1,2927,9805,0,7864410}-{1,2929,9807,0,7864410}-{1,2938,9792,0,7864410}-{1,2938,9796,0,7864410}-{1,2935,9799,0,7864410}-{1,2930,9794,0,7864410}-{1,2932,9792,0,7864410}-{1,2966,9772,0,7864410}-{1,2968,9771,0,7864410}-{1,2903,9826,0,7864410}-{1,2906,9823,0,7864410}-{1,2906,9825,0,7864410}-{1,2907,9824,0,7864410}-{1,2910,9825,0,7864410}-{1,3101,9825,0,7864410}-{1,3107,9823,0,7864410}-{1,3109,9823,0,7864410}-{1,3110,9825,0,7864410}-{1,3138,9880,0,7864410}-{1,3141,9879,0,7864410}-{1,3142,9880,0,7864410}-{1,3143,9878,0,7864410}-{1,3097,9902,0,7864410}-{1,3094,9907,0,7864410}-{1,3093,9884,0,7864410}-{1,3098,9886,0,7864410}-{1,3093,9879,0,7864410}-{1,3122,9891,0,7864410}-{1,3116,9891,0,7864410}-{1,3119,9894,0,7864410}-{1,3120,9894,0,7864410}-{1,2831,9766,0,7864410}-{1,2829,9764,0,7864410}-{1,2510,3080,0,5898270}-{1,2516,3084,0,5898270}-{1,2509,3090,0,5898270}-{1,2512,3084,0,5898270}-{1,2510,3084,0,5898270}-{1,2505,3114,0,5898270}-{1,2507,3116,0,5898270}-{1,2503,3118,0,5898270}-{1,2510,3114,0,5898270}-{1,3238,3606,0,9830500}-{1,3236,3605,0,9830500}-{1,3238,3603,0,9830500}-{1,3240,3603,0,9830500}-{1,3242,3604,0,9830500}-{1,3244,3611,0,9830500}-{1,3247,3614,0,9830500}-{1,3238,3610,0,9830500}-{1,3238,3608,0,9830500}-{1,3232,3948,0,9830500}-{1,3237,3938,0,9830500}-{1,3250,3952,0,9830500}"
|
||||
},
|
||||
{
|
||||
"item_id": "528",
|
||||
"loc_data": "{1,3211,3822,0,60}-{1,3212,3819,0,60}-{1,3217,3816,0,60}-{1,3218,3813,0,60}-{1,3182,3848,0,50}-{1,3178,3851,0,60}-{1,3179,3853,0,60}-{1,3185,3857,0,60}-{1,3187,3853,0,60}-"
|
||||
"loc_data": "{1,3182,3848,0,6553650}-{1,3178,3851,0,6553660}-{1,3179,3853,0,6553660}-{1,3185,3857,0,6553660}-{1,3187,3853,0,6553660}-{1,3211,3822,0,6553660}-{1,3212,3819,0,6553660}-{1,3217,3816,0,6553660}-{1,3218,3813,0,6553660}"
|
||||
},
|
||||
{
|
||||
"item_id": "542",
|
||||
"loc_data": "{1,3059,3488,1,90}-"
|
||||
"loc_data": "{1,3059,3488,1,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "544",
|
||||
"loc_data": "{1,3059,3487,1,90}-"
|
||||
"loc_data": "{1,3059,3487,1,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "554",
|
||||
"loc_data": "{1,3303,3311,0,30}-{1,3026,3636,0,200}-"
|
||||
"loc_data": "{1,3303,3311,0,5898270}-{1,3026,3636,0,19661000}"
|
||||
},
|
||||
{
|
||||
"item_id": "555",
|
||||
"loc_data": "{1,3297,3316,0,30}-{1,3028,3636,0,200}-{3,2960,3899,0,200}-"
|
||||
"loc_data": "{1,3297,3316,0,5898270}-{1,3028,3636,0,19661000}-{3,2960,3899,0,19661000}"
|
||||
},
|
||||
{
|
||||
"item_id": "556",
|
||||
"loc_data": "{1,2938,3158,0,110}-{1,3030,3636,0,200}-"
|
||||
"loc_data": "{1,2938,3158,0,8519790}-{1,3030,3636,0,19661000}"
|
||||
},
|
||||
{
|
||||
"item_id": "557",
|
||||
"loc_data": "{1,3032,3636,0,200}-"
|
||||
"loc_data": "{1,3032,3636,0,19661000}"
|
||||
},
|
||||
{
|
||||
"item_id": "558",
|
||||
"loc_data": "{1,3206,3208,0,40}-{1,3023,3640,0,200}-"
|
||||
"loc_data": "{1,3206,3208,0,5898280}-{1,3023,3640,0,19661000}"
|
||||
},
|
||||
{
|
||||
"item_id": "559",
|
||||
"loc_data": "{1,3233,3573,0,200}-{1,3234,3578,0,200}-{1,3230,3582,0,200}-{1,3021,3637,0,200}-{1,3089,3866,0,30}-"
|
||||
"loc_data": "{1,3089,3866,0,5898270}-{1,3021,3637,0,19661000}-{1,3233,3573,0,19661000}-{1,3234,3578,0,19661000}-{1,3230,3582,0,19661000}"
|
||||
},
|
||||
{
|
||||
"item_id": "561",
|
||||
"loc_data": "{1,2671,3737,0,200}-{1,2672,3738,0,200}-"
|
||||
"loc_data": "{1,2671,3737,0,19661000}-{1,2672,3738,0,19661000}"
|
||||
},
|
||||
{
|
||||
"item_id": "562",
|
||||
"loc_data": "{1,3021,3640,0,200}-{1,3137,3833,0,200}-{1,3139,3814,0,200}-{1,3145,3814,0,200}-{1,3144,3826,0,200}-{1,3149,3823,0,200}-{1,3151,3831,0,200}-"
|
||||
"loc_data": "{1,3021,3640,0,19661000}-{1,3137,3833,0,19661000}-{1,3139,3814,0,19661000}-{1,3145,3814,0,19661000}-{1,3144,3826,0,19661000}-{1,3149,3823,0,19661000}-{1,3151,3831,0,19661000}"
|
||||
},
|
||||
{
|
||||
"item_id": "564",
|
||||
"loc_data": "{3,2947,3898,0,200}-"
|
||||
"loc_data": "{3,2947,3898,0,19661000}"
|
||||
},
|
||||
{
|
||||
"item_id": "590",
|
||||
"loc_data": "{1,2368,3135,0,140}-{1,2431,3072,0,140}-{1,3112,3369,2,140}-{1,3209,3734,0,100}-"
|
||||
},
|
||||
{
|
||||
"item_id": "677",
|
||||
"loc_data": "{1,3369,3378,0,150}-"
|
||||
"loc_data": "{1,2368,3135,0,10485900}-{1,2431,3072,0,10485900}-{1,3112,3369,2,10485900}-{1,3209,3734,0,13107300}"
|
||||
},
|
||||
{
|
||||
"item_id": "687",
|
||||
"loc_data": "{1,2655,3424,0,80}-{1,2665,3424,0,80}-{1,2669,3423,0,80}-{1,2668,3419,0,80}-{1,2671,3420,0,80}-{1,2677,3423,0,80}-{1,2676,3425,0,80}-{1,2676,3422,0,80}-{1,2679,3424,0,80}-{1,2678,3426,0,80}-{1,2679,3423,0,80}-{1,2680,3424,0,80}-{1,2672,3427,0,80}-{1,2676,3430,0,80}-{1,2673,3428,0,80}-{1,2670,3437,0,80}-{1,2649,9854,0,80}-{1,2643,9853,0,80}-{1,2644,9851,0,80}-"
|
||||
},
|
||||
{
|
||||
"item_id": "708",
|
||||
"loc_data": "{1,3368,9770,0,30}-{1,3364,9764,0,30}-{1,3363,9831,0,30}-{1,3370,9826,0,30}-"
|
||||
"loc_data": "{1,2655,3424,0,6553680}-{1,2665,3424,0,6553680}-{1,2669,3423,0,6553680}-{1,2668,3419,0,6553680}-{1,2671,3420,0,6553680}-{1,2677,3423,0,6553680}-{1,2676,3425,0,6553680}-{1,2676,3422,0,6553680}-{1,2679,3424,0,6553680}-{1,2678,3426,0,6553680}-{1,2679,3423,0,6553680}-{1,2680,3424,0,6553680}-{1,2672,3427,0,6553680}-{1,2676,3430,0,6553680}-{1,2673,3428,0,6553680}-{1,2670,3437,0,6553680}"
|
||||
},
|
||||
{
|
||||
"item_id": "712",
|
||||
"loc_data": "{1,2887,3412,0,30}-{1,2903,3441,0,30}-"
|
||||
"loc_data": "{1,2887,3412,0,5898270}-{1,2903,3441,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "767",
|
||||
"loc_data": "{1,3245,3385,1,50}-{1,3243,3383,1,50}-"
|
||||
"loc_data": "{1,3245,3385,1,4587570}-{1,3243,3383,1,4587570}"
|
||||
},
|
||||
{
|
||||
"item_id": "882",
|
||||
"loc_data": "{1,3205,3227,0,140}-{1,2957,3205,0,30}-{1,2944,3332,0,30}-{1,3104,3599,0,100}-{1,3103,3596,0,100}-{1,3100,3593,0,100}-{1,3096,3595,0,100}-{1,3094,3598,0,100}-{1,3100,3609,0,100}-{1,3104,3610,0,100}-{1,3107,3611,0,100}-{1,3108,3603,0,100}-{1,3135,9916,0,140}-{3,3130,9903,0,140}-"
|
||||
"loc_data": "{1,3135,9916,0,10485900}-{3,3130,9903,0,10485900}-{1,3205,3227,0,10485900}-{1,2957,3205,0,5898270}-{1,2944,3332,0,5898270}-{1,3104,3599,0,13107300}-{1,3103,3596,0,13107300}-{1,3100,3593,0,13107300}-{1,3096,3595,0,13107300}-{1,3094,3598,0,13107300}-{1,3100,3609,0,13107300}-{1,3104,3610,0,13107300}-{1,3107,3611,0,13107300}-{1,3108,3603,0,13107300}"
|
||||
},
|
||||
{
|
||||
"item_id": "946",
|
||||
"loc_data": "{1,2903,3148,0,80}-{1,3205,3212,0,80}-{1,3224,3202,0,80}-{1,3218,3416,1,90}-{1,2820,3450,0,90}-{1,3106,3956,0,60}-{1,2566,9526,0,30}-{1,3215,9625,0,80}-{1,3218,9887,0,33}-{1,2700,3407,0,100}-"
|
||||
"loc_data": "{1,3218,9887,0,6553680}{1,2700,3407,0,6553680}-{1,3205,3212,0,6553680}-{1,3215,9625,0,6553680}-{1,3224,3202,0,6553680}-{1,2903,3148,0,6553680}-{1,2820,3450,0,7209050}-{1,3218,3416,1,7864410}-{1,3106,3956,0,5242940}-{1,2566,9526,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "952",
|
||||
"loc_data": "{1,3572,3312,0,30}-{1,3571,3310,0,30}-{1,3120,3359,0,110}-{1,2566,3330,0,100}-{1,2981,3370,0,90}-{1,3218,3412,1,30}-{1,1951,4964,0,30}-"
|
||||
"loc_data": "{1,2566,3330,0,100}-{1,3120,3359,0,8519790}-{1,2981,3370,0,9830490}-{1,3572,3312,0,3276830}-{1,3571,3310,0,3276830}-{1,3218,3412,1,5898270}-{1,1951,4964,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "954",
|
||||
"loc_data": "{1,2094,3152,0,150}-{1,2785,3279,0,150}-{1,2786,3287,0,150}-{1,2786,3286,0,150}-"
|
||||
"loc_data": "{1,2094,3152,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "960",
|
||||
"loc_data": "{1,2851,3239,0,160}-{1,2847,3238,0,160}-{1,2845,3232,0,160}-{1,2856,3231,0,160}-{1,2857,3236,0,160}-{1,2846,3384,0,160}-{1,2848,3383,0,160}-{1,2550,3575,0,200}-{1,2553,3576,0,200}-{1,2554,3575,0,200}-{1,2556,3573,0,200}-{1,3216,3665,0,200}-{1,3224,3668,0,200}-{1,3245,3678,0,200}-{1,3230,3686,0,200}-{1,3216,3677,0,200}-{1,3219,3680,0,200}-"
|
||||
"loc_data": "{1,2846,3384,0,11796640}-{1,2848,3383,0,11796640}-{1,2851,3239,0,11796640}-{1,2847,3238,0,11796640}-{1,2845,3232,0,11796640}-{1,2856,3231,0,11796640}-{1,2857,3236,0,11796640}-{1,3216,3665,0,16384200}-{1,3224,3668,0,16384200}-{1,3245,3678,0,16384200}-{1,3230,3686,0,16384200}-{1,3216,3677,0,16384200}-{1,3219,3680,0,16384200}-{1,2550,3575,0,16384200}-{1,2553,3576,0,16384200}-{1,2554,3575,0,16384200}-{1,2556,3573,0,16384200}"
|
||||
},
|
||||
{
|
||||
"item_id": "966",
|
||||
"loc_data": "{1,3237,3696,0,150}-"
|
||||
"loc_data": "{1,3237,3696,0,13107350}"
|
||||
},
|
||||
{
|
||||
"item_id": "970",
|
||||
"loc_data": "{1,3290,3033,1,90}-"
|
||||
"loc_data": "{1,3290,3033,1,7864410}"
|
||||
},
|
||||
{
|
||||
"item_id": "983",
|
||||
"loc_data": "{1,3131,9862,0,90}-"
|
||||
"loc_data": "{1,3131,9862,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "995",
|
||||
"loc_data": "{2,3234,3560,0,100}-{2,3106,3547,0,100}-{1,3104,3558,0,100}-{1,3106,3534,0,100}-{2,3101,3564,0,100}-{4,3103,3579,0,100}-{384,3224,3830,0,50}-{384,3220,3824,0,50}-{1,2909,9800,0,150}-{4,2912,9801,0,150}-{8,2910,9803,0,150}-{5,2907,9807,0,150}-{6,2913,9806,0,150}-{1,2922,9820,0,150}-{1,2934,9834,0,150}-{1,2917,9850,0,150}-{1,2914,9849,0,150}-{3,3195,9834,0,150}-{4,3195,9820,0,150}-{66,3191,9821,0,150}-{56,3190,9819,0,150}-{26,3188,9819,0,150}-{26,3188,9820,0,150}-{35,3189,9819,0,150}-{4,3088,9898,0,150}-{1,3088,9899,0,150}-{1,3091,9899,0,150}-"
|
||||
"loc_data": "{1,2909,9800,0,11141270}-{4,2912,9801,0,11141270}-{8,2910,9803,0,11141270}-{5,2907,9807,0,11141270}-{6,2913,9806,0,11141270}-{1,2922,9820,0,11141270}-{1,2934,9834,0,11141270}-{1,2917,9850,0,11141270}-{1,2914,9849,0,11141270}-{4,3088,9898,0,11141270}-{1,3088,9899,0,11141270}-{1,3091,9899,0,11141270}-{3,3195,9834,0,11141270}-{4,3195,9820,0,11141270}-{66,3191,9821,0,11141270}-{56,3190,9819,0,11141270}-{26,3188,9819,0,11141270}-{26,3188,9820,0,11141270}-{35,3189,9819,0,11141270}-{384,3224,3830,0,6553650}-{384,3220,3824,0,6553650}-{2,3106,3547,0,13107300}-{1,3104,3558,0,13107300}-{1,3106,3534,0,13107300}-{2,3101,3564,0,13107300}-{4,3103,3579,0,13107300}-{2,3234,3560,0,13107300}"
|
||||
},
|
||||
{
|
||||
"item_id": "1005",
|
||||
"loc_data": "{1,3014,3227,0,30}-{1,3009,3204,0,30}-"
|
||||
"loc_data": "{1,3014,3227,0,3276830}-{1,3009,3204,0,3276830}"
|
||||
},
|
||||
{
|
||||
"item_id": "1009",
|
||||
"loc_data": "{1,3122,9881,0,30}-"
|
||||
},
|
||||
"loc_data": "{1,3122,9881,0,3276830}"
|
||||
},
|
||||
{
|
||||
"item_id": "1059",
|
||||
"loc_data": "{1,3148,3177,0,30}-{1,3242,3385,1,90}-{1,3097,3486,0,90}-"
|
||||
"loc_data": "{1,3242,3385,1,7209050}-{1,3097,3486,0,7864410}-{1,3148,3177,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1061",
|
||||
"loc_data": "{1,3111,3159,0,190}-{1,3112,3155,0,100}-{1,3302,3190,0,30}-{1,3244,3386,1,190}-{1,3208,9620,0,190}-{1,3210,9615,0,190}-"
|
||||
"loc_data": "{1,3244,3386,1,13762750}-{1,3208,9620,0,13762750}-{1,3210,9615,0,13762750}-{1,3111,3159,0,13762750}-{1,3112,3155,0,7864420}-{1,3302,3190,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1069",
|
||||
"loc_data": "{1,3249,3740,0,90}-"
|
||||
},
|
||||
"loc_data": "{1,3249,3740,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1119",
|
||||
"loc_data": "{1,3084,3859,0,60}-"
|
||||
"loc_data": "{1,3084,3859,0,6553660}"
|
||||
},
|
||||
{
|
||||
"item_id": "1137",
|
||||
"loc_data": "{1,3242,3688,0,150}-"
|
||||
"loc_data": "{1,3242,3688,0,13107350}"
|
||||
},
|
||||
{
|
||||
"item_id": "1139",
|
||||
"loc_data": "{1,3122,3360,0,190}-"
|
||||
"loc_data": "{1,3122,3360,0,13762750}"
|
||||
},
|
||||
{
|
||||
"item_id": "1171",
|
||||
"loc_data": "{1,3217,3514,0,30}-"
|
||||
"loc_data": "{1,3217,3514,0,2949150}"
|
||||
},
|
||||
{
|
||||
"item_id": "1191",
|
||||
"loc_data": "{1,3250,3797,0,150}-"
|
||||
"loc_data": "{1,3250,3797,0,13107350}"
|
||||
},
|
||||
{
|
||||
"item_id": "1203",
|
||||
"loc_data": "{1,3248,3245,0,180}-{1,3242,3383,1,240}-{1,3216,3695,0,150}-"
|
||||
"loc_data": "{1,3242,3383,1,17039600}-{1,3248,3245,0,13107380}-{1,3216,3695,0,13107350}"
|
||||
},
|
||||
{
|
||||
"item_id": "1205",
|
||||
"loc_data": "{1,3213,3216,1,190}-"
|
||||
"loc_data": "{1,3213,3216,1,13762750}"
|
||||
},
|
||||
{
|
||||
"item_id": "1207",
|
||||
"loc_data": "{1,3213,3682,0,100}-"
|
||||
"loc_data": "{1,3213,3682,0,13107300}"
|
||||
},
|
||||
{
|
||||
"item_id": "1217",
|
||||
"loc_data": "{1,3180,3821,0,60}-"
|
||||
"loc_data": "{1,3180,3821,0,6553660}"
|
||||
},
|
||||
{
|
||||
"item_id": "1265",
|
||||
"loc_data": "{1,3229,3218,2,100}-{1,2963,3216,0,30}-{1,3081,3429,0,50}-{1,3288,9442,0,90}-{1,3288,9431,0,90}-"
|
||||
"loc_data": "{1,3081,3429,0,6553650}-{1,3288,9442,0,7864410}-{1,3288,9431,0,7864410}-{1,2963,3216,0,5898270}-{1,3229,3218,2,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "1321",
|
||||
"loc_data": "{1,2965,3211,1,30}-"
|
||||
"loc_data": "{1,2965,3211,1,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1351",
|
||||
"loc_data": "{1,2795,3161,0,240}-{1,2970,3376,1,30}-"
|
||||
"loc_data": "{1,2795,3161,0,17039600}-{1,2970,3376,1,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1385",
|
||||
"loc_data": "{1,3099,3862,0,131}-"
|
||||
"loc_data": "{1,3099,3862,0,58983299}"
|
||||
},
|
||||
{
|
||||
"item_id": "1422",
|
||||
"loc_data": "{1,3320,3137,0,150}-"
|
||||
},
|
||||
{
|
||||
"item_id": "1467",
|
||||
"loc_data": "{1,2784,3289,0,0}-"
|
||||
},
|
||||
{
|
||||
"item_id": "1469",
|
||||
"loc_data": "{1,2766,3277,0,100}-{1,2766,3289,0,100}-"
|
||||
"loc_data": "{1,3320,3137,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1510",
|
||||
"loc_data": "{1,2576,3334,0,100}-"
|
||||
"loc_data": "{1,2576,3334,0,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "1511",
|
||||
"loc_data": "{1,3106,3160,0,160}-{1,3106,3159,0,160}-{1,3105,3159,0,160}-{1,3205,3226,2,160}-{1,3205,3224,2,160}-{1,3208,3225,2,160}-{1,3209,3224,2,160}-{1,2958,3205,0,30}-{1,2959,3205,0,30}-"
|
||||
"loc_data": "{1,3205,3226,2,11796640}-{1,3205,3224,2,11796640}-{1,3208,3225,2,11796640}-{1,3209,3224,2,11796640}-{1,3106,3160,0,11796640}-{1,3106,3159,0,11796640}-{1,3105,3159,0,11796640}-{1,2958,3205,0,5898270}-{1,2959,3205,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1523",
|
||||
"loc_data": "{1,2614,9570,0,30}-"
|
||||
"loc_data": "{1,2614,9570,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1550",
|
||||
"loc_data": "{1,2714,3478,0,30}-"
|
||||
},
|
||||
"loc_data": "{1,2714,3478,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1573",
|
||||
"loc_data": "{1,2559,2975,0,10}-{1,2560,2974,0,10}-{1,2561,2973,0,10}-{1,2561,2976,0,10}-{1,2740,3637,0,30}-{1,2736,3638,0,30}-{1,2735,3636,0,30}-{1,2743,3636,0,30}-{1,2739,3634,0,30}-{1,2743,3640,0,30}-{1,2741,3639,0,30}-{1,2736,3641,0,30}-{1,2738,3641,0,30}-{1,2734,3640,0,30}-{1,2738,3636,0,30}-"
|
||||
"loc_data": "{1,2559,2975,0,327690}-{1,2560,2974,0,327690}-{1,2561,2973,0,327690}-{1,2561,2976,0,327690}-{1,2740,3637,0,5898270}-{1,2736,3638,0,5898270}-{1,2735,3636,0,5898270}-{1,2743,3636,0,5898270}-{1,2739,3634,0,5898270}-{1,2743,3640,0,5898270}-{1,2741,3639,0,5898270}-{1,2736,3641,0,5898270}-{1,2738,3641,0,5898270}-{1,2734,3640,0,5898270}-{1,2738,3636,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1590",
|
||||
"loc_data": "{1,2900,9766,0,90}-"
|
||||
},
|
||||
"loc_data": "{1,2900,9766,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1592",
|
||||
"loc_data": "{1,2935,3283,1,90}-"
|
||||
"loc_data": "{1,2935,3283,1,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1595",
|
||||
"loc_data": "{1,2928,3290,0,90}-"
|
||||
"loc_data": "{1,2928,3290,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1597",
|
||||
"loc_data": "{1,2932,3287,1,90}-"
|
||||
"loc_data": "{1,2932,3287,1,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1599",
|
||||
"loc_data": "{1,2931,3287,1,90}-"
|
||||
"loc_data": "{1,2931,3287,1,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1607",
|
||||
"loc_data": "{1,2679,3740,0,144}-{1,3169,3887,0,144}-{1,3169,3887,0,144}-"
|
||||
"loc_data": "{1,3169,3887,0,32768400}-{1,3169,3887,0,32768400}-{1,2679,3740,0,32768400}"
|
||||
},
|
||||
{
|
||||
"item_id": "1641",
|
||||
"loc_data": "{1,3196,9822,0,150}-"
|
||||
"loc_data": "{1,3196,9822,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1654",
|
||||
"loc_data": "{1,3192,9821,0,150}-"
|
||||
"loc_data": "{1,3192,9821,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1734",
|
||||
"loc_data": "{1,3286,3491,0,50}-"
|
||||
"loc_data": "{1,3286,3491,0,4587570}"
|
||||
},
|
||||
{
|
||||
"item_id": "1735",
|
||||
"loc_data": "{1,2930,3285,1,90}-{1,3192,3272,0,140}-{1,3152,3306,0,30}-{1,3126,3356,0,140}-"
|
||||
"loc_data": "{1,3192,3272,0,10485900}-{1,3126,3356,0,10485900}-{1,2930,3285,1,7209050}-{1,3152,3306,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1755",
|
||||
"loc_data": "{1,2935,3286,0,90}-"
|
||||
"loc_data": "{1,2935,3286,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1785",
|
||||
"loc_data": "{1,2822,3355,0,150}-"
|
||||
"loc_data": "{1,2822,3355,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1856",
|
||||
"loc_data": "{1,2638,3292,0,150}-"
|
||||
"loc_data": "{1,2638,3292,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1887",
|
||||
"loc_data": "{1,3141,3452,1,90}-"
|
||||
},
|
||||
{
|
||||
"item_id": "1913",
|
||||
"loc_data": "{1,2863,9875,0,44}-{1,2861,9878,0,44}-"
|
||||
"loc_data": "{1,3141,3452,1,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1917",
|
||||
"loc_data": "{1,3286,3033,1,90}-{1,2799,3156,0,150}-{1,2796,3165,0,150}-{1,3049,3257,0,150}-{1,3080,3438,0,45}-{1,3077,3439,0,30}-{1,3077,3443,0,30}-"
|
||||
"loc_data": "{1,2799,3156,0,11141270}-{1,2796,3165,0,11141270}-{1,3080,3438,0,4587565}-{1,3286,3033,1,7864410}-{1,3077,3439,0,5898270}-{1,3077,3443,0,5898270}-{1,3049,3257,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1919",
|
||||
"loc_data": "{1,2798,3156,0,150}-{1,2799,3155,0,150}-{1,2795,3160,0,150}-{1,2798,3160,0,150}-{1,2798,3161,0,150}-{1,2795,3165,0,150}-{1,2794,3165,0,150}-"
|
||||
"loc_data": "{1,2798,3156,0,11141270}-{1,2799,3155,0,11141270}-{1,2795,3160,0,11141270}-{1,2798,3160,0,11141270}-{1,2798,3161,0,11141270}-{1,2795,3165,0,11141270}-{1,2794,3165,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1921",
|
||||
"loc_data": "{1,3291,3034,0,90}-"
|
||||
"loc_data": "{1,3291,3034,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1923",
|
||||
"loc_data": "{1,3208,3214,0,80}-{1,3140,3452,1,90}-"
|
||||
"loc_data": "{1,3208,3214,0,6553680}-{1,3140,3452,1,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1925",
|
||||
"loc_data": "{1,2428,3079,0,80}-{1,2428,3080,0,80}-{1,2371,3128,0,80}-{1,2371,3127,0,80}-{1,3307,3195,0,30}-{1,3225,3294,0,80}-{1,3026,3289,0,80}-{1,3121,3359,0,60}-{1,2564,3332,0,100}-{1,3221,3497,1,80}-{1,3222,3491,1,80}-{1,2958,3510,0,80}-{1,2958,3510,0,80}-{1,1941,4956,0,30}-{1,3216,9625,0,80}-{1,2633,9908,0,100}-"
|
||||
"loc_data": "{1,2564,3332,0,100}-{1,2428,3079,0,6553680}-{1,2428,3080,0,6553680}-{1,2371,3128,0,6553680}-{1,2371,3127,0,6553680}-{1,3225,3294,0,6553680}-{1,3121,3359,0,6553660}-{1,3216,9625,0,6553680}-{1,3026,3289,0,6553680}-{1,2958,3510,0,6553680}-{1,3221,3497,1,6553680}-{1,2958,3510,0,6553680}-{1,3222,3491,1,6553680}-{1,3307,3195,0,5898270}-{1,1941,4956,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1927",
|
||||
"loc_data": "{1,2685,3683,0,174}-"
|
||||
"loc_data": "{1,2685,3683,0,1966}"
|
||||
},
|
||||
{
|
||||
"item_id": "1929",
|
||||
"loc_data": "{1,2820,3452,0,90}-{1,2823,3449,0,90}-"
|
||||
"loc_data": "{1,2820,3452,0,7209050}-{1,2823,3449,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1931",
|
||||
"loc_data": "{1,3209,3214,0,80}-{1,3166,3310,0,90}-{1,3144,3449,2,90}-"
|
||||
"loc_data": "{1,3209,3214,0,6553680}-{1,3144,3449,2,7209050}-{1,3166,3310,0,7864410}"
|
||||
},
|
||||
{
|
||||
"item_id": "1935",
|
||||
"loc_data": "{1,2905,3146,0,80}-{1,3211,3212,0,80}-{1,2936,3292,0,90}-{1,3142,3447,2,90}-{1,3211,9625,0,80}-"
|
||||
"loc_data": "{1,3211,3212,0,6553680}-{1,3211,9625,0,6553680}-{1,2905,3146,0,6553680}-{1,2936,3292,0,7209050}-{1,3142,3447,2,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1939",
|
||||
"loc_data": "{1,3193,3181,0,150}-{1,3194,3168,0,150}-{1,3191,3162,0,150}-{1,3189,3163,0,150}-{1,3185,3161,0,150}-{1,3182,3165,0,150}-{1,3172,3166,0,150}-{1,3170,3167,0,150}-{1,3164,3169,0,150}-{1,3171,3177,0,150}-{1,3173,3178,0,150}-{1,3164,3180,0,150}-{1,3165,3187,0,150}-{1,3171,3191,0,150}-{1,3178,3190,0,150}-{1,3181,3193,0,150}-{1,3182,3181,0,150}-{1,3493,3408,0,30}-{1,3494,3402,0,30}-{1,3494,3396,0,30}-{1,3499,3401,0,30}-"
|
||||
"loc_data": "{1,3193,3181,0,11141270}-{1,3194,3168,0,11141270}-{1,3191,3162,0,11141270}-{1,3189,3163,0,11141270}-{1,3185,3161,0,11141270}-{1,3182,3165,0,11141270}-{1,3172,3166,0,11141270}-{1,3170,3167,0,11141270}-{1,3164,3169,0,11141270}-{1,3171,3177,0,11141270}-{1,3173,3178,0,11141270}-{1,3164,3180,0,11141270}-{1,3165,3187,0,11141270}-{1,3171,3191,0,11141270}-{1,3178,3190,0,11141270}-{1,3181,3193,0,11141270}-{1,3182,3181,0,11141270}-{1,3493,3408,0,3932190}-{1,3494,3402,0,3932190}-{1,3494,3396,0,3932190}-{1,3499,3401,0,3932190}"
|
||||
},
|
||||
{
|
||||
"item_id": "1944",
|
||||
"loc_data": "{1,3191,3276,0,35}-{1,3229,3299,0,35}-{1,3226,3301,0,35}-{1,3015,3295,0,30}-{1,3016,3295,0,30}-{1,2853,3370,0,35}-{1,2852,3369,0,35}-{1,2851,3372,0,35}-{1,2453,4476,0,1}-"
|
||||
"loc_data": "{1,3229,3299,0,3604515}-{1,3226,3301,0,3604515}-{1,3191,3276,0,3604515}-{1,2853,3370,0,3604515}-{1,2852,3369,0,3604515}-{1,2851,3372,0,3604515}-{1,3015,3295,0,5898270}-{1,3016,3295,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1955",
|
||||
"loc_data": "{1,3141,3447,1,90}-{1,3140,3447,1,90}-{1,3141,3447,2,90}-"
|
||||
"loc_data": "{1,3141,3447,1,7209050}-{1,3140,3447,1,7209050}-{1,3141,3447,2,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1963",
|
||||
"loc_data": "{1,2907,3146,0,150}-{1,3009,3207,0,150}-"
|
||||
"loc_data": "{1,2907,3146,0,11141270}-{1,3009,3207,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "1965",
|
||||
"loc_data": "{1,3217,9622,0,90}-"
|
||||
"loc_data": "{1,3217,9622,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1971",
|
||||
"loc_data": "{1,2843,3369,0,160}-"
|
||||
"loc_data": "{1,2843,3369,0,11796640}"
|
||||
},
|
||||
{
|
||||
"item_id": "1973",
|
||||
"loc_data": "{1,3143,3453,0,40}-{1,2384,4440,0,40}-"
|
||||
"loc_data": "{1,3143,3453,0,5242920}-{1,2384,4440,0,5242920}"
|
||||
},
|
||||
{
|
||||
"item_id": "1982",
|
||||
"loc_data": "{1,2584,2966,0,10}-{1,3085,3261,0,150}-{1,3039,3706,0,15}-"
|
||||
"loc_data": "{1,3085,3261,0,11141270}-{1,3039,3706,0,1310735}-{1,2584,2966,0,327690}"
|
||||
},
|
||||
{
|
||||
"item_id": "1985",
|
||||
"loc_data": "{1,3083,3260,0,150}-{1,3039,3707,0,15}-"
|
||||
"loc_data": "{1,3083,3260,0,11141270}-{1,3039,3707,0,1310735}"
|
||||
},
|
||||
{
|
||||
"item_id": "1987",
|
||||
"loc_data": "{1,3144,3450,2,90}-{1,3237,9761,0,90}-"
|
||||
"loc_data": "{1,3237,9761,0,7209050}-{1,3144,3450,2,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "1993",
|
||||
"loc_data": "{1,3291,3033,1,90}-"
|
||||
"loc_data": "{1,3291,3033,1,7864410}"
|
||||
},
|
||||
{
|
||||
"item_id": "2025",
|
||||
"loc_data": "{1,2449,3510,1,90}-"
|
||||
},
|
||||
"loc_data": "{1,2449,3510,1,7864410}"
|
||||
},
|
||||
{
|
||||
"item_id": "2026",
|
||||
"loc_data": "{1,2483,3482,1,90}-{1,2489,3489,1,90}-"
|
||||
"loc_data": "{1,2483,3482,1,7864410}-{1,2489,3489,1,7864410}"
|
||||
},
|
||||
{
|
||||
"item_id": "2126",
|
||||
"loc_data": "{1,2661,3478,0,100}-{1,2638,3480,0,100}-{1,2632,3492,0,100}-{1,2648,3498,0,100}-{1,2669,3497,0,100}-"
|
||||
},
|
||||
{
|
||||
"item_id": "2128",
|
||||
"loc_data": "{1,2648,2963,0,10}-{1,2647,2956,0,10}-{1,2638,2949,0,10}-"
|
||||
"loc_data": "{1,2661,3478,0,100}-{1,2638,3480,0,100}-{1,2632,3492,0,100}-{1,2648,3498,0,100}-{1,2669,3497,0,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "2140",
|
||||
"loc_data": "{1,2971,3382,1,30}-"
|
||||
"loc_data": "{1,2971,3382,1,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "2142",
|
||||
"loc_data": "{1,3080,3443,0,30}-{1,3077,3441,0,30}-"
|
||||
"loc_data": "{1,3080,3443,0,5898270}-{1,3077,3441,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "2150",
|
||||
"loc_data": "{1,2907,3393,0,30}-{1,2903,3400,0,30}-{1,2908,3410,0,30}-{1,2418,3511,0,30}-{1,2417,3512,0,30}-{1,2416,3512,0,30}-{1,2412,3511,0,30}-{1,2411,3519,0,30}-{1,2415,3518,0,30}-{1,2417,3516,0,30}-{1,2417,3515,0,30}-{1,2421,3519,0,30}-{1,2424,3517,0,30}-{1,2424,3514,0,30}-{1,2428,3510,0,30}-{1,2407,3516,0,30}-"
|
||||
"loc_data": "{1,2418,3511,0,3932190}-{1,2417,3512,0,3932190}-{1,2416,3512,0,5898270}-{1,2412,3511,0,5898270}-{1,2411,3519,0,5898270}-{1,2415,3518,0,5898270}-{1,2417,3516,0,5898270}-{1,2417,3515,0,5898270}-{1,2421,3519,0,5898270}-{1,2424,3517,0,5898270}-{1,2424,3514,0,5898270}-{1,2428,3510,0,5898270}-{1,2407,3516,0,5898270}-{1,2907,3393,0,5898270}-{1,2903,3400,0,5898270}-{1,2908,3410,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "2162",
|
||||
"loc_data": "{1,2896,3414,0,30}-{1,2425,3515,0,30}-{1,2415,3517,0,30}-{1,2414,3518,0,30}-{1,2419,3511,0,30}-{1,2415,3511,0,30}-{1,2414,3510,0,30}-{1,2427,3508,0,30}-{1,2426,3507,0,30}-{1,2408,3518,0,30}-"
|
||||
"loc_data": "{1,2425,3515,0,5898270}-{1,2415,3517,0,5898270}-{1,2414,3518,0,5898270}-{1,2419,3511,0,5898270}-{1,2415,3511,0,5898270}-{1,2414,3510,0,5898270}-{1,2427,3508,0,5898270}-{1,2426,3507,0,5898270}-{1,2408,3518,0,5898270}-{1,2896,3414,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "2313",
|
||||
"loc_data": "{1,2820,3455,0,90}-{1,3142,3447,1,90}-{1,3222,3494,0,90}-"
|
||||
},
|
||||
{
|
||||
"item_id": "2333",
|
||||
"loc_data": "{1,3042,3952,0,100}-"
|
||||
"loc_data": "{1,3142,3447,1,7209050}-{1,2820,3455,0,7209050}-{1,3222,3494,0,7864410}"
|
||||
},
|
||||
{
|
||||
"item_id": "2347",
|
||||
"loc_data": "{1,2934,3286,0,90}-{1,2975,3368,1,30}-{1,2579,3463,0,40}-{1,1953,4974,0,30}-"
|
||||
"loc_data": "{1,2934,3286,0,7209050}-{1,2579,3463,0,5242920}-{1,2975,3368,1,5898270}-{1,1953,4974,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "2357",
|
||||
"loc_data": "{1,3192,9822,0,150}-"
|
||||
"loc_data": "{1,3192,9822,0,11141270}"
|
||||
},
|
||||
{
|
||||
"item_id": "2398",
|
||||
"loc_data": "{1,2517,3049,0,50}-{1,2511,3045,0,50}-"
|
||||
"loc_data": "{1,2517,3049,0,6553650}-{1,2511,3045,0,6553650}"
|
||||
},
|
||||
{
|
||||
"item_id": "2407",
|
||||
"loc_data": "{1,2935,3460,0,5}-"
|
||||
"loc_data": "{1,2935,3460,0,5}"
|
||||
},
|
||||
{
|
||||
"item_id": "2408",
|
||||
"loc_data": "{1,2903,3471,0,5}-"
|
||||
},
|
||||
{
|
||||
"item_id": "2957",
|
||||
"loc_data": "{1,3443,9742,0,100}-{1,3443,9742,1,100}-"
|
||||
},
|
||||
{
|
||||
"item_id": "2964",
|
||||
"loc_data": "{1,3437,3337,0,100}-"
|
||||
"loc_data": "{1,2903,3471,0,5}"
|
||||
},
|
||||
{
|
||||
"item_id": "3109",
|
||||
"loc_data": "{1,2893,3565,0,2}-"
|
||||
"loc_data": "{1,2893,3565,0,1441794}"
|
||||
},
|
||||
{
|
||||
"item_id": "3110",
|
||||
"loc_data": "{1,2893,3564,0,2}-"
|
||||
"loc_data": "{1,2893,3564,0,1441794}"
|
||||
},
|
||||
{
|
||||
"item_id": "3111",
|
||||
"loc_data": "{1,2893,3561,0,2}-"
|
||||
"loc_data": "{1,2893,3561,0,1441794}"
|
||||
},
|
||||
{
|
||||
"item_id": "3112",
|
||||
"loc_data": "{1,2893,3563,0,2}-"
|
||||
"loc_data": "{1,2893,3563,0,1441794}"
|
||||
},
|
||||
{
|
||||
"item_id": "3113",
|
||||
"loc_data": "{1,2893,3562,0,2}-"
|
||||
"loc_data": "{1,2893,3562,0,1441794}"
|
||||
},
|
||||
{
|
||||
"item_id": "3138",
|
||||
"loc_data": "{1,3463,9478,2,45}-{1,3461,9480,2,45}-{1,3461,9482,2,45}-{1,3461,9484,2,45}-"
|
||||
"loc_data": "{1,3463,9478,2,3932205}-{1,3461,9480,2,3932205}-{1,3461,9482,2,3932205}-{1,3461,9484,2,3932205}"
|
||||
},
|
||||
{
|
||||
"item_id": "3711",
|
||||
"loc_data": "{1,2660,3676,0,196}-"
|
||||
"loc_data": "{1,2660,3676,0,196}"
|
||||
},
|
||||
{
|
||||
"item_id": "3803",
|
||||
"loc_data": "{1,2658,3676,0,174}-"
|
||||
"loc_data": "{1,2658,3676,0,1966}"
|
||||
},
|
||||
{
|
||||
"item_id": "3805",
|
||||
"loc_data": "{1,2659,3676,0,196}-"
|
||||
},
|
||||
{
|
||||
"item_id": "4199",
|
||||
"loc_data": "{1,3492,3474,0,0}-"
|
||||
},
|
||||
{
|
||||
"item_id": "4615",
|
||||
"loc_data": "{1,3479,3092,0,0}-"
|
||||
},
|
||||
{
|
||||
"item_id": "4619",
|
||||
"loc_data": "{1,2713,4913,0,2}-"
|
||||
"loc_data": "{1,2659,3676,0,196}"
|
||||
},
|
||||
{
|
||||
"item_id": "4707",
|
||||
"loc_data": "{1,3571,3312,0,40}-"
|
||||
"loc_data": "{1,3571,3312,0,3932200}"
|
||||
},
|
||||
{
|
||||
"item_id": "4838",
|
||||
"loc_data": "{1,2593,3103,1,40}-"
|
||||
},
|
||||
{
|
||||
"item_id": "5008",
|
||||
"loc_data": "{1,3230,9609,0,44}-"
|
||||
"item_id": "4199",
|
||||
"loc_data": "{1,3492,3474,0,0}"
|
||||
},
|
||||
{
|
||||
"item_id": "5523",
|
||||
"loc_data": "{1,2935,3282,1,90}-"
|
||||
},
|
||||
{
|
||||
"item_id": "5586",
|
||||
"loc_data": "{1,2473,4941,0,90}-"
|
||||
"loc_data": "{1,2935,3282,1,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "6291",
|
||||
"loc_data": "{1,2681,3111,0,30}-{1,2673,3112,0,30}-{1,2674,3094,0,30}-{1,2671,3089,0,30}-"
|
||||
"loc_data": "{1,2681,3111,0,5898270}-{1,2673,3112,0,5898270}-{1,2674,3094,0,5898270}-{1,2671,3089,0,5898270}"
|
||||
},
|
||||
{
|
||||
"item_id": "6662",
|
||||
"loc_data": "{1,2984,3112,0,90}-"
|
||||
"loc_data": "{1,2984,3112,0,8519770}"
|
||||
},
|
||||
{
|
||||
"item_id": "6663",
|
||||
"loc_data": "{1,2984,3114,0,90}-"
|
||||
},
|
||||
{
|
||||
"item_id": "7510",
|
||||
"loc_data": "{1,2867,9875,0,44}-"
|
||||
"loc_data": "{1,2984,3114,0,8519770}"
|
||||
},
|
||||
{
|
||||
"item_id": "11065",
|
||||
"loc_data": "{1,2928,3289,0,90}-"
|
||||
"loc_data": "{1,2928,3289,0,7209050}"
|
||||
},
|
||||
{
|
||||
"item_id": "12494",
|
||||
"loc_data": "{1,2762,2973,0,60}-"
|
||||
"loc_data": "{1,2762,2973,0,7864380}"
|
||||
},
|
||||
{
|
||||
"item_id": "5008",
|
||||
"loc_data": "{1,3230,9609,0,300}"
|
||||
},
|
||||
{
|
||||
"item_id": "7510",
|
||||
"loc_data": "{1,2867,9875,0,300}"
|
||||
},
|
||||
{
|
||||
"item_id": "1913",
|
||||
"loc_data": "{1,2863,9875,0,300}-{1,2861,9878,0,300}"
|
||||
},
|
||||
{
|
||||
"item_id": "4619",
|
||||
"loc_data": "{1,2713,4913,0,2}"
|
||||
},
|
||||
{
|
||||
"item_id": "2964",
|
||||
"loc_data": "{1,3437,3337,0,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "2957",
|
||||
"loc_data": "{1,3443,9742,0,100}-{1,3443,9742,1,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "21",
|
||||
"loc_data": "{1,2613,9639,0,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "23",
|
||||
"loc_data": "{1,2583,9613,0,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "24",
|
||||
"loc_data": "{1,2564,9662,0,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "20",
|
||||
"loc_data": "{1,2577,9655,0,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "22",
|
||||
"loc_data": "{1,2574,9633,0,100}"
|
||||
},
|
||||
{
|
||||
"item_id": "2128",
|
||||
"loc_data": "{1,2648,2963,0,327690}-{1,2647,2956,0,327690}-{1,2638,2949,0,327690}"
|
||||
},
|
||||
{
|
||||
"item_id": "4615",
|
||||
"loc_data": "{1,3479,3092,0,0}"
|
||||
},
|
||||
{
|
||||
"item_id": "2333",
|
||||
"loc_data": "{1,3042,3952,0,100}"
|
||||
}
|
||||
]
|
||||
]
|
||||
|
|
|
|||
|
|
@ -95,30 +95,6 @@
|
|||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "68",
|
||||
"interfaceType": "4",
|
||||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "69",
|
||||
"interfaceType": "4",
|
||||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "70",
|
||||
"interfaceType": "4",
|
||||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "71",
|
||||
"interfaceType": "4",
|
||||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "74",
|
||||
"interfaceType": "4",
|
||||
|
|
@ -389,30 +365,6 @@
|
|||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "245",
|
||||
"interfaceType": "4",
|
||||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "246",
|
||||
"interfaceType": "4",
|
||||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "247",
|
||||
"interfaceType": "4",
|
||||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "248",
|
||||
"interfaceType": "4",
|
||||
"walkable": "false",
|
||||
"tabIndex": "-1"
|
||||
},
|
||||
{
|
||||
"id": "256",
|
||||
"interfaceType": "8",
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
1576
Server/data/configs/music_configs.json
Normal file
1576
Server/data/configs/music_configs.json
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,62 +0,0 @@
|
|||
[
|
||||
{
|
||||
"id": "98",
|
||||
"borders": "{3072,3456,3135,3519,[3076,3456,3085,3458]~,[3082,3459,3085,3460]}"
|
||||
},
|
||||
{
|
||||
"id": "141",
|
||||
"borders": "{3072,3392,3135,3455,[3076,3452,3085,3455]}"
|
||||
},
|
||||
{
|
||||
"id": "228",
|
||||
"borders": "{2896,5446,2919,5462}"
|
||||
},
|
||||
{
|
||||
"id": "229",
|
||||
"borders": "{2921,5456,2937,5479}"
|
||||
},
|
||||
{
|
||||
"id": "230",
|
||||
"borders": "{2904,5481,2927,5497}"
|
||||
},
|
||||
{
|
||||
"id": "231",
|
||||
"borders": "{2886,5464,2902,5487}"
|
||||
},
|
||||
{
|
||||
"id": "386",
|
||||
"borders": "{2820,5312,2849,5369}-{2849,5349,2880,5374}"
|
||||
},
|
||||
{
|
||||
"id": "391",
|
||||
"borders": "{2879,5340,2944,5366}-{2909,5316,2944,5340}"
|
||||
},
|
||||
{
|
||||
"id": "399",
|
||||
"borders": "{2816,5248,2943,5375,[2823,5250,2844,5310]~,[2844,5250,2878,5280]~,[2879,5340,2944,5366]~,[2909,5316,2944,5340]~,[2820,5312,2849,5369]~,[2849,5349,2880,5374]~,[2885,5253,2934,5278]~,[2913,5278,2937,5306]}"
|
||||
},
|
||||
{
|
||||
"id": "404",
|
||||
"borders": "{2823,5250,2844,5310}-{2844,5250,2878,5276}"
|
||||
},
|
||||
{
|
||||
"id": "408",
|
||||
"borders": "{2885,5253,2934,5278}-{2913,5278,2937,5306}"
|
||||
},
|
||||
{
|
||||
"id": "459",
|
||||
"borders": "{3137,5442,3192,5564}-{3193,5442,3198,5472}-{3193,5507,3198,5564}"
|
||||
},
|
||||
{
|
||||
"id": "467",
|
||||
"borders": "{3199,5441,3262,5564}-{3193,5482,3198,5497}"
|
||||
},
|
||||
{
|
||||
"id": "488",
|
||||
"borders": "{3263,5441,3327,5566}"
|
||||
},
|
||||
{
|
||||
"id": "492",
|
||||
"borders": "{3076,3452,3085,3460,[3076,3459,3081,3460]}"
|
||||
}
|
||||
]
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
|
@ -968,7 +968,7 @@
|
|||
"ids": "573"
|
||||
},
|
||||
{
|
||||
"examine": "A carving of a figure from the history of 2009Scape.",
|
||||
"examine": "A carving of a figure from the history of RuneScape.",
|
||||
"ids": "574,575,576,577,578"
|
||||
},
|
||||
{
|
||||
|
|
@ -1753,7 +1753,7 @@
|
|||
},
|
||||
{
|
||||
"examine": "Danger!",
|
||||
"ids": "1032,5127"
|
||||
"ids": "1032,5127,29373"
|
||||
},
|
||||
{
|
||||
"examine": "This tells you which way is which.",
|
||||
|
|
@ -2148,7 +2148,7 @@
|
|||
"ids": "1231"
|
||||
},
|
||||
{
|
||||
"examine": "One of the most common trees in 2009Scape.",
|
||||
"examine": "One of the most common trees in RuneScape.",
|
||||
"ids": "1276"
|
||||
},
|
||||
{
|
||||
|
|
@ -3584,7 +3584,7 @@
|
|||
"ids": "2375"
|
||||
},
|
||||
{
|
||||
"examine": "Soil. Dug up!",
|
||||
"examine": "Soil",
|
||||
"ids": "2376,2377,2378"
|
||||
},
|
||||
{
|
||||
|
|
@ -4964,7 +4964,7 @@
|
|||
"ids": "3032"
|
||||
},
|
||||
{
|
||||
"examine": "One of the most common trees in 2009Scape.",
|
||||
"examine": "One of the most common trees in RuneScape.",
|
||||
"ids": "3033,3034,3035,3036"
|
||||
},
|
||||
{
|
||||
|
|
@ -6384,12 +6384,12 @@
|
|||
"ids": "4131"
|
||||
},
|
||||
{
|
||||
"examine": "This tells you which way is which.",
|
||||
"ids": "4132,4133,4134,4135"
|
||||
"examine": "These doors look very ominous. A sign says 'To the tombs'.",
|
||||
"ids": "4132,4133"
|
||||
},
|
||||
{
|
||||
"examine": "These doors look very ominous. A sign says 'To the tombs'.",
|
||||
"ids": "4136,4137"
|
||||
"examine": "Large doors set into the hillside.",
|
||||
"ids": "4134,4135,4136,4137"
|
||||
},
|
||||
{
|
||||
"examine": "Items are for sale here.",
|
||||
|
|
@ -8592,7 +8592,7 @@
|
|||
"ids": "5789,5790"
|
||||
},
|
||||
{
|
||||
"examine": "A carving of a figure from the history of 2009Scape.",
|
||||
"examine": "A carving of a figure from the history of RuneScape.",
|
||||
"ids": "5791,36749,36751"
|
||||
},
|
||||
{
|
||||
|
|
@ -12788,7 +12788,7 @@
|
|||
"ids": "8972"
|
||||
},
|
||||
{
|
||||
"examine": "One of the most common trees in 2009Scape.",
|
||||
"examine": "One of the most common trees in RuneScape.",
|
||||
"ids": "8973"
|
||||
},
|
||||
{
|
||||
|
|
@ -14100,7 +14100,7 @@
|
|||
"ids": "10080"
|
||||
},
|
||||
{
|
||||
"examine": "One of the most common trees in 2009Scape.",
|
||||
"examine": "One of the most common trees in RuneScape.",
|
||||
"ids": "10081"
|
||||
},
|
||||
{
|
||||
|
|
@ -15964,7 +15964,7 @@
|
|||
"ids": "11354,11355"
|
||||
},
|
||||
{
|
||||
"examine": "A gateway back to 2009Scape.",
|
||||
"examine": "A gateway back to RuneScape.",
|
||||
"ids": "11356"
|
||||
},
|
||||
{
|
||||
|
|
@ -16324,7 +16324,7 @@
|
|||
"ids": "11629"
|
||||
},
|
||||
{
|
||||
"examine": "This tells you which way is which.",
|
||||
"examine": "South to Falador :: West to Taverley :: East to Varrock.",
|
||||
"ids": "11630,11631,11632,11633"
|
||||
},
|
||||
{
|
||||
|
|
@ -16564,7 +16564,7 @@
|
|||
"ids": "11759"
|
||||
},
|
||||
{
|
||||
"examine": "A carving of a figure from the history of 2009Scape.",
|
||||
"examine": "A carving of a figure from the history of RuneScape.",
|
||||
"ids": "11761"
|
||||
},
|
||||
{
|
||||
|
|
@ -16741,7 +16741,7 @@
|
|||
},
|
||||
{
|
||||
"examine": "Better not eat them!",
|
||||
"ids": "12003,12128"
|
||||
"ids": "12003"
|
||||
},
|
||||
{
|
||||
"examine": "It's going to be a tight squeeze!",
|
||||
|
|
@ -16881,7 +16881,7 @@
|
|||
},
|
||||
{
|
||||
"examine": "A wall jutting out into the path.",
|
||||
"ids": "12127,12129,12130"
|
||||
"ids": "12127,12128,12129,12130"
|
||||
},
|
||||
{
|
||||
"examine": "Spooky.",
|
||||
|
|
@ -18728,7 +18728,7 @@
|
|||
"ids": "13409,13410"
|
||||
},
|
||||
{
|
||||
"examine": "One of the most common trees in 2009Scape.",
|
||||
"examine": "One of the most common trees in RuneScape.",
|
||||
"ids": "13411,13412"
|
||||
},
|
||||
{
|
||||
|
|
@ -18996,11 +18996,11 @@
|
|||
"ids": "13525"
|
||||
},
|
||||
{
|
||||
"examine": "A map of 2009Scape.",
|
||||
"examine": "A map of RuneScape.",
|
||||
"ids": "13526"
|
||||
},
|
||||
{
|
||||
"examine": "A map of 2009Scape including major cave systems.",
|
||||
"examine": "A map of RuneScape including major cave systems.",
|
||||
"ids": "13527"
|
||||
},
|
||||
{
|
||||
|
|
@ -20027,26 +20027,6 @@
|
|||
"examine": "It seems to have all boiled away.",
|
||||
"ids": "14009"
|
||||
},
|
||||
{
|
||||
"examine": "Stop examining signs! You're in the Wilderness now!",
|
||||
"ids": "14503"
|
||||
},
|
||||
{
|
||||
"examine": "Danger, Wilderness up ahead. Last chance to turn back...",
|
||||
"ids": "14504"
|
||||
},
|
||||
{
|
||||
"examine": "Danger, Wilderness up ahead. Watch out for the Beast!",
|
||||
"ids": "14505"
|
||||
},
|
||||
{
|
||||
"examine": "Danger, Wilderness up ahead. Beware of stray magma.",
|
||||
"ids": "14506"
|
||||
},
|
||||
{
|
||||
"examine": "Danger, Wilderness up ahead. Almost certain death!",
|
||||
"ids": "14507"
|
||||
},
|
||||
{
|
||||
"examine": "Home sweet home?",
|
||||
"ids": "15477"
|
||||
|
|
@ -20059,30 +20039,10 @@
|
|||
"examine": "Home sweet home?",
|
||||
"ids": "15748"
|
||||
},
|
||||
{
|
||||
"examine": "Danger - Possibly deadly creatures below!",
|
||||
"ids": "16083,16151,16117"
|
||||
},
|
||||
{
|
||||
"examine": "Large urn.",
|
||||
"ids": "17362"
|
||||
},
|
||||
{
|
||||
"examine": "A large fish.",
|
||||
"ids": "18482"
|
||||
},
|
||||
{
|
||||
"examine": "A sign on a cactus.",
|
||||
"ids": "18876"
|
||||
},
|
||||
{
|
||||
"examine": "Dead and half-buried.",
|
||||
"ids": "19996"
|
||||
},
|
||||
{
|
||||
"examine": "Dead animal head. Lovely.",
|
||||
"ids": "19997"
|
||||
},
|
||||
{
|
||||
"examine": "Might be worth opening?",
|
||||
"ids": "21299"
|
||||
|
|
@ -20187,18 +20147,10 @@
|
|||
"examine": "Contains traces of summoning energy.",
|
||||
"ids": "29939,29943,29944,29945,29947,29951,29952,29953,29954"
|
||||
},
|
||||
{
|
||||
"examine": "An interesting sign.",
|
||||
"ids": "31297,31298,31299,31300,31301"
|
||||
},
|
||||
{
|
||||
"examine": "I wonder what this spooky contains.",
|
||||
"ids": "37051"
|
||||
},
|
||||
{
|
||||
"examine": "The mine has collapsed.",
|
||||
"ids": "37634"
|
||||
},
|
||||
{
|
||||
"examine": "It really was this big!",
|
||||
"ids": "40043"
|
||||
|
|
@ -20263,14 +20215,6 @@
|
|||
"examine": "A wooden crate.",
|
||||
"ids": "15031"
|
||||
},
|
||||
{
|
||||
"examine": "A sealed barrel with a warning sign on it.",
|
||||
"ids": "17296"
|
||||
},
|
||||
{
|
||||
"examine": "A barrel with a warning sign on it.",
|
||||
"ids": "17297"
|
||||
},
|
||||
{
|
||||
"examine": "A beautiful landscape.",
|
||||
"ids": "24184"
|
||||
|
|
@ -20351,10 +20295,6 @@
|
|||
"examine": "Technically a bed.",
|
||||
"ids": "32031"
|
||||
},
|
||||
{
|
||||
"examine": "Now that's what I call slimline!",
|
||||
"ids": "32072"
|
||||
},
|
||||
{
|
||||
"examine": "A really bad portrait of the King.",
|
||||
"ids": "32326"
|
||||
|
|
@ -20373,7 +20313,7 @@
|
|||
},
|
||||
{
|
||||
"examine": "A wooden barrel for storage.",
|
||||
"ids": "17308,31136,36798"
|
||||
"ids": "31136,36798"
|
||||
},
|
||||
{
|
||||
"examine": "A home for baby creatures.",
|
||||
|
|
@ -20599,6 +20539,10 @@
|
|||
"examine": "Popular on sandy beaches where fruity cocktails may be found.",
|
||||
"ids": "18856"
|
||||
},
|
||||
{
|
||||
"examine": "Stop examining signs! You're in the Wilderness now!",
|
||||
"ids": "14503"
|
||||
},
|
||||
{
|
||||
"examine": "Looks like part of the entrance is blocked by rubble.",
|
||||
"ids": "15767"
|
||||
|
|
@ -20679,10 +20623,6 @@
|
|||
"examine": "Keeps the puppies out of trouble.",
|
||||
"ids": "28341"
|
||||
},
|
||||
{
|
||||
"examine": "Warning! Danger of death.",
|
||||
"ids": "29373"
|
||||
},
|
||||
{
|
||||
"examine": "There are some toolboxes on this table.",
|
||||
"ids": "36573,36580"
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9236"
|
||||
"ammunition": "877,878,6061,6062,879,9236,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "800",
|
||||
|
|
@ -294,7 +294,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9236"
|
||||
"ammunition": "877,878,6061,6062,879,9236,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "839",
|
||||
|
|
@ -1095,7 +1095,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "8882,877,878,6061,6062,879,9236,9139,9286,9293,9300,9140,9287,9294,9237,9145,9301,9292,9299,9306,9335,880,9238"
|
||||
"ammunition": "8882,877,878,6061,6062,879,9236"
|
||||
},
|
||||
{
|
||||
"itemId": "9174",
|
||||
|
|
@ -1104,7 +1104,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9236"
|
||||
"ammunition": "877,878,6061,6062,879,9236,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "9176",
|
||||
|
|
@ -1113,7 +1113,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9139,9236,9286,9293,9300,9335,9237"
|
||||
"ammunition": "877,878,6061,6062,9140,879,9139,9236,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "9177",
|
||||
|
|
@ -1122,7 +1122,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9236,9139,9140,9287,9294,9301,880,9238,9145,9286,9293,9300,9292,9299,9306,9335,9237"
|
||||
"ammunition": "877,878,6061,6062,879,9236,9139,9140,9287,9294,9301,880,9238,9145,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "9179",
|
||||
|
|
@ -1131,7 +1131,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9139,9140,9236,9141,9288,9295,9302,9336,9239,9145,9286,9293,9300,9287,9294,9301,9292,9299,9306,9335,9237,880,9238"
|
||||
"ammunition": "877,878,6061,6062,879,9139,9140,9236,9141,9288,9295,9302,9336,9239,9145,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "9181",
|
||||
|
|
@ -1140,7 +1140,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9236,9141,9288,9295,9302,9336,9239,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9145,9139,9140,9241,9286,9293,9300,9140,9287,9294,9301,9292,9299,9306,9335,9237,880,9238,13083,13084,13085,13086"
|
||||
"ammunition": "877,878,6061,6062,879,9236,9141,9288,9295,9302,9336,9239,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9145,9139,9140,9241,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "9183",
|
||||
|
|
@ -1149,7 +1149,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9236,9139,9141,9288,9295,9302,9336,9239,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9241,9145,9143,9290,9297,9304,9339,9242,9340,9243,9286,9293,9300,9140,9287,9294,9301,9292,9299,9306,9335,9237,880,9238,13083,13084,13085,13086"
|
||||
"ammunition": "877,878,6061,6062,879,9236,9139,9141,9288,9295,9302,9336,9239,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9241,9145,9143,9290,9297,9304,9339,9242,9340,9243,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "9185",
|
||||
|
|
@ -1158,7 +1158,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9236,9139,9141,9288,9295,9302,9336,9239,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9145,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9241,9143,9290,9297,9304,9339,9242,9340,9243,9144,9291,9298,9305,9341,9244,9342,9245,9140,13280,9139,9286,9293,9300,9287,9294,9301,9292,9299,9306,9335,9237,880,13083,13084,13085,13086"
|
||||
"ammunition": "877,878,6061,6062,879,9236,9139,9141,9288,9295,9302,9336,9239,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9145,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9241,9143,9290,9297,9304,9339,9242,9340,9243,9144,9291,9298,9305,9341,9244,9342,9245,9140,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "9705",
|
||||
|
|
@ -1293,7 +1293,7 @@
|
|||
"weapon_type": "1",
|
||||
"animation": "4230",
|
||||
"drop_ammo": "true",
|
||||
"ammunition": "877,878,6061,6062,879,9139,9140,9236,9141,9288,9295,9302,9336,9239,9145,9286,9293,9300,9287,9294,9301,9292,9299,9306,9335,9237,880,9238,13083,13084,13085,13086"
|
||||
"ammunition": "877,878,6061,6062,879,9236,9141,9288,9295,9302,9140,9336,9239,13083,13084,13085,13086,13280"
|
||||
},
|
||||
{
|
||||
"itemId": "13405",
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@
|
|||
"general_store": "true",
|
||||
"id": "25",
|
||||
"title": "Lumbridge General Store",
|
||||
"stock": "{1931,30,100}-{1935,30,100}-{1735,10,100}-{1925,10,100}-{1923,10,100}-{1887,10,100}-{590,10,100}-{1755,10,100}-{2347,10,100}-{550,10,100}-{9003,10,100}-{1939,1000,1}"
|
||||
"stock": "{1931,30,100}-{1935,30,100}-{1735,10,100}-{1925,10,100}-{1923,10,100}-{1887,10,100}-{590,10,100}-{1755,10,100}-{2347,10,100}-{550,10,100}-{9003,10,100}"
|
||||
},
|
||||
{
|
||||
"npcs": "4716",
|
||||
|
|
@ -564,7 +564,7 @@
|
|||
"general_store": "false",
|
||||
"id": "65",
|
||||
"title": "Dodgy Mikes Second-hand Clothing",
|
||||
"stock": "{7114,10,100}-{7122,10,100}-{7128,10,100}-{7134,10,100}-{7110,10,100}-{7126,10,100}-{7132,10,100}-{7138,10,100}-{7116,10,100}-{7124,10,100}-{7130,10,100}-{7112,10,100}-{7136,10,100}"
|
||||
"stock": "{7114,10,100}"
|
||||
},
|
||||
{
|
||||
"npcs": "2161",
|
||||
|
|
@ -1599,7 +1599,7 @@
|
|||
"general_store": "false",
|
||||
"id": "181",
|
||||
"title": "MoonClan Fine Clothes",
|
||||
"stock": "{9068,10,100}-{9069,10,100}-{9070,10,100}-{9071,10,100}-{9072,10,100}-{9073,10,100}-{9074,10,100}-{1733,50,100}-{1734,500,100}-{9084,10,100}-{9096,10,100}-{9097,10,100}-{9098,10,100}-{9099,10,100}-{9100,10,100}-{9101,10,100}-{9102,10,100}-{9104,10,100}"
|
||||
"stock": "{9068,10,100}-{9069,10,100}-{9070,10,100}-{9071,10,100}-{9072,10,100}-{9073,10,100}-{9074,10,100}-{1733,50,100}-{1734,500,100}"
|
||||
},
|
||||
{
|
||||
"npcs": "",
|
||||
|
|
@ -2177,23 +2177,5 @@
|
|||
"id": "255",
|
||||
"title": "Castle Wars Ticket Exchange",
|
||||
"stock": "{4068,1,100}-{4069,1,100}-{4070,1,100}-{4071,1,100}-{4072,1,100}-{4503,1,100}-{4504,1,100}-{4505,1,100}-{4506,1,100}-{4507,1,100}-{4508,1,100}-{4509,1,100}-{4510,1,100}-{4511,1,100}-{4512,1,100}-{4513,1,100}-{4514,1,100}-{4515,1,100}-{4516,1,100}"
|
||||
},
|
||||
{
|
||||
"npcs": "5111",
|
||||
"high_alch": "0",
|
||||
"currency": "995",
|
||||
"general_store": "false",
|
||||
"id": "256",
|
||||
"title": "Leon's Prototype Crossbow",
|
||||
"stock": "{10156,2,100}"
|
||||
},
|
||||
{
|
||||
"npcs": "2039",
|
||||
"high_alch": "0",
|
||||
"currency": "995",
|
||||
"general_store": "false",
|
||||
"id": "256",
|
||||
"title": "Uglug's Stuffsies",
|
||||
"stock": "{4844,100,10}-{10927,0,100}-{2862,100,100}-{1777,10,200}-{2876,0,500}-{2878,10,100}-{4850,0,100}-{946,5,100}-{4773,0,1000}-{4778,0,1000}-{4783,0,1000}-{4788,0,1500}-{4793,0,2000}-{4798,0,3000}-{4803,0,4000}-{4827,0,2000}"
|
||||
}
|
||||
]
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -30,6 +30,11 @@ public enum BossKillCounter {
|
|||
8355, 8356, 8357, 8358, 8359, 8360,
|
||||
8361, 8362, 8363, 8364, 8365, 8366,
|
||||
}, "Tormented demon", -1),
|
||||
CALLISTO(new int[] { 8610 }, "Callisto", 14658),
|
||||
SCORPIA(new int[] { 8611 }, "Scorpia", 14661),
|
||||
VENENATIS(new int[] { 8612 }, "Venenatis", 14657),
|
||||
VETION(new int[] { 8613 }, "Vet'ion", 14659),
|
||||
KRAKEN(new int[] { 8614 }, "Cave Kraken", 14651),
|
||||
|
||||
|
||||
;
|
||||
|
|
|
|||
|
|
@ -2,11 +2,8 @@ package content.data
|
|||
|
||||
import content.global.skill.magic.TeleportMethod
|
||||
import content.global.skill.slayer.SlayerManager.Companion.getInstance
|
||||
import content.global.skill.slayer.SlayerUtils
|
||||
import core.ServerConstants
|
||||
import core.api.*
|
||||
import core.game.event.TeleportEvent
|
||||
import core.game.interaction.QueueStrength
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.node.entity.player.link.TeleportManager
|
||||
import core.game.node.item.Item
|
||||
|
|
@ -21,7 +18,7 @@ import java.util.*
|
|||
|
||||
/**
|
||||
* Represents an enchanted jewellery.
|
||||
* @author Vexia, downthecrop, Player Name
|
||||
* @author Vexia & downthecrop
|
||||
*/
|
||||
enum class EnchantedJewellery(
|
||||
|
||||
|
|
@ -189,13 +186,6 @@ enum class EnchantedJewellery(
|
|||
Items.RING_OF_WEALTH2_14642,
|
||||
Items.RING_OF_WEALTH1_14640,
|
||||
Items.RING_OF_WEALTH_14638
|
||||
),
|
||||
RING_OF_LIFE(arrayOf<String>(),
|
||||
arrayOf(
|
||||
Location.create(ServerConstants.HOME_LOCATION)
|
||||
),
|
||||
true,
|
||||
Items.RING_OF_LIFE_2570
|
||||
);
|
||||
|
||||
val isCrumble: Boolean = crumble
|
||||
|
|
@ -209,7 +199,7 @@ enum class EnchantedJewellery(
|
|||
constructor(options: Array<String>, locations: Array<Location>, vararg ids: Int) : this(options, locations, false, *ids)
|
||||
|
||||
/**
|
||||
* Method used when the player "Use"s the jewellery piece.
|
||||
* Method used to teleport the player to the desired location.
|
||||
* @param player the player.
|
||||
* @param item the used jewellery item.
|
||||
* @param buttonID the button id.
|
||||
|
|
@ -222,52 +212,39 @@ enum class EnchantedJewellery(
|
|||
}
|
||||
return
|
||||
}
|
||||
attemptTeleport(player, item, buttonID, isEquipped)
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used to actually teleport the player to the desired location.
|
||||
* @param player the player.
|
||||
* @param item the used jewellery item.
|
||||
* @param buttonID the button id.
|
||||
* @param isEquipped If the player is operating.
|
||||
*/
|
||||
fun attemptTeleport(player: Player, item: Item, buttonID: Int, isEquipped: Boolean): Boolean {
|
||||
val itemIndex = getItemIndex(item)
|
||||
val nextJewellery = Item(getNext(itemIndex))
|
||||
if (!canTeleport(player, nextJewellery)) {
|
||||
return false
|
||||
}
|
||||
Pulser.submit(object : Pulse(0) {
|
||||
private var count = 0
|
||||
private var location = getLocation(buttonID)
|
||||
override fun pulse(): Boolean {
|
||||
when (count) {
|
||||
0 -> {
|
||||
lock(player,4)
|
||||
visualize(player, ANIMATION, GRAPHICS)
|
||||
playGlobalAudio(player.location, Sounds.TELEPORT_ALL_200)
|
||||
player.impactHandler.disabledTicks = 4
|
||||
closeInterface(player)
|
||||
}
|
||||
3 -> {
|
||||
teleport(player,location)
|
||||
resetAnimator(player)
|
||||
if (isLastItemIndex(itemIndex)) {
|
||||
if (isCrumble) crumbleJewellery(player, item, isEquipped)
|
||||
} else {
|
||||
replaceJewellery(player, item, nextJewellery, isEquipped)
|
||||
if (canTeleport(player, nextJewellery)) {
|
||||
Pulser.submit(object : Pulse(0) {
|
||||
private var count = 0
|
||||
private var location = getLocation(buttonID)
|
||||
override fun pulse(): Boolean {
|
||||
when (count) {
|
||||
0 -> {
|
||||
lock(player,4)
|
||||
visualize(player, ANIMATION, GRAPHICS)
|
||||
playGlobalAudio(player.location, Sounds.TELEPORT_ALL_200)
|
||||
player.impactHandler.disabledTicks = 4
|
||||
closeInterface(player)
|
||||
}
|
||||
3 -> {
|
||||
teleport(player,location)
|
||||
resetAnimator(player)
|
||||
if (isLastItemIndex(itemIndex)) {
|
||||
if (isCrumble) crumbleJewellery(player, item, isEquipped)
|
||||
} else {
|
||||
replaceJewellery(player, item, nextJewellery, isEquipped)
|
||||
}
|
||||
unlock(player)
|
||||
player.dispatch(TeleportEvent(TeleportManager.TeleportType.NORMAL, TeleportMethod.JEWELRY, item, location))
|
||||
return true
|
||||
}
|
||||
unlock(player)
|
||||
player.dispatch(TeleportEvent(TeleportManager.TeleportType.NORMAL, TeleportMethod.JEWELRY, item, location))
|
||||
return true
|
||||
}
|
||||
count += 1
|
||||
return false
|
||||
}
|
||||
count += 1
|
||||
return false
|
||||
}
|
||||
})
|
||||
return true
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private fun replaceJewellery(player: Player, item: Item, nextJewellery: Item, isEquipped: Boolean) {
|
||||
|
|
@ -285,11 +262,8 @@ enum class EnchantedJewellery(
|
|||
removeItem(player, item)
|
||||
}
|
||||
if (isSlayerRing(item)) {
|
||||
queueScript(player, 1, QueueStrength.SOFT) {
|
||||
addItemOrDrop(player, Items.ENCHANTED_GEM_4155)
|
||||
sendMessage(player, "Your Ring of Slaying reverts back into a regular enchanted gem.")
|
||||
return@queueScript stopExecuting(player)
|
||||
}
|
||||
addItem(player, Items.ENCHANTED_GEM_4155)
|
||||
sendMessage(player, "Your Ring of Slaying reverts back into a regular enchanted gem.")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -301,11 +275,11 @@ enum class EnchantedJewellery(
|
|||
val slayerManager = getInstance(player)
|
||||
if (!slayerManager.hasTask()) {
|
||||
sendNPCDialogue(player, slayerManager.master!!.npc, "You need something new to hunt. Come and " +
|
||||
"see me when you can and I'll give you a new task.", core.game.dialogue.FacialExpression.HALF_GUILTY)
|
||||
"see me When you can and I'll give you a new task.", core.game.dialogue.FacialExpression.HALF_GUILTY)
|
||||
return
|
||||
}
|
||||
sendNPCDialogue(player, slayerManager.master!!.npc, "You're currently " +
|
||||
"assigned to kill ${SlayerUtils.pluralise(getSlayerTaskName(player))} " +
|
||||
"assigned to kill ${getSlayerTaskName(player).lowercase(Locale.getDefault())}'s; " +
|
||||
"only ${getSlayerTaskKillsRemaining(player)} more to go.", core.game.dialogue.FacialExpression.FRIENDLY)
|
||||
// Slayer tracker UI
|
||||
setVarp(player, 2502, slayerManager.flags.taskFlags shr 4)
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ public enum GodBook {
|
|||
* @param page the page.
|
||||
*/
|
||||
public void insertPage(Player player, Item book, Item page) {
|
||||
if (!hasRequirement(player, Quests.HORROR_FROM_THE_DEEP))
|
||||
if (!hasRequirement(player, "Horror from the Deep"))
|
||||
return;
|
||||
if (hasPage(player, book, page)) {
|
||||
player.sendMessage("The book already has that page.");
|
||||
|
|
|
|||
|
|
@ -1,158 +0,0 @@
|
|||
package content.data
|
||||
|
||||
enum class Quests(val questName: String) {
|
||||
MYTHS_OF_THE_WHITE_LANDS("Myths of the White Lands"),
|
||||
BLACK_KNIGHTS_FORTRESS("Black Knights' Fortress"),
|
||||
COOKS_ASSISTANT("Cook's Assistant"),
|
||||
DEMON_SLAYER("Demon Slayer"),
|
||||
DORICS_QUEST("Doric's Quest"),
|
||||
DRAGON_SLAYER("Dragon Slayer"),
|
||||
ERNEST_THE_CHICKEN("Ernest the Chicken"),
|
||||
GOBLIN_DIPLOMACY("Goblin Diplomacy"),
|
||||
IMP_CATCHER("Imp Catcher"),
|
||||
THE_KNIGHTS_SWORD("The Knight's Sword"),
|
||||
PIRATES_TREASURE("Pirate's Treasure"),
|
||||
PRINCE_ALI_RESCUE("Prince Ali Rescue"),
|
||||
THE_RESTLESS_GHOST("The Restless Ghost"),
|
||||
ROMEO_JULIET("Romeo & Juliet"),
|
||||
RUNE_MYSTERIES("Rune Mysteries"),
|
||||
SHEEP_SHEARER("Sheep Shearer"),
|
||||
SHIELD_OF_ARRAV("Shield of Arrav"),
|
||||
VAMPIRE_SLAYER("Vampire Slayer"),
|
||||
WITCHS_POTION("Witch's Potion"),
|
||||
ANIMAL_MAGNETISM("Animal Magnetism"),
|
||||
BETWEEN_A_ROCK("Between a Rock..."),
|
||||
BIG_CHOMPY_BIRD_HUNTING("Big Chompy Bird Hunting"),
|
||||
BIOHAZARD("Biohazard"),
|
||||
CABIN_FEVER("Cabin Fever"),
|
||||
CLOCK_TOWER("Clock Tower"),
|
||||
CONTACT("Contact!"),
|
||||
ZOGRE_FLESH_EATERS("Zogre Flesh Eaters"),
|
||||
CREATURE_OF_FENKENSTRAIN("Creature of Fenkenstrain"),
|
||||
DARKNESS_OF_HALLOWVALE("Darkness of Hallowvale"),
|
||||
DEATH_TO_THE_DORGESHUUN("Death to the Dorgeshuun"),
|
||||
DEATH_PLATEAU("Death Plateau"),
|
||||
DESERT_TREASURE("Desert Treasure"),
|
||||
DEVIOUS_MINDS("Devious Minds"),
|
||||
THE_DIG_SITE("The Dig Site"),
|
||||
DRUIDIC_RITUAL("Druidic Ritual"),
|
||||
DWARF_CANNON("Dwarf Cannon"),
|
||||
EADGARS_RUSE("Eadgar's Ruse"),
|
||||
EAGLES_PEAK("Eagles' Peak"),
|
||||
ELEMENTAL_WORKSHOP_I("Elemental Workshop I"),
|
||||
ELEMENTAL_WORKSHOP_II("Elemental Workshop II"),
|
||||
ENAKHRAS_LAMENT("Enakhra's Lament"),
|
||||
ENLIGHTENED_JOURNEY("Enlightened Journey"),
|
||||
THE_EYES_OF_GLOUPHRIE("The Eyes of Glouphrie"),
|
||||
FAIRYTALE_I_GROWING_PAINS("Fairytale I - Growing Pains"),
|
||||
FAIRYTALE_II_CURE_A_QUEEN("Fairytale II - Cure a Queen"),
|
||||
FAMILY_CREST("Family Crest"),
|
||||
THE_FEUD("The Feud"),
|
||||
FIGHT_ARENA("Fight Arena"),
|
||||
FISHING_CONTEST("Fishing Contest"),
|
||||
FORGETTABLE_TALE("Forgettable Tale..."),
|
||||
THE_FREMENNIK_TRIALS("The Fremennik Trials"),
|
||||
WATERFALL_QUEST("Waterfall Quest"),
|
||||
GARDEN_OF_TRANQUILITY("Garden of Tranquility"),
|
||||
GERTRUDES_CAT("Gertrude's Cat"),
|
||||
GHOSTS_AHOY("Ghosts Ahoy"),
|
||||
THE_GIANT_DWARF("The Giant Dwarf"),
|
||||
THE_GOLEM("The Golem"),
|
||||
THE_GRAND_TREE("The Grand Tree"),
|
||||
THE_HAND_IN_THE_SAND("The Hand in the Sand"),
|
||||
HAUNTED_MINE("Haunted Mine"),
|
||||
HAZEEL_CULT("Hazeel Cult"),
|
||||
HEROES_QUEST("Heroes' Quest"),
|
||||
HOLY_GRAIL("Holy Grail"),
|
||||
HORROR_FROM_THE_DEEP("Horror from the Deep"),
|
||||
ICTHLARINS_LITTLE_HELPER("Icthlarin's Little Helper"),
|
||||
IN_AID_OF_THE_MYREQUE("In Aid of the Myreque"),
|
||||
IN_SEARCH_OF_THE_MYREQUE("In Search of the Myreque"),
|
||||
JUNGLE_POTION("Jungle Potion"),
|
||||
LEGENDS_QUEST("Legend's Quest"),
|
||||
LOST_CITY("Lost City"),
|
||||
THE_LOST_TRIBE("The Lost Tribe"),
|
||||
LUNAR_DIPLOMACY("Lunar Diplomacy"),
|
||||
MAKING_HISTORY("Making History"),
|
||||
MERLINS_CRYSTAL("Merlin's Crystal"),
|
||||
MONKEY_MADNESS("Monkey Madness"),
|
||||
MONKS_FRIEND("Monk's Friend"),
|
||||
MOUNTAIN_DAUGHTER("Mountain Daughter"),
|
||||
MOURNINGS_END_PART_I("Mourning's End Part I"),
|
||||
MOURNINGS_END_PART_II("Mourning's End Part II"),
|
||||
MURDER_MYSTERY("Murder Mystery"),
|
||||
MY_ARMS_BIG_ADVENTURE("My Arm's Big Adventure"),
|
||||
NATURE_SPIRIT("Nature Spirit"),
|
||||
OBSERVATORY_QUEST("Observatory Quest"),
|
||||
ONE_SMALL_FAVOUR("One Small Favour"),
|
||||
PLAGUE_CITY("Plague City"),
|
||||
PRIEST_IN_PERIL("Priest in Peril"),
|
||||
RAG_AND_BONE_MAN("Rag and Bone Man"),
|
||||
RATCATCHERS("Ratcatchers"),
|
||||
RECIPE_FOR_DISASTER("Recipe for Disaster"),
|
||||
RECRUITMENT_DRIVE("Recruitment Drive"),
|
||||
REGICIDE("Regicide"),
|
||||
ROVING_ELVES("Roving Elves"),
|
||||
ROYAL_TROUBLE("Royal Trouble"),
|
||||
RUM_DEAL("Rum Deal"),
|
||||
SCORPION_CATCHER("Scorpion Catcher"),
|
||||
SEA_SLUG("Sea Slug"),
|
||||
THE_SLUG_MENACE("The Slug Menace"),
|
||||
SHADES_OF_MORTTON("Shades of Mort'ton"),
|
||||
SHADOW_OF_THE_STORM("Shadow of the Storm"),
|
||||
SHEEP_HERDER("Sheep Herder"),
|
||||
SHILO_VILLAGE("Shilo Village"),
|
||||
A_SOULS_BANE("A Soul's Bane"),
|
||||
SPIRITS_OF_THE_ELID("Spirits of the Elid"),
|
||||
SWAN_SONG("Swan Song"),
|
||||
TAI_BWO_WANNAI_TRIO("Tai Bwo Wannai Trio"),
|
||||
A_TAIL_OF_TWO_CATS("A Tail of Two Cats"),
|
||||
TEARS_OF_GUTHIX("Tears of Guthix"),
|
||||
TEMPLE_OF_IKOV("Temple of Ikov"),
|
||||
THRONE_OF_MISCELLANIA("Throne of Miscellania"),
|
||||
THE_TOURIST_TRAP("The Tourist Trap"),
|
||||
WITCHS_HOUSE("Witch's House"),
|
||||
TREE_GNOME_VILLAGE("Tree Gnome Village"),
|
||||
TRIBAL_TOTEM("Tribal Totem"),
|
||||
TROLL_ROMANCE("Troll Romance"),
|
||||
TROLL_STRONGHOLD("Troll Stronghold"),
|
||||
UNDERGROUND_PASS("Underground Pass"),
|
||||
WANTED("Wanted!"),
|
||||
WATCHTOWER("Watchtower"),
|
||||
COLD_WAR("Cold War"),
|
||||
THE_FREMENNIK_ISLES("The Fremennik Isles"),
|
||||
TOWER_OF_LIFE("Tower of Life"),
|
||||
THE_GREAT_BRAIN_ROBBERY("The Great Brain Robbery"),
|
||||
WHAT_LIES_BELOW("What Lies Below"),
|
||||
OLAFS_QUEST("Olaf's Quest"),
|
||||
ANOTHER_SLICE_OF_HAM("Another Slice of H.A.M"),
|
||||
DREAM_MENTOR("Dream Mentor"),
|
||||
GRIM_TALES("Grim Tales"),
|
||||
KINGS_RANSOM("King's Ransom"),
|
||||
THE_PATH_OF_GLOUPHRIE("The Path of Glouphrie"),
|
||||
BACK_TO_MY_ROOTS("Back to my Roots"),
|
||||
LAND_OF_THE_GOBLINS("Land of the Goblins"),
|
||||
DEALING_WITH_SCABARAS("Dealing with Scabaras"),
|
||||
WOLF_WHISTLE("Wolf Whistle"),
|
||||
AS_A_FIRST_RESORT("As a First Resort..."),
|
||||
CATAPULT_CONSTRUCTION("Catapult Construction"),
|
||||
KENNITHS_CONCERNS("Kennith's Concerns"),
|
||||
LEGACY_OF_SEERGAZE("Legacy of Seergaze"),
|
||||
PERILS_OF_ICE_MOUNTAIN("Perils of Ice Mountain"),
|
||||
TOKTZ_KET_DILL("TokTz-Ket-Dill"),
|
||||
SMOKING_KILLS("Smoking Kills"),
|
||||
ROCKING_OUT("Rocking Out"),
|
||||
SPIRIT_OF_SUMMER("Spirit of Summer"),
|
||||
MEETING_HISTORY("Meeting History"),
|
||||
ALL_FIRED_UP("All Fired Up"),
|
||||
SUMMERS_END("Summer's End"),
|
||||
DEFENDER_OF_VARROCK("Defender of Varrock"),
|
||||
SWEPT_AWAY("Swept Away"),
|
||||
WHILE_GUTHIX_SLEEPS("While Guthix Sleeps"),
|
||||
IN_PYRE_NEED("In Pyre Need"),
|
||||
TEST_QUEST("Test Quest");
|
||||
|
||||
override fun toString(): String {
|
||||
return questName
|
||||
}
|
||||
}
|
||||
|
|
@ -30,36 +30,36 @@ public enum Consumables {
|
|||
HERRING(new Food(new int[] {347}, new HealingEffect(5))),
|
||||
MACKEREL(new Food(new int[] {355}, new HealingEffect(6))),
|
||||
ROAST_BIRD_MEAT(new Food(new int[] {9980}, new HealingEffect(6))),
|
||||
THIN_SNAIL(new Food(new int[] {3369}, new RandomHealthEffect(5, 7))),
|
||||
THIN_SNAIL(new Food(new int[] {3369}, new HealingEffect(5))),
|
||||
TROUT(new Food(new int[] {333}, new HealingEffect(7))),
|
||||
SPIDER_ON_STICK(new Food(new int[] {6297, 6305}, new RandomHealthEffect(7, 11))),
|
||||
SPIDER_ON_STICK(new Food(new int[] {6297, 6305}, new HealingEffect(7))),
|
||||
SPIDER_ON_SHAFT(new Food(new int[] {6299}, new HealingEffect(7))),
|
||||
ROAST_RABBIT(new Food(new int[] {7223}, new HealingEffect(7))),
|
||||
LEAN_SNAIL(new Food(new int[] {3371}, new RandomHealthEffect(6, 8))),
|
||||
LEAN_SNAIL(new Food(new int[] {3371}, new HealingEffect(8))),
|
||||
COD(new Food(new int[] {339}, new HealingEffect(7))),
|
||||
PIKE(new Food(new int[] {351}, new HealingEffect(8))),
|
||||
ROAST_BEAST_MEAT(new Food(new int[] {9988}, new HealingEffect(8))),
|
||||
COOKED_CRAB_MEAT(new Food(new int[] {7521, 7523, 7524, 7525, 7526}, new HealingEffect(2))),
|
||||
FAT_SNAIL(new Food(new int[] {3373}, new RandomHealthEffect(7, 9))),
|
||||
FAT_SNAIL(new Food(new int[] {3373}, new HealingEffect(9))),
|
||||
SALMON(new Food(new int[] {329}, new HealingEffect(9))),
|
||||
SLIMY_EEL(new Food(new int[] {3381}, new RandomHealthEffect(6, 10))),
|
||||
SLIMY_EEL(new Food(new int[] {3381}, new HealingEffect(6))),
|
||||
TUNA(new Food(new int[] {361}, new HealingEffect(10))),
|
||||
COOKED_KARAMBWAN(new Food(new int[] {3144}, new HealingEffect(18)), true),
|
||||
COOKED_CHOMPY(new Food(new int[] {2878}, new HealingEffect(10))),
|
||||
RAINBOW_FISH(new Food(new int[] {10136}, new HealingEffect(11))),
|
||||
CAVE_EEL(new Food(new int[] {5003}, new RandomHealthEffect(8, 12))),
|
||||
CAVE_EEL(new Food(new int[] {5003}, new HealingEffect(7))),
|
||||
LOBSTER(new Food(new int[] {379}, new HealingEffect(12))),
|
||||
COOKED_JUBBLY(new Food(new int[] {7568}, new HealingEffect(15))),
|
||||
BASS(new Food(new int[] {365}, new HealingEffect(13))),
|
||||
SWORDFISH(new Food(new int[] {373}, new HealingEffect(14))),
|
||||
LAVA_EEL(new Food(new int[] {2149}, new HealingEffect(11))),
|
||||
LAVA_EEL(new Food(new int[] {2149}, new HealingEffect(14))),
|
||||
MONKFISH(new Food(new int[] {7946}, new HealingEffect(16))),
|
||||
SHARK(new Food(new int[] {385}, new HealingEffect(20))),
|
||||
SEA_TURTLE(new Food(new int[] {397}, new HealingEffect(21))),
|
||||
MANTA_RAY(new Food(new int[] {391}, new HealingEffect(22))),
|
||||
KARAMBWANJI(new Food(new int[] {3151}, new HealingEffect(3))),
|
||||
STUFFED_SNAKE(new Food(new int[] {7579}, new HealingEffect(20), "You eat the stuffed snake-it's quite a meal! It tastes like chicken.")),
|
||||
CRAYFISH(new Food(new int[] {13433}, new HealingEffect(1))),
|
||||
CRAYFISH(new Food(new int[] {13433}, new HealingEffect(2))),
|
||||
GIANT_FROG_LEGS(new Food(new int [] {4517}, new HealingEffect(6))),
|
||||
|
||||
/** Breads */
|
||||
|
|
@ -110,8 +110,8 @@ public enum Consumables {
|
|||
MINT_CAKE(new Food(new int[] {9475}, new EnergyEffect(50))),
|
||||
|
||||
/** Vegetables */
|
||||
POTATO(new Food(new int[] {1942}, new HealingEffect(1), "You eat the potato. Yuck!")),
|
||||
BAKED_POTATO(new Food(new int[] {6701}, new HealingEffect(4))),
|
||||
POTATO(new Food(new int[] {1942}, new HealingEffect(1))),
|
||||
BAKED_POTATO(new Food(new int[] {6701}, new HealingEffect(2))),
|
||||
SPICY_SAUCE(new Food(new int[] {7072, 1923}, new HealingEffect(2))),
|
||||
CHILLI_CON_CARNE(new Food(new int[] {7062, 1923}, new HealingEffect(5))),
|
||||
SCRAMBLED_EGG(new Food(new int[] {7078, 1923}, new HealingEffect(5))),
|
||||
|
|
@ -128,8 +128,8 @@ public enum Consumables {
|
|||
MUSHROOM_POTATO(new Food(new int[] {7058}, new HealingEffect(20))),
|
||||
TUNA_AND_CORN(new Food(new int[] {7068, 1923}, new HealingEffect(13))),
|
||||
TUNA_POTATO(new Food(new int[] {7060}, new HealingEffect(22))),
|
||||
ONION(new Food(new int[] {1957}, new HealingEffect(1), "It's always sad to see a grown man/woman cry.")),
|
||||
CABBAGE(new Food(new int[] {1965}, new HealingEffect(1), "You eat the cabbage. Yuck!")),
|
||||
ONION(new Food(new int[] {1957}, new HealingEffect(2), "It's always sad to see a grown man/woman cry.")),
|
||||
CABBAGE(new Food(new int[] {1965}, new HealingEffect(2), "You eat the cabbage. Yuck!")),
|
||||
DRAYNOR_CABBAGE(new Food(new int[] {1967}, new DraynorCabbageEffect(), "You eat the cabbage.", "It seems to taste nicer than normal.")),
|
||||
EVIL_TURNIP(new Food(new int[] {12134, 12136, 12138}, new HealingEffect(6))),
|
||||
SPINACH_ROLL(new Food(new int[] {1969}, new HealingEffect(2))),
|
||||
|
|
@ -147,16 +147,16 @@ public enum Consumables {
|
|||
ORANGE(new Food(new int[] {2108}, new HealingEffect(2))),
|
||||
ORANGE_CHUNKS(new Food(new int[] {2110}, new HealingEffect(2))),
|
||||
ORANGE_SLICES(new Food(new int[] {2112}, new HealingEffect(2))),
|
||||
PAPAYA_FRUIT(new Food(new int[] {5972}, new MultiEffect(new EnergyEffect(5), new HealingEffect(8)))),
|
||||
PAPAYA_FRUIT(new Food(new int[] {5972}, new HealingEffect(2))),
|
||||
TENTI_PINEAPPLE(new FakeConsumable(1851, new String[] {"Try using a knife to slice it into pieces."})),
|
||||
PINEAPPLE(new FakeConsumable(2114, new String[] {"Try using a knife to slice it into pieces."})),
|
||||
PINEAPPLE_CHUNKS(new Food(new int[] {2116}, new HealingEffect(2))),
|
||||
PINEAPPLE_RING(new Food(new int[] {2118}, new HealingEffect(2))),
|
||||
DWELLBERRIES(new Food(new int[] {2126}, new HealingEffect(2))),
|
||||
JANGERBERRIES(new Food(new int[] {247}, new MultiEffect(new SkillEffect(Skills.ATTACK, 2, 0), new SkillEffect(Skills.STRENGTH, 1, 0), new PrayerEffect(1, 0), new SkillEffect(Skills.DEFENCE, -1, 0)), "You eat the jangerberries.", "They taste very bitter.")),
|
||||
JANGERBERRIES(new Food(new int[] {247}, new MultiEffect(new SkillEffect(Skills.ATTACK, 2, 0), new SkillEffect(Skills.STRENGTH, 1, 0), new PrayerEffect(1, 0), new SkillEffect(Skills.DEFENCE, -1, 0)))),
|
||||
STRAWBERRY(new Food(new int[] {5504}, new MultiEffect(new HealingEffect(1), new PercentageHealthEffect(6)))),
|
||||
TOMATO(new Food(new int[] {1982}, new HealingEffect(2))),
|
||||
WATERMELON(new FakeConsumable(5982, new String[] {"You can't eat it whole; maybe you should cut it up."})),
|
||||
WATERMELON(new FakeConsumable(5982, new String[] {"Try using a knife to slice it into pieces."})),
|
||||
WATERMELON_SLICE(new Food(new int[] {5984}, new PercentageHealthEffect(5))),
|
||||
LEMON(new Food(new int[] {2102}, new HealingEffect(2))),
|
||||
LEMON_CHUNKS(new Food(new int[] {2104}, new HealingEffect(2))),
|
||||
|
|
@ -169,8 +169,8 @@ public enum Consumables {
|
|||
STRANGE_FRUIT(new Food(new int[] {464}, new MultiEffect(new RemoveTimerEffect("poison"), new EnergyEffect(30)))),
|
||||
|
||||
/** Gnome Cooking */
|
||||
TOAD_CRUNCHIES(new Food(new int[] {2217}, new HealingEffect(8))),
|
||||
PREMADE_TD_CRUNCH(new Food(new int[] {2243}, new HealingEffect(8))),
|
||||
TOAD_CRUNCHIES(new Food(new int[] {2217}, new HealingEffect(12))),
|
||||
PREMADE_TD_CRUNCH(new Food(new int[] {2243}, new HealingEffect(12))),
|
||||
SPICY_CRUNCHIES(new Food(new int[] {2213}, new HealingEffect(7))),
|
||||
PREMADE_SY_CRUNCH(new Food(new int[] {2241}, new HealingEffect(7))),
|
||||
WORM_CRUNCHIES(new Food(new int[] {2205}, new HealingEffect(8))),
|
||||
|
|
@ -272,11 +272,11 @@ public enum Consumables {
|
|||
BRAINDEATH_RUM(new Drink(new int[] {7157}, new MultiEffect(new SkillEffect(Skills.DEFENCE, 0, -0.1), new SkillEffect(Skills.ATTACK, 0, -0.05), new SkillEffect(Skills.PRAYER, 0, -0.05), new SkillEffect(Skills.RANGE, 0, -0.05), new SkillEffect(Skills.MAGIC, 0, -0.05), new SkillEffect(Skills.HERBLORE, 0, -0.05), new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.MINING, 1, 0)), "With a sense of impending doom you drink the 'rum'. You try very hard not to die.")),
|
||||
RUM_TROUBLE_BREWING_RED(new Drink(new int[] {8940, 8940}, new TroubleBrewingRumEffect("Oh gods! It tastes like burning!"), new Animation(9605))),
|
||||
RUM_TROUBLE_BREWING_BLUE(new Drink(new int[] {8941, 8941}, new TroubleBrewingRumEffect("My Liver! My Liver is melting!"), new Animation(9604))),
|
||||
VODKA(new Drink(new int[] {2015}, new MultiEffect(new HealingEffect(2), new SkillEffect(Skills.ATTACK, -4, 0), new SkillEffect(Skills.STRENGTH, 4, 0)))),
|
||||
VODKA(new Drink(new int[] {2015}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.ATTACK, -3, 0)))),
|
||||
GIN(new Drink(new int[] {2019}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 1, 0), new SkillEffect(Skills.ATTACK, 4, 0), new RandomHealthEffect(3, 4)))),
|
||||
BRANDY(new Drink(new int[] {2021}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.ATTACK, 4, 0)))),
|
||||
WHISKY(new Drink(new int[] {2017}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.ATTACK, -4, 0)))),
|
||||
BOTTLE_OF_WINE(new Drink(new int[] {7919, 7921}, new MultiEffect(new HealingEffect(14), new SkillEffect(Skills.ATTACK, -3, 0)))),
|
||||
BOTTLE_OF_WINE(new Drink(new int[] {2015, 7921}, new MultiEffect(new HealingEffect(14), new SkillEffect(Skills.ATTACK, -3, 0)))),
|
||||
|
||||
/** Wine */
|
||||
JUG_OF_WINE(new Drink(new int[] {1993, 1935}, new MultiEffect(new HealingEffect(11), new SkillEffect(Skills.ATTACK, -2, 0)))),
|
||||
|
|
@ -287,7 +287,7 @@ public enum Consumables {
|
|||
CUP_OF_TEA(new Drink(new int[] {712, 1980}, new MultiEffect(new HealingEffect(3), new SkillEffect(Skills.ATTACK, 3, 0)), "Aaah, nothing like a nice cuppa tea!")),
|
||||
CUP_OF_TEA_NETTLE(new Drink(new int[] {4242, 1980}, new EnergyEffect(10))),
|
||||
CUP_OF_TEA_MILKY_NETTLE(new Drink(new int[] {4243, 1980}, new EnergyEffect(10))),
|
||||
NETTLE_TEA(new Drink(new int[] {4239, 1923}, new NettleTeaEffect())),
|
||||
NETTLE_TEA(new Drink(new int[] {4239, 1980}, new NettleTeaEffect())),
|
||||
NETTLE_TEA_MILKY(new Drink(new int[] {4240, 1980}, new NettleTeaEffect())),
|
||||
CUP_OF_TEA_CLAY(new Drink(new int[] {7730, 7728}, new SkillEffect(Skills.CONSTRUCTION, 1, 0), "You feel refreshed and ready for more building.")),
|
||||
CUP_OF_TEA_CLAY_MILKY(new Drink(new int[] {7731, 7728}, new SkillEffect(Skills.CONSTRUCTION, 1, 0))),
|
||||
|
|
@ -307,7 +307,7 @@ public enum Consumables {
|
|||
OOMLIE_WRAP(new Food(new int[] {Items.COOKED_OOMLIE_WRAP_2343}, new MultiEffect(new HealingEffect(14), new AchievementEffect(DiaryType.KARAMJA, 2, 2)))),
|
||||
ROE(new Food(new int[]{11324}, new HealingEffect(3))),
|
||||
EQUA_LEAVES(new Food(new int[]{2128}, new HealingEffect(1))),
|
||||
CHOC_ICE(new Food(new int[]{6794}, new HealingEffect(7))),
|
||||
CHOC_ICE(new Food(new int[]{6794}, new HealingEffect(6))),
|
||||
EDIBLE_SEAWEED(new Food(new int[] {403}, new HealingEffect(4))),
|
||||
FROG_SPAWN(new Food(new int[] {5004}, new RandomHealthEffect(3, 7), "You eat the frogspawn. Yuck.")),
|
||||
|
||||
|
|
@ -319,44 +319,44 @@ public enum Consumables {
|
|||
STRENGTH(new Potion(new int[] {113, 115, 117, 119}, new SkillEffect(Skills.STRENGTH, 3, 0.1))),
|
||||
ATTACK(new Potion(new int[] {2428, 121, 123, 125}, new SkillEffect(Skills.ATTACK, 3, 0.1))),
|
||||
DEFENCE(new Potion(new int[] {2432, 133, 135, 137}, new SkillEffect(Skills.DEFENCE, 3, 0.1))),
|
||||
RANGING(new Potion(new int[] {2444, 169, 171, 173}, new SkillEffect(Skills.RANGE, 4, 0.1))),
|
||||
MAGIC(new Potion(new int[] {3040, 3042, 3044, 3046}, new SkillEffect(Skills.MAGIC, 4, 0))),
|
||||
SUPER_STRENGTH(new Potion(new int[] {2440, 157, 159, 161}, new SkillEffect(Skills.STRENGTH, 5, 0.15))),
|
||||
SUPER_ATTACK(new Potion(new int[] {2436, 145, 147, 149}, new SkillEffect(Skills.ATTACK, 5, 0.15))),
|
||||
SUPER_DEFENCE(new Potion(new int[] {2442, 163, 165, 167}, new SkillEffect(Skills.DEFENCE, 5, 0.15))),
|
||||
RANGING(new Potion(new int[] {2444, 169, 171, 173}, new SkillEffect(Skills.RANGE, 3, 0.1))),
|
||||
MAGIC(new Potion(new int[] {3040, 3042, 3044, 3046}, new SkillEffect(Skills.MAGIC, 3, 0.1))),
|
||||
SUPER_STRENGTH(new Potion(new int[] {2440, 157, 159, 161}, new SkillEffect(Skills.STRENGTH, 3, 0.2))),
|
||||
SUPER_ATTACK(new Potion(new int[] {2436, 145, 147, 149}, new SkillEffect(Skills.ATTACK, 3, 0.2))),
|
||||
SUPER_DEFENCE(new Potion(new int[] {2442, 163, 165, 167}, new SkillEffect(Skills.DEFENCE, 3, 0.2))),
|
||||
ANTIPOISON(new Potion(new int[] {2446, 175, 177, 179}, new AddTimerEffect("poison:immunity", secondsToTicks(90)))),
|
||||
ANTIPOISON_(new Potion(new int[] {5943, 5945, 5947, 5949}, new AddTimerEffect("poison:immunity", minutesToTicks(9)))),
|
||||
ANTIPOISON__(new Potion(new int[] {5952, 5954, 5956, 5958}, new AddTimerEffect("poison:immunity", minutesToTicks(12)))),
|
||||
SUPER_ANTIP(new Potion(new int[] {2448, 181, 183, 185}, new AddTimerEffect("poison:immunity", minutesToTicks(6)))),
|
||||
RELICYM(new Potion(new int[] {4842, 4844, 4846, 4848}, new CureDiseaseEffect())),
|
||||
RELICYM(new Potion(new int[] {4842, 4844, 4846, 4848}, new MultiEffect(new SetAttributeEffect("disease:immunity", 300), new RemoveTimerEffect("disease")))),
|
||||
AGILITY(new Potion(new int[] {3032, 3034, 3036, 3038}, new SkillEffect(Skills.AGILITY, 3, 0))),
|
||||
HUNTER(new Potion(new int[] {9998, 10000, 10002, 10004}, new SkillEffect(Skills.HUNTER, 3, 0))),
|
||||
RESTORE(new Potion(new int[] {2430, 127, 129, 131}, new RestoreEffect(10, 0.3))),
|
||||
SARA_BREW(new Potion(new int[] {6685, 6687, 6689, 6691}, new MultiEffect(new PercentHeal(0, .15), new SkillEffect(Skills.ATTACK, 0, -0.10), new SkillEffect(Skills.STRENGTH, 0, -0.10), new SkillEffect(Skills.MAGIC, 0, -0.10), new SkillEffect(Skills.RANGE, 0, -0.10), new SkillEffect(Skills.DEFENCE, 0, 0.25)))),
|
||||
SARA_BREW(new Potion(new int[] {6685, 6687, 6689, 6691}, new MultiEffect(new PercentHeal(2, .15), new SkillEffect(Skills.ATTACK, 0, -0.10), new SkillEffect(Skills.STRENGTH, 0, -0.10), new SkillEffect(Skills.MAGIC, 0, -0.10), new SkillEffect(Skills.RANGE, 0, -0.10), new SkillEffect(Skills.DEFENCE, 2, 0.2)))),
|
||||
SUMMONING(new Potion(new int[] {12140, 12142, 12144, 12146}, new MultiEffect(new RestoreSummoningSpecial(), new SummoningEffect(7, 0.25)))),
|
||||
COMBAT(new Potion(new int[] {9739, 9741, 9743, 9745}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 3, .1), new SkillEffect(Skills.ATTACK, 3, .1)))),
|
||||
ENERGY(new Potion(new int[] {3008, 3010, 3012, 3014}, new EnergyEffect(10))),
|
||||
ENERGY(new Potion(new int[] {3008, 3010, 3012, 3014}, new MultiEffect(new EnergyEffect(10), new HealingEffect(3)))),
|
||||
FISHING(new Potion(new int[] {2438, 151, 153, 155}, new SkillEffect(Skills.FISHING, 3, 0))),
|
||||
PRAYER(new Potion(new int[] {2434, 139, 141, 143}, new PrayerEffect(7, 0.25))),
|
||||
SUPER_RESTO(new Potion(new int[] {3024, 3026, 3028, 3030}, new RestoreEffect(8, 0.25, true))),
|
||||
ZAMMY_BREW(new Potion(new int[] {2450, 189, 191, 193}, new MultiEffect(new DamageEffect(10, true), new SkillEffect(Skills.ATTACK, 0, 0.25), new SkillEffect(Skills.STRENGTH, 0, 0.15), new SkillEffect(Skills.DEFENCE, 0, -0.1)))),
|
||||
ANTIFIRE(new Potion(new int[] {2452, 2454, 2456, 2458}, new AddTimerEffect("dragonfire:immunity", 600, true))),
|
||||
SUPER_RESTO(new Potion(new int[] {3024, 3026, 3028, 3030}, new MultiEffect(new RestoreEffect(8, 0.25), new PrayerEffect(8, 0.25), new SummoningEffect(8, 0.25)))),
|
||||
ZAMMY_BREW(new Potion(new int[] {2450, 189, 191, 193}, new MultiEffect(new DamageEffect(10, true), new SkillEffect(Skills.ATTACK, 0, 0.15), new SkillEffect(Skills.STRENGTH, 0, 0.25), new SkillEffect(Skills.DEFENCE, 0, -0.1), new RandomPrayerEffect(0, 10)))),
|
||||
ANTIFIRE(new Potion(new int[] {2452, 2454, 2456, 2458}, new SetAttributeEffect("fire:immune", 600, true))),
|
||||
GUTH_REST(new Potion(new int[] {4417, 4419, 4421, 4423}, new MultiEffect(new RemoveTimerEffect("poison"), new EnergyEffect(5), new HealingEffect(5)))),
|
||||
MAGIC_ESS(new Potion(new int[] {11491, 11489}, new SkillEffect(Skills.MAGIC,3,0))),
|
||||
SANFEW(new Potion(new int[] {10925, 10927, 10929, 10931}, new MultiEffect(new RestoreEffect(8,0.25, true), new AddTimerEffect("poison:immunity", secondsToTicks(90)), new RemoveTimerEffect("disease")))),
|
||||
SANFEW(new Potion(new int[] {10925, 10927, 10929, 10931}, new MultiEffect(new RestoreEffect(8,0.25), new PrayerEffect(8,0.25), new RemoveTimerEffect("poison"), new RemoveTimerEffect("disease")))),
|
||||
SUPER_ENERGY(new Potion(new int[] {3016, 3018, 3020, 3022}, new EnergyEffect(20))),
|
||||
BLAMISH_OIL(new FakeConsumable(1582, new String[] {"You know... I'd really rather not."})),
|
||||
|
||||
/** Barbarian Mixes */
|
||||
PRAYERMIX(new BarbarianMix(new int[] {11465, 11467}, new MultiEffect(new PrayerEffect(7, 0.25), new HealingEffect(6)))),
|
||||
ZAMMY_MIX(new BarbarianMix(new int[] {11521, 11523}, new MultiEffect(new DamageEffect(10, true), new SkillEffect(Skills.ATTACK, 0, 0.15), new SkillEffect(Skills.STRENGTH, 0, 0.25), new SkillEffect(Skills.DEFENCE, 0, -0.1)))),
|
||||
ZAMMY_MIX(new BarbarianMix(new int[] {11521, 11523}, new MultiEffect(new DamageEffect(10, true), new SkillEffect(Skills.ATTACK, 0, 0.15), new SkillEffect(Skills.STRENGTH, 0, 0.25), new SkillEffect(Skills.DEFENCE, 0, -0.1), new RandomPrayerEffect(0, 10)))),
|
||||
ATT_MIX(new BarbarianMix(new int[] {11429, 11431}, new MultiEffect(new SkillEffect(Skills.ATTACK, 3, 0.1), new HealingEffect(3)))),
|
||||
ANTIP_MIX(new BarbarianMix(new int[] {11433, 11435}, new MultiEffect(new AddTimerEffect("poison:immunity", secondsToTicks(90)), new HealingEffect(3)))),
|
||||
RELIC_MIX(new BarbarianMix(new int[] {11437, 11439}, new MultiEffect(new CureDiseaseEffect(), new HealingEffect(3)))),
|
||||
RELIC_MIX(new BarbarianMix(new int[] {11437, 11439}, new MultiEffect(new RemoveTimerEffect("disease"), new SetAttributeEffect("disease:immunity", 300), new HealingEffect(3)))),
|
||||
STR_MIX(new BarbarianMix(new int[] {11443, 11441}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 3, 0.1), new HealingEffect(3)))),
|
||||
RESTO_MIX(new BarbarianMix(new int[] {11449, 11451}, new MultiEffect(new RestoreEffect(10, 0.3), new HealingEffect(3)))),
|
||||
SUPER_RESTO_MIX(new BarbarianMix(new int [] {11493, 11495}, new MultiEffect(new RestoreEffect(8,0.25), new PrayerEffect(8, 0.25), new SummoningEffect(8, 0.25), new HealingEffect(6)))),
|
||||
ENERGY_MIX(new BarbarianMix(new int[] {11453, 11455}, new MultiEffect(new EnergyEffect(10), new HealingEffect(3)))),
|
||||
ENERGY_MIX(new BarbarianMix(new int[] {11453, 11455}, new MultiEffect(new EnergyEffect(10), new HealingEffect(6)))),
|
||||
DEF_MIX(new BarbarianMix(new int[] {11457, 11459}, new MultiEffect(new SkillEffect(Skills.DEFENCE, 3, 0.1), new HealingEffect(6)))),
|
||||
AGIL_MIX(new BarbarianMix(new int[] {11461, 11463}, new MultiEffect(new SkillEffect(Skills.AGILITY, 3, 0), new HealingEffect(6)))),
|
||||
COMBAT_MIX(new BarbarianMix(new int[] {11445, 11447}, new MultiEffect(new SkillEffect(Skills.ATTACK, 3, 0.1), new SkillEffect(Skills.STRENGTH, 3, 0.1), new HealingEffect(6)))),
|
||||
|
|
@ -367,7 +367,6 @@ public enum Consumables {
|
|||
SUPER_STR_MIX(new BarbarianMix(new int[] {11485, 11487}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 5, 0.15), new HealingEffect(6)))),
|
||||
ANTIDOTE_PLUS_MIX(new BarbarianMix(new int[] {11501, 11503}, new MultiEffect(new AddTimerEffect("poison:immunity", minutesToTicks(9)), new RandomHealthEffect(3, 7)))),
|
||||
ANTIP_SUPERMIX(new BarbarianMix(new int[] {11473, 11475}, new MultiEffect(new AddTimerEffect("poison:immunity", minutesToTicks(6)), new RandomHealthEffect(3, 7)))),
|
||||
ANTIFIRE_MIX(new BarbarianMix(new int[] {11505, 11507}, new MultiEffect(new AddTimerEffect("dragonfire:immunity", 600, true), new RandomHealthEffect(3, 7)))),
|
||||
|
||||
/** Stealing creation potions */
|
||||
SC_PRAYER(new Potion(new int[] {14207, 14209, 14211, 14213, 14215}, new PrayerEffect(7, 0.25))),
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
package content.data.consumables.effects
|
||||
|
||||
import core.api.*
|
||||
import core.game.consumable.ConsumableEffect
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.system.timer.impl.Disease
|
||||
|
||||
class CureDiseaseEffect () : ConsumableEffect() {
|
||||
override fun activate (p: Player) {
|
||||
val existingTimer = getTimer<Disease>(p)
|
||||
if (existingTimer != null) {
|
||||
existingTimer.hitsLeft -= 9
|
||||
if (existingTimer.hitsLeft <= 0) {
|
||||
sendMessage(p, "The disease has been cured.")
|
||||
removeTimer<Disease>(p)
|
||||
}else{
|
||||
sendMessage(p,"You feel slightly better.")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -6,37 +6,21 @@ import core.game.node.entity.skill.Skills;
|
|||
|
||||
public class RestoreEffect extends ConsumableEffect {
|
||||
double base,bonus;
|
||||
boolean all_skills; // Except for hitpoints
|
||||
public RestoreEffect(double base, double bonus){
|
||||
this.base = base;
|
||||
this.bonus = bonus;
|
||||
this.all_skills = false;
|
||||
}
|
||||
|
||||
public RestoreEffect(double base, double bonus, boolean all_skills){
|
||||
this.base = base;
|
||||
this.bonus = bonus;
|
||||
this.all_skills = all_skills;
|
||||
}
|
||||
final int[] SKILLS = new int[] { Skills.DEFENCE, Skills.ATTACK, Skills.STRENGTH, Skills.MAGIC, Skills.RANGE };
|
||||
final int[] ALL_SKILLS = new int[]{
|
||||
Skills.ATTACK,Skills.DEFENCE, Skills.STRENGTH,Skills.RANGE,Skills.PRAYER,Skills.MAGIC, Skills.COOKING,
|
||||
Skills.WOODCUTTING,Skills.FLETCHING,Skills.FISHING,Skills.FIREMAKING,Skills.CRAFTING,Skills.SMITHING,
|
||||
Skills.MINING,Skills.HERBLORE,Skills.AGILITY,Skills.THIEVING,Skills.SLAYER,Skills.FARMING,
|
||||
Skills.RUNECRAFTING,Skills.HUNTER,Skills.CONSTRUCTION,Skills.SUMMONING };
|
||||
@Override
|
||||
public void activate(Player p) {
|
||||
Skills sk = p.getSkills();
|
||||
int[] skills = this.all_skills ? ALL_SKILLS : SKILLS;
|
||||
for(int skill : skills){
|
||||
for(int skill : SKILLS){
|
||||
int statL = sk.getStaticLevel(skill);
|
||||
int boost = (int) (base + (statL * bonus));
|
||||
int curL = sk.getLevel(skill);
|
||||
if(curL < statL){
|
||||
int boost = (int) (base + (statL * bonus));
|
||||
p.getSkills().updateLevel(skill, boost, statL);
|
||||
}
|
||||
if (skill == Skills.PRAYER)
|
||||
p.getSkills().incrementPrayerPoints(boost);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ class ChampionChallengeListener : InteractionListener, MapArea {
|
|||
)
|
||||
|
||||
private val PORTCULLIS = Scenery.PORTCULLIS_10553
|
||||
private val LADDER = Scenery.LADDER_10554
|
||||
private val CHAMPION_STATUE_CLOSED = Scenery.CHAMPION_STATUE_10556
|
||||
private val CHAMPION_STATUE_OPEN = Scenery.CHAMPION_STATUE_10557
|
||||
private val TRAPDOOR_CLOSED = Scenery.TRAPDOOR_10558
|
||||
|
|
@ -123,13 +124,6 @@ class ChampionChallengeListener : InteractionListener, MapArea {
|
|||
private val ARENA_ZONE = 12696
|
||||
|
||||
override fun defineListeners() {
|
||||
// Champion's Guild Basement Ladder to Main Floor
|
||||
addClimbDest(Location(3190, 9758, 0), Location(3190, 3356, 0))
|
||||
// Champion Statue Ladder to Arena
|
||||
addClimbDest(Location(3184, 9758, 0), Location(3182, 9758, 0))
|
||||
// Arena Ladder to Champion's Guild Basement
|
||||
addClimbDest(Location(3183, 9758, 0), Location(3185, 9758, 0))
|
||||
|
||||
on(LARXUS, IntType.NPC, "talk-to") { player, _ ->
|
||||
openDialogue(player, LarxusDialogue(false))
|
||||
return@on true
|
||||
|
|
@ -140,18 +134,18 @@ class ChampionChallengeListener : InteractionListener, MapArea {
|
|||
return@on true
|
||||
}
|
||||
|
||||
onUseWith(IntType.NPC, ChampionScrollsDropHandler.SCROLLS, NPCs.LARXUS_3050) { player, _, _ ->
|
||||
openDialogue(player, LarxusDialogue(true))
|
||||
return@onUseWith true
|
||||
}
|
||||
|
||||
on(TRAPDOOR_CLOSED, IntType.SCENERY, "open") { _, node ->
|
||||
replaceScenery(node.asScenery(), TRAPDOOR_OPEN, 100, node.location)
|
||||
return@on true
|
||||
}
|
||||
|
||||
onUseWith(IntType.NPC, ChampionScrollsDropHandler.SCROLLS, NPCs.LARXUS_3050) { player, _, _ ->
|
||||
openDialogue(player, LarxusDialogue(true))
|
||||
return@onUseWith true
|
||||
}
|
||||
|
||||
on(TRAPDOOR_OPEN, IntType.SCENERY, "close") { _, node ->
|
||||
replaceScenery(node.asScenery(), TRAPDOOR_CLOSED, -1, node.location)
|
||||
replaceScenery(node.asScenery(), TRAPDOOR_CLOSED, 100, node.location)
|
||||
return@on true
|
||||
}
|
||||
|
||||
|
|
@ -160,6 +154,15 @@ class ChampionChallengeListener : InteractionListener, MapArea {
|
|||
return@on true
|
||||
}
|
||||
|
||||
on(LADDER, IntType.SCENERY, "climb-up") { player, _ ->
|
||||
teleport(player, Location.create(3185, 9758, 0))
|
||||
return@on true
|
||||
}
|
||||
on(CHAMPION_STATUE_OPEN, IntType.SCENERY, "climb-down") { player, _ ->
|
||||
teleport(player, Location.create(3182, 9758, 0))
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(PORTCULLIS, IntType.SCENERY, "open") { player, node ->
|
||||
if (player.getAttribute("championsarena:start", false) == false) {
|
||||
sendNPCDialogue(player, NPCs.LARXUS_3050, "You need to arrange a challenge with me before you enter the arena.")
|
||||
|
|
@ -226,4 +229,4 @@ class ChampionChallengeListener : InteractionListener, MapArea {
|
|||
ZoneRestriction.RANDOM_EVENTS
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,13 +11,12 @@ import core.ServerStore.Companion.getString
|
|||
|
||||
import content.global.bots.ShootingStarBot
|
||||
import core.game.world.repository.Repository
|
||||
import core.tools.RandomFunction
|
||||
|
||||
/**
|
||||
* Represents a shooting star object (Only ever initialized once) (ideally)
|
||||
* @author Ceikry
|
||||
*/
|
||||
class ShootingStar(var level: ShootingStarType = ShootingStarType.values().random()) {
|
||||
class ShootingStar(var level: ShootingStarType = ShootingStarType.values().random()){
|
||||
val crash_locations = mapOf(
|
||||
"East of Dark Wizards' Tower" to Location.create(2925, 3339, 0), // East of Dark Wizards' Tower
|
||||
"Crafting Guild" to Location.create(2940, 3280, 0), // Crafting Guild Mine
|
||||
|
|
@ -27,12 +26,12 @@ class ShootingStar(var level: ShootingStarType = ShootingStarType.values().rando
|
|||
"Brimhaven mining site" to Location.create(2743, 3143, 0), // Brimhaven mining site
|
||||
"South Crandor mining site" to Location.create(2822, 3239, 0), // South Crandor mining site (requires Dragon Slayer)
|
||||
"Karamja mining site" to Location.create(2854, 3032, 0), // Karamja mining site
|
||||
"Shilo Village mining site" to Location.create(2826, 2997, 0), // Shilo Village mining site/Gem rocks (requires Shilo Village prereqs)
|
||||
"Shilo Village mining site" to Location.create(2826, 2997, 0), // Shilo Village mining site/Gem rocks
|
||||
"Relleka mining site" to Location.create(2682, 3700, 0), // Rellekka mining site
|
||||
"Jatizso mine" to Location.create(2393, 3815, 0), //Jatiszo mining site (requires Fremennik Isles prereqs)
|
||||
"Lunar Isle mine" to Location.create(2140, 3939, 0), // Lunar Isle mine (requires Lunar Diplomacy prereqs)
|
||||
"Miscellania coal mine" to Location.create(2529, 3887, 0), // Miscellania coal mine (requires The Fremennik Trials)
|
||||
//"Neitiznot runite mine" to Location.create(2376, 3835, 0), // Near the Neitiznot runite mine (requires Fremennik Isles prereqs) currently inaccessible as bridge does not work
|
||||
"Jatizso mine" to Location.create(2393, 3815, 0), //Jatiszo mining site (requires Fremennik Trials)
|
||||
//"Lunar Isle mine" to Location.create(2140, 3939, 0), // Lunar Isle mine (requires Lunar Diplomacy?)
|
||||
//"Miscellania coal mine" to Location.create(2529, 3887, 0), // Miscellania coal mine (requires Fremennik Trials)
|
||||
//"Neitiznot runite mine" to Location.create(2376, 3835, 0), // Near the Neitiznot runite mine (requires Fremennik Trials) currently inaccessible as bridge does not work
|
||||
"Ardougne mining site" to Location.create(2600, 3232, 0), // Ardougne mining site (Monastery)
|
||||
"Ardougne eastern mine" to Location.create(2706, 3334, 0), // Ardougne mining site (Legends Guild)
|
||||
"Kandarin Coal trucks" to Location.create(2589, 3485, 0), // Kandarin Coal trucks
|
||||
|
|
@ -49,11 +48,11 @@ class ShootingStar(var level: ShootingStarType = ShootingStarType.values().rando
|
|||
"South-west Varrock mine" to Location.create(3176, 3362, 0), // South-west Varrock mine / Champion's Guild mine
|
||||
"Varrock east bank" to Location.create(3259, 3407, 0), // Varrock east bank / Rune shop
|
||||
"Lumbridge Swamp south-east mine" to Location.create(3227, 3150, 0), // Lumbridge Swamp south-east mine
|
||||
//"Burgh de Rott bank" to Location.create(3500, 3219, 0), // Burgh de Rott bank (requires quest to enter)
|
||||
//"Burgh de Rott bank" to Location.create(3500, 3219, 0), // Burgh de Rott bank (requires Quest to enter)
|
||||
"Canifis Bank" to Location.create(3504, 3487, 0), // Canifis bank
|
||||
"Mos Le'Harmless bank" to Location.create(3687, 2969, 0), // Mos Le'Harmless bank (requires quest to enter but is currently accessible for Slayer)
|
||||
"Mos Le'Harmless bank" to Location.create(3687, 2969, 0), // Mos Le'Harmless bank (requires Quest to enter but is currently accessible for Slayer)
|
||||
"Gnome stronghold Bank" to Location.create(2460, 3432, 0), // Gnome stronghold bank
|
||||
"Lletya bank" to Location.create(2329, 3163, 0), // Lletya bank (requires MEP1 prereqs)
|
||||
"Lletya bank" to Location.create(2329, 3163, 0), // Lletya bank (requires Roving Elves?)
|
||||
"Piscatoris mining site" to Location.create(2336, 3636, 0), // Piscatoris mining site
|
||||
"North Edgeville mining site" to Location.create(3101, 3569, 0), // Wilderness Steel mine / Zamorak mage mine
|
||||
"Southern wilderness mine" to Location.create(3025, 3591, 0), // Wilderness skeleton mine
|
||||
|
|
@ -80,15 +79,22 @@ class ShootingStar(var level: ShootingStarType = ShootingStarType.values().rando
|
|||
* Degrades a ShootingStar (or removes the starObject and spawns a Star Sprite if it's the last star)
|
||||
*/
|
||||
fun degrade() {
|
||||
if(level.ordinal == 0) {
|
||||
spawnSprite()
|
||||
if(level.ordinal == 0){
|
||||
selfBots.filter { it.isMining() }.forEach { it.sleep() }
|
||||
SceneryBuilder.remove(starObject)
|
||||
isSpawned = false
|
||||
starSprite.location = starObject.location
|
||||
starSprite.init()
|
||||
spriteSpawned = true
|
||||
ShootingStarPlugin.getStoreFile().clear()
|
||||
return
|
||||
}
|
||||
level = getNextType()
|
||||
maxDust = level.totalStardust
|
||||
dustLeft = level.totalStardust
|
||||
|
||||
ShootingStarPlugin.getStoreFile()["level"] = level.ordinal
|
||||
ShootingStarPlugin.getStoreFile()["dustLeft"] = dustLeft
|
||||
ShootingStarPlugin.getStoreFile()["isDiscovered"] = isDiscovered
|
||||
|
||||
val newStar = Scenery(level.objectId, starObject.location)
|
||||
SceneryBuilder.replace(starObject, newStar)
|
||||
|
|
@ -104,6 +110,7 @@ class ShootingStar(var level: ShootingStarType = ShootingStarType.values().rando
|
|||
*/
|
||||
fun fire() {
|
||||
SceneryBuilder.remove(starObject)
|
||||
rebuildVars()
|
||||
clearSprite()
|
||||
SceneryBuilder.add(starObject)
|
||||
if(!isSpawned) {
|
||||
|
|
@ -116,54 +123,37 @@ class ShootingStar(var level: ShootingStarType = ShootingStarType.values().rando
|
|||
}
|
||||
isSpawned = true
|
||||
Repository.sendNews("A shooting star level ${level.ordinal + 1} just crashed near ${location}!")
|
||||
ShootingStarPlugin.getStoreFile()["level"] = level.ordinal
|
||||
ShootingStarPlugin.getStoreFile()["location"] = location
|
||||
ShootingStarPlugin.getStoreFile()["isDiscovered"] = isDiscovered
|
||||
ShootingStarPlugin.getStoreFile()["dustLeft"] = dustLeft
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebuilds some of the variables with new information.
|
||||
*/
|
||||
fun rebuildVars(){
|
||||
// Defaults
|
||||
var levelOrd = RandomFunction.random(9)
|
||||
level = ShootingStarType.values()[levelOrd]
|
||||
location = crash_locations.entries.random().key
|
||||
isDiscovered = false
|
||||
dustLeft = level.totalStardust
|
||||
ticks = 0
|
||||
spriteSpawned = false
|
||||
|
||||
if (firstStar && ShootingStarPlugin.getStoreFile().isNotEmpty()) {
|
||||
// Replace default with stored values, if any
|
||||
levelOrd = ShootingStarPlugin.getStoreFile().getInt("level", levelOrd)
|
||||
level = ShootingStarType.values()[levelOrd]
|
||||
location = ShootingStarPlugin.getStoreFile().getString("location", location)
|
||||
isDiscovered = ShootingStarPlugin.getStoreFile().getBoolean("isDiscovered", false)
|
||||
dustLeft = ShootingStarPlugin.getStoreFile().getInt("dustLeft", dustLeft)
|
||||
ticks = ShootingStarPlugin.getStoreFile().getInt("ticks", ticks)
|
||||
spriteSpawned = ShootingStarPlugin.getStoreFile().getBoolean("spriteSpawned", false)
|
||||
if(firstStar && ShootingStarPlugin.getStoreFile().isNotEmpty()){
|
||||
level = ShootingStarType.values()[ShootingStarPlugin.getStoreFile().getInt("level")]
|
||||
location = ShootingStarPlugin.getStoreFile().getString("location")
|
||||
isDiscovered = ShootingStarPlugin.getStoreFile().getBoolean("isDiscovered")
|
||||
} else {
|
||||
level = ShootingStarType.values().random()
|
||||
location = crash_locations.entries.random().key
|
||||
isDiscovered = false
|
||||
}
|
||||
|
||||
maxDust = level.totalStardust
|
||||
dustLeft = level.totalStardust
|
||||
starObject = Scenery(level.objectId, crash_locations.get(location))
|
||||
}
|
||||
|
||||
fun spawnSprite() {
|
||||
selfBots.filter { it.isMining() }.forEach { it.sleep() }
|
||||
SceneryBuilder.remove(starObject)
|
||||
isSpawned = false
|
||||
starSprite.location = starObject.location
|
||||
starSprite.init()
|
||||
spriteSpawned = true
|
||||
ShootingStarPlugin.getStoreFile()["spriteSpawned"] = spriteSpawned
|
||||
ShootingStarPlugin.getStoreFile()["level"] = level.ordinal
|
||||
ShootingStarPlugin.getStoreFile()["location"] = location
|
||||
ShootingStarPlugin.getStoreFile()["isDiscovered"] = false
|
||||
|
||||
ticks = 0
|
||||
firstStar = false
|
||||
}
|
||||
|
||||
fun clearSprite() {
|
||||
starSprite.clear()
|
||||
spriteSpawned = false
|
||||
ShootingStarPlugin.getStoreFile()["spriteSpawned"] = spriteSpawned
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -171,7 +161,6 @@ class ShootingStar(var level: ShootingStarType = ShootingStarType.values().rando
|
|||
*/
|
||||
fun decDust() {
|
||||
if(--dustLeft <= 0) degrade()
|
||||
ShootingStarPlugin.getStoreFile()["dustLeft"] = dustLeft
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -48,10 +48,9 @@ class ShootingStarMiningPulse(player: Player?, node: Scenery?, val star: Shootin
|
|||
val bonusXp = 75 * player.skills.getStaticLevel(Skills.MINING)
|
||||
player.incrementAttribute("/save:shooting-star:bonus-xp", bonusXp)
|
||||
Repository.sendNews(player.username + " is the discoverer of the crashed star near " + star.location + "!")
|
||||
player.sendMessage("You have ${player.skills.experienceMultiplier * player.getAttribute("shooting-star:bonus-xp", 0).toDouble()} bonus xp towards mining stardust.")
|
||||
player.sendMessage("You have ${player.skills.experienceMutiplier * player.getAttribute("shooting-star:bonus-xp", 0).toDouble()} bonus xp towards mining stardust.")
|
||||
ShootingStarPlugin.submitScoreBoard(player)
|
||||
star.isDiscovered = true
|
||||
ShootingStarPlugin.getStoreFile()["isDiscovered"] = star.isDiscovered
|
||||
return player.skills.getLevel(Skills.MINING) >= star.miningLevel
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,11 +12,11 @@ import core.ServerStore.Companion.getBoolean
|
|||
import core.game.dialogue.DialogueFile
|
||||
import core.game.interaction.InteractionListener
|
||||
import core.game.interaction.IntType
|
||||
import core.tools.SystemLogger
|
||||
import core.game.system.command.Privilege
|
||||
import core.game.world.GameWorld
|
||||
import core.tools.Log
|
||||
import core.tools.secondsToTicks
|
||||
import content.data.Quests
|
||||
|
||||
class ShootingStarPlugin : LoginListener, InteractionListener, TickListener, Commands, StartupListener {
|
||||
override fun login(player: Player) {
|
||||
|
|
@ -27,30 +27,14 @@ class ShootingStarPlugin : LoginListener, InteractionListener, TickListener, Com
|
|||
override fun tick() {
|
||||
++star.ticks
|
||||
|
||||
// Check if the current star sprite should expire
|
||||
val maxDelay = tickDelay + (tickDelay / 3)
|
||||
if(star.ticks > maxDelay && star.spriteSpawned){
|
||||
star.clearSprite()
|
||||
}
|
||||
|
||||
if (star.firstStar && !star.isSpawned && !star.spriteSpawned) {
|
||||
// Apparently, the server has only just booted
|
||||
star.rebuildVars()
|
||||
if (star.spriteSpawned) {
|
||||
star.spawnSprite()
|
||||
} else {
|
||||
star.fire()
|
||||
}
|
||||
star.firstStar = false
|
||||
}
|
||||
|
||||
// Check if it's time to fire a new one
|
||||
if (star.ticks >= tickDelay && !star.spriteSpawned) {
|
||||
star.rebuildVars()
|
||||
if ((star.ticks >= tickDelay && !star.spriteSpawned) || (!star.isSpawned && !star.spriteSpawned)) {
|
||||
star.fire()
|
||||
}
|
||||
|
||||
getStoreFile()["ticks"] = star.ticks
|
||||
}
|
||||
|
||||
override fun defineListeners() {
|
||||
|
|
@ -82,52 +66,35 @@ class ShootingStarPlugin : LoginListener, InteractionListener, TickListener, Com
|
|||
return@on true
|
||||
}
|
||||
|
||||
class RingDialogue(val star: ShootingStar) : DialogueFile() {
|
||||
val shouldWarn = when (star.location) {
|
||||
"North Edgeville mining site",
|
||||
"Southern wilderness mine",
|
||||
"Wilderness hobgoblin mine",
|
||||
"Pirates' Hideout mine",
|
||||
"Lava Maze mining site",
|
||||
"Mage Arena bank" -> true
|
||||
else -> false
|
||||
}
|
||||
|
||||
override fun handle(componentID: Int, buttonID: Int) {
|
||||
fun teleportToStar(player: Player) {
|
||||
val condition: (p: Player) -> Boolean = when (star.location.toLowerCase()) {
|
||||
"canifis bank" -> {p -> requireQuest(p, Quests.PRIEST_IN_PERIL, "to access this.")}
|
||||
//"burgh de rott bank" -> {p -> hasRequirement(p, Quests.IN_AID_OF_THE_MYREQUE)} //disabled: crash
|
||||
"crafting guild" -> {p -> hasLevelStat(p, Skills.CRAFTING, 40)}
|
||||
"lletya bank" -> {p -> hasRequirement(p, Quests.MOURNINGS_END_PART_I)}
|
||||
"jatizso mine" -> {p -> hasRequirement(p, Quests.THE_FREMENNIK_ISLES)}
|
||||
"south crandor mining site" -> {p -> hasRequirement(p, Quests.DRAGON_SLAYER)}
|
||||
"shilo village mining site" -> {p -> hasRequirement(p, Quests.SHILO_VILLAGE)}
|
||||
"mos le'harmless bank" -> {p -> hasRequirement(p, Quests.CABIN_FEVER)} //needs to be updated to check for completion when the quest releases; https://runescape.wiki/w/Mos_Le%27Harmless?oldid=913025
|
||||
"lunar isle mine" -> {p -> hasRequirement(p, Quests.LUNAR_DIPLOMACY)}
|
||||
"miscellania coal mine" -> {p -> requireQuest(p, Quests.THE_FREMENNIK_TRIALS, "to access this.")}
|
||||
//"neitiznot runite mine" -> {p -> hasRequirement(p, Quests.THE_FREMENNIK_ISLES)} //disabled: currently not reachable
|
||||
else -> {_ -> true}
|
||||
}
|
||||
if (!condition.invoke(player)) {
|
||||
sendDialogue(player,"Magical forces prevent your teleportation.")
|
||||
} else if (teleport(player, star.crash_locations[star.location]!!.transform(0, -1, 0), TeleportManager.TeleportType.MINIGAME)) {
|
||||
getRingStoreFile()[player.username.toLowerCase()] = true
|
||||
}
|
||||
}
|
||||
when (stage) {
|
||||
0 -> dialogue(if (star.spriteSpawned) "The star sprite has already been freed." else "The star sprite is still trapped.").also { if (shouldWarn) stage++ else stage += 2 }
|
||||
1 -> dialogue("WARNING: The star is located in the wilderness.").also { stage++ }
|
||||
2 -> player.dialogueInterpreter.sendOptions("Teleport to the star?", "Yes", "No").also { stage++ }
|
||||
3 -> when (buttonID) {
|
||||
1 -> end().also { teleportToStar(player) }
|
||||
2 -> end()
|
||||
}
|
||||
}
|
||||
}
|
||||
val condition: (Player) -> Boolean = when(star.location.toLowerCase()){
|
||||
"canifis bank" -> { p -> hasRequirement(p, "Priest in Peril") }
|
||||
//"Burgh de Rott bank" -> { p -> p.questRepository.isComplete("Priest in Peril")} // for now, require this as it is in Morytania. remove when appropriate quests added - Crash
|
||||
"crafting guild" -> {p -> hasLevelStat(p, Skills.CRAFTING, 40) }
|
||||
"lletya bank" -> {p -> hasRequirement(p, "Mourning's End Part I") }
|
||||
"jatizso mine" -> {p -> hasRequirement(player, "Fremennik Trials") }
|
||||
"south crandor mining site" -> {p -> hasRequirement(p, "Dragon Slayer") }
|
||||
"shilo village mining site" -> {p -> hasRequirement(p, "Shilo Village") }
|
||||
"mos le'harmless bank" -> {p -> hasRequirement(p, "Cabin Fever") }
|
||||
else -> {_ -> true}
|
||||
}
|
||||
|
||||
openDialogue(player, RingDialogue(star))
|
||||
if(!condition.invoke(player)){
|
||||
sendDialogue(player, "Magical forces prevent your teleportation.")
|
||||
return@on true
|
||||
}
|
||||
|
||||
val shouldWarn = when(star.location){
|
||||
"North Edgeville mining site",
|
||||
"Southern wilderness mine",
|
||||
"Wilderness hobgoblin mine",
|
||||
"Pirates' Hideout mine",
|
||||
"Lava Maze mining site",
|
||||
"Mage Arena bank" -> true
|
||||
else -> false
|
||||
}
|
||||
|
||||
openDialogue(player, RingDialogue(shouldWarn, star))
|
||||
|
||||
return@on true
|
||||
}
|
||||
}
|
||||
|
|
@ -138,7 +105,6 @@ class ShootingStarPlugin : LoginListener, InteractionListener, TickListener, Com
|
|||
}
|
||||
|
||||
define("submit", Privilege.ADMIN) { _, _ ->
|
||||
star.rebuildVars()
|
||||
star.fire()
|
||||
}
|
||||
|
||||
|
|
@ -153,6 +119,26 @@ class ShootingStarPlugin : LoginListener, InteractionListener, TickListener, Com
|
|||
|
||||
private data class ScoreboardEntry(val player: String, val time: Int)
|
||||
|
||||
private class RingDialogue(val shouldWarn: Boolean, val star: ShootingStar) : DialogueFile(){
|
||||
override fun handle(componentID: Int, buttonID: Int) {
|
||||
when (stage) {
|
||||
0 -> dialogue(if (star.spriteSpawned) "The star sprite has already been freed." else "The star sprite is still trapped.").also { if (shouldWarn) stage++ else stage += 2 }
|
||||
1 -> dialogue("WARNING: The star is located in the wilderness.").also { stage++ }
|
||||
2 -> player!!.dialogueInterpreter.sendOptions("Teleport to the star?", "Yes", "No").also { stage++ }
|
||||
3 -> when (buttonID) {
|
||||
1 -> teleport(player!!, star).also { end() }
|
||||
2 -> end()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun teleport(player: Player, star: ShootingStar){
|
||||
if (teleport(player, star.crash_locations[star.location]!!.transform(0, -1, 0), TeleportManager.TeleportType.MINIGAME)) {
|
||||
getRingStoreFile()[player.username.toLowerCase()] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val star = ShootingStar()
|
||||
private val tickDelay = if(GameWorld.settings?.isDevMode == true) 200 else 25000
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ class StarSpriteDialogue(player: Player? = null) : core.game.dialogue.DialoguePl
|
|||
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
|
||||
when (stage) {
|
||||
0 -> {
|
||||
npc("I'm a star sprite! I was in my star in the sky, when it", "lost control and crashed into the ground. With half my", "star sticking into the ground, I became stuck.", "Fortunately, I was mined out by the kind creatures of")
|
||||
npc("I'm a star sprite! I Was in my star in the sky, when it", "lost control and crashed into the ground. With half my", "star sticking into the ground, I became stuck.", "Fortunately, I was mined out by the kind creatures of")
|
||||
stage++
|
||||
}
|
||||
1 -> {
|
||||
|
|
|
|||
|
|
@ -192,7 +192,7 @@ public abstract class ClueScrollPlugin extends MapZone implements Plugin<Object>
|
|||
int hasAmt = 0;
|
||||
for (int i = 0; i < equipment.length; i++) {
|
||||
for (int k = 0; k < equipment[i].length; k++) {
|
||||
if (player.getEquipment().contains(equipment[i][k], 1) || player.costumeRoomBank.contains(equipment[i][k], 1)) {
|
||||
if (player.getEquipment().contains(equipment[i][k], 1)) {
|
||||
hasAmt++;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,28 +0,0 @@
|
|||
package content.global.ame
|
||||
|
||||
import core.ServerConstants
|
||||
import core.api.*
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.node.entity.player.link.TeleportManager.TeleportType
|
||||
import core.game.world.map.Location
|
||||
|
||||
fun kidnapPlayer(player: Player, loc: Location, type: TeleportType) {
|
||||
setAttribute(player, "kidnapped-by-random", true)
|
||||
if (getAttribute(player, "/save:original-loc", null) == null) {
|
||||
setAttribute(player, "/save:original-loc", player.location)
|
||||
}
|
||||
teleport(player, loc, type)
|
||||
}
|
||||
|
||||
fun returnPlayer(player: Player) {
|
||||
// Prevent returning more than once and sending the player back to HOME_LOCATION
|
||||
if (getAttribute<Location?>(player, "kidnapped-by-random", null) == null) {
|
||||
return
|
||||
}
|
||||
|
||||
player.locks.unlockTeleport()
|
||||
val destination = getAttribute(player, "/save:original-loc", ServerConstants.HOME_LOCATION ?: Location.create(3222, 3218, 0))
|
||||
teleport(player, destination)
|
||||
unlock(player)
|
||||
removeAttributes(player, "/save:original-loc", "kidnapped-by-random")
|
||||
}
|
||||
|
|
@ -3,15 +3,9 @@ package content.global.ame
|
|||
import content.global.ame.events.MysteriousOldManNPC
|
||||
import core.api.playGlobalAudio
|
||||
import core.api.poofClear
|
||||
import core.api.sendMessage
|
||||
import core.api.utils.WeightBasedTable
|
||||
import core.game.interaction.MovementPulse
|
||||
import core.game.node.entity.Entity
|
||||
import core.game.node.entity.combat.CombatStyle
|
||||
import core.game.node.entity.impl.PulseType
|
||||
import core.game.node.entity.npc.NPC
|
||||
import core.game.node.entity.npc.agg.AggressiveBehavior
|
||||
import core.game.node.entity.npc.agg.AggressiveHandler
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.node.item.Item
|
||||
import core.game.world.map.Location
|
||||
|
|
@ -19,11 +13,10 @@ import core.game.world.map.RegionManager
|
|||
import core.game.world.map.path.Pathfinder
|
||||
import core.game.world.update.flag.context.Graphics
|
||||
import core.integrations.discord.Discord
|
||||
import core.api.utils.WeightBasedTable
|
||||
import core.tools.secondsToTicks
|
||||
import core.tools.ticksToCycles
|
||||
import org.rs09.consts.Sounds
|
||||
import kotlin.math.ceil
|
||||
import kotlin.math.min
|
||||
import kotlin.random.Random
|
||||
import kotlin.reflect.full.createInstance
|
||||
|
||||
|
|
@ -73,6 +66,7 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
|
|||
if (!player.getAttribute("random:pause", false)) {
|
||||
ticksLeft--
|
||||
}
|
||||
|
||||
if (!pulseManager.hasPulseRunning() && !finalized) {
|
||||
follow()
|
||||
}
|
||||
|
|
@ -93,11 +87,6 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
|
|||
location = spawnLocation
|
||||
player.setAttribute("re-npc", this)
|
||||
super.init()
|
||||
super.aggressiveHandler = AggressiveHandler(this, object : AggressiveBehavior() {
|
||||
override fun canSelectTarget(entity: Entity, target: Entity): Boolean {
|
||||
return target == player
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
open fun onTimeUp() {
|
||||
|
|
@ -129,19 +118,4 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
|
|||
}
|
||||
|
||||
abstract fun talkTo(npc: NPC)
|
||||
|
||||
override fun isAttackable(entity: Entity, style: CombatStyle, message: Boolean): Boolean {
|
||||
if (entity != player) {
|
||||
if (entity is Player) {
|
||||
sendMessage(entity, "It isn't interested in fighting you.") //TODO authentic message
|
||||
}
|
||||
return false
|
||||
}
|
||||
return super.isAttackable(entity, style, message)
|
||||
}
|
||||
|
||||
fun idForCombatLevel(ids: List<Int>, player: Player): Int {
|
||||
val index = min(ids.size, ceil(player.properties.currentCombatLevel / 20.0).toInt()) - 1
|
||||
return ids[index]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3,18 +3,15 @@ package content.global.ame
|
|||
import org.rs09.consts.Items
|
||||
import content.global.ame.events.MysteriousOldManNPC
|
||||
import content.global.ame.events.certer.CerterNPC
|
||||
import content.global.ame.events.drilldemon.SergeantDamienNPC
|
||||
import content.global.ame.events.drilldemon.SeargentDamienNPC
|
||||
import content.global.ame.events.drunkendwarf.DrunkenDwarfNPC
|
||||
import content.global.ame.events.evilbob.EvilBobNPC
|
||||
import content.global.ame.events.evilchicken.EvilChickenNPC
|
||||
import content.global.ame.events.freakyforester.FreakyForesterNPC
|
||||
import content.global.ame.events.maze.MazeNPC
|
||||
import content.global.ame.events.genie.GenieNPC
|
||||
import content.global.ame.events.pillory.PilloryNPC
|
||||
import content.global.ame.events.rickturpentine.RickTurpentineNPC
|
||||
import content.global.ame.events.rivertroll.RiverTrollRENPC
|
||||
import content.global.ame.events.rockgolem.RockGolemRENPC
|
||||
import content.global.ame.events.quizmaster.QuizMasterNPC
|
||||
import content.global.ame.events.sandwichlady.SandwichLadyRENPC
|
||||
import content.global.ame.events.shade.ShadeRENPC
|
||||
import content.global.ame.events.strangeplant.StrangePlantNPC
|
||||
|
|
@ -46,8 +43,7 @@ enum class RandomEvents(val npc: RandomEventNPC, val loot: WeightBasedTable? = n
|
|||
WeightedItem(Items.TOOTH_HALF_OF_A_KEY_985,1,1,0.1),
|
||||
WeightedItem(Items.LOOP_HALF_OF_A_KEY_987,1,1,0.1)
|
||||
)),
|
||||
MAZE(npc = MazeNPC()),
|
||||
DRILL_DEMON(npc = SergeantDamienNPC()),
|
||||
DRILL_DEMON(npc = SeargentDamienNPC()),
|
||||
EVIL_CHICKEN(npc = EvilChickenNPC()),
|
||||
STRANGE_PLANT(npc = StrangePlantNPC()),
|
||||
SWARM(npc = SwarmNPC()),
|
||||
|
|
@ -56,9 +52,7 @@ enum class RandomEvents(val npc: RandomEventNPC, val loot: WeightBasedTable? = n
|
|||
RICK_TURPENTINE(npc = RickTurpentineNPC(), loot = CERTER.loot),
|
||||
SURPRISE_EXAM(npc = MysteriousOldManNPC(), type = "sexam"),
|
||||
FREAKY_FORESTER(npc = FreakyForesterNPC(), skillIds = intArrayOf(Skills.WOODCUTTING)),
|
||||
PILLORY(npc = PilloryNPC(), skillIds = intArrayOf(Skills.THIEVING)),
|
||||
TREE_SPIRIT(npc = TreeSpiritRENPC(), skillIds = intArrayOf(Skills.WOODCUTTING)),
|
||||
QUIZ_MASTER(npc = QuizMasterNPC()),
|
||||
RIVER_TROLL(RiverTrollRENPC(), skillIds = intArrayOf(Skills.FISHING)),
|
||||
ROCK_GOLEM(RockGolemRENPC(), skillIds = intArrayOf(Skills.MINING)),
|
||||
SHADE(ShadeRENPC(), skillIds = intArrayOf(Skills.PRAYER)),
|
||||
|
|
|
|||
|
|
@ -1,19 +0,0 @@
|
|||
package content.global.ame.events
|
||||
|
||||
import core.game.node.entity.Entity
|
||||
import core.game.node.entity.npc.NPC
|
||||
import core.game.node.entity.npc.NPCBehavior
|
||||
import org.rs09.consts.NPCs
|
||||
|
||||
class HostileRandomEventBehavior : NPCBehavior(
|
||||
NPCs.EVIL_CHICKEN_2463, NPCs.EVIL_CHICKEN_2464, NPCs.EVIL_CHICKEN_2465, NPCs.EVIL_CHICKEN_2466, NPCs.EVIL_CHICKEN_2467, NPCs.EVIL_CHICKEN_2468,
|
||||
NPCs.RIVER_TROLL_391, NPCs.RIVER_TROLL_392, NPCs.RIVER_TROLL_393, NPCs.RIVER_TROLL_394, NPCs.RIVER_TROLL_395, NPCs.RIVER_TROLL_396,
|
||||
NPCs.ROCK_GOLEM_413, NPCs.ROCK_GOLEM_414, NPCs.ROCK_GOLEM_415, NPCs.ROCK_GOLEM_416, NPCs.ROCK_GOLEM_417, NPCs.ROCK_GOLEM_418,
|
||||
NPCs.SHADE_425, NPCs.SHADE_426, NPCs.SHADE_427, NPCs.SHADE_428, NPCs.SHADE_429, NPCs.SHADE_430, NPCs.SHADE_431,
|
||||
NPCs.TREE_SPIRIT_438, NPCs.TREE_SPIRIT_439, NPCs.TREE_SPIRIT_440, NPCs.TREE_SPIRIT_441, NPCs.TREE_SPIRIT_442, NPCs.TREE_SPIRIT_443,
|
||||
NPCs.ZOMBIE_419, NPCs.ZOMBIE_420, NPCs.ZOMBIE_421, NPCs.ZOMBIE_422, NPCs.ZOMBIE_423, NPCs.ZOMBIE_424
|
||||
) {
|
||||
override fun getXpMultiplier(self: NPC, attacker: Entity): Double {
|
||||
return super.getXpMultiplier(self, attacker) / 16.0
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
package content.global.ame.events
|
||||
|
||||
import core.game.node.entity.player.Player
|
||||
import content.global.ame.events.surpriseexam.SurpriseExamUtils
|
||||
import content.global.ame.events.supriseexam.SurpriseExamUtils
|
||||
import core.game.dialogue.DialogueFile
|
||||
import core.game.system.timer.impl.AntiMacro
|
||||
|
||||
|
|
@ -79,7 +79,7 @@ class DrillDemonListeners : InteractionListener, MapArea {
|
|||
}
|
||||
|
||||
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS, ZoneRestriction.OFF_MAP)
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS)
|
||||
}
|
||||
|
||||
override fun areaEnter(entity: Entity) {
|
||||
|
|
@ -90,4 +90,4 @@ class DrillDemonListeners : InteractionListener, MapArea {
|
|||
setComponentVisibility(entity.asPlayer(), 746, 12, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,11 +1,8 @@
|
|||
package content.global.ame.events.drilldemon
|
||||
|
||||
import content.global.ame.kidnapPlayer
|
||||
import content.global.ame.returnPlayer
|
||||
import core.api.*
|
||||
import core.game.interaction.QueueStrength
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.node.entity.player.link.TeleportManager
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
import core.game.world.update.flag.context.Animation
|
||||
|
|
@ -14,6 +11,7 @@ import org.rs09.consts.NPCs
|
|||
|
||||
object DrillDemonUtils {
|
||||
val DD_KEY_TASK = "/save:drilldemon:task"
|
||||
val DD_KEY_RETURN_LOC = "/save:drilldemon:original-loc"
|
||||
val DD_SIGN_VARP = 531
|
||||
val DD_SIGN_JOG = 0
|
||||
val DD_SIGN_SITUP = 1
|
||||
|
|
@ -25,7 +23,8 @@ object DrillDemonUtils {
|
|||
val DD_NPC = NPCs.SERGEANT_DAMIEN_2790
|
||||
|
||||
fun teleport(player: Player) {
|
||||
kidnapPlayer(player, Location.create(3163, 4819, 0), TeleportManager.TeleportType.INSTANT)
|
||||
setAttribute(player, DD_KEY_RETURN_LOC, player.location)
|
||||
teleport(player, Location.create(3163, 4819, 0))
|
||||
player.interfaceManager.closeDefaultTabs()
|
||||
setComponentVisibility(player, 548, 69, true)
|
||||
setComponentVisibility(player, 746, 12, true)
|
||||
|
|
@ -64,8 +63,13 @@ object DrillDemonUtils {
|
|||
}
|
||||
|
||||
fun cleanup(player: Player) {
|
||||
returnPlayer(player)
|
||||
removeAttributes(player, DD_KEY_TASK, DD_CORRECT_OFFSET, DD_CORRECT_COUNTER)
|
||||
player.locks.unlockTeleport()
|
||||
unlock(player)
|
||||
teleport(player, getAttribute(player, DD_KEY_RETURN_LOC, Location.create(3222, 3218, 0)))
|
||||
removeAttribute(player, DD_KEY_RETURN_LOC)
|
||||
removeAttribute(player, DD_KEY_TASK)
|
||||
removeAttribute(player, DD_CORRECT_OFFSET)
|
||||
removeAttribute(player, DD_CORRECT_COUNTER)
|
||||
player.interfaceManager.openDefaultTabs()
|
||||
setComponentVisibility(player, 548, 69, false)
|
||||
setComponentVisibility(player, 746, 12, false)
|
||||
|
|
|
|||
|
|
@ -10,11 +10,11 @@ import core.game.interaction.QueueStrength
|
|||
import core.game.system.timer.impl.AntiMacro
|
||||
import core.tools.secondsToTicks
|
||||
|
||||
class SergeantDamienNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.SERGEANT_DAMIEN_2790) {
|
||||
class SeargentDamienNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.SERGEANT_DAMIEN_2790) {
|
||||
|
||||
override fun init() {
|
||||
super.init()
|
||||
sendChat(player.username+ "! Drop and give me 20!")
|
||||
sendChat(player.username.capitalize() + "! Drop and give me 20!")
|
||||
queueScript(player, 4, QueueStrength.SOFT) { stage: Int ->
|
||||
when (stage) {
|
||||
0 -> {
|
||||
|
|
@ -22,8 +22,10 @@ class EvilBobDialogue(val rewardDialogue: Boolean = false, val rewardXpSkill: In
|
|||
} else if (getAttribute(player!!, EvilBobUtils.eventComplete, false)) {
|
||||
sendDialogue(player!!, "Evil Bob appears to be sleeping, best not to wake him up.").also { stage = END_DIALOGUE }
|
||||
} else if (removeItem(player!!, Items.RAW_FISHLIKE_THING_6200)) {
|
||||
setAttribute(player!!, EvilBobUtils.fishCaught, false)
|
||||
playerl(FacialExpression.NEUTRAL, "Here, I've brought you some fish.").also { stage = 500 }
|
||||
} else if (removeItem(player!!, Items.RAW_FISHLIKE_THING_6204)) {
|
||||
setAttribute(player!!, EvilBobUtils.fishCaught, false)
|
||||
setAttribute(player!!, EvilBobUtils.attentive, true)
|
||||
setAttribute(player!!, EvilBobUtils.attentiveNewSpot, true)
|
||||
playerl(FacialExpression.NEUTRAL, "Here, I've brought you some fish.").also { stage = 600 }
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
package content.global.ame.events.evilbob
|
||||
|
||||
import content.global.ame.returnPlayer
|
||||
import core.ServerConstants
|
||||
import core.api.*
|
||||
import core.game.dialogue.FacialExpression
|
||||
import core.game.interaction.IntType
|
||||
|
|
@ -9,6 +7,8 @@ import core.game.interaction.InteractionListener
|
|||
import core.game.interaction.QueueStrength
|
||||
import core.game.node.entity.Entity
|
||||
import core.game.node.entity.player.link.emote.Emotes
|
||||
import core.game.node.entity.skill.Skills
|
||||
import core.game.system.task.Pulse
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
import core.game.world.map.zone.ZoneRestriction
|
||||
|
|
@ -36,8 +36,7 @@ class EvilBobListeners : InteractionListener, MapArea {
|
|||
sendNPCDialogue(player, NPCs.SERVANT_2481, "You'll need a fishing net. There are plenty scattered around the beach.", FacialExpression.SAD)
|
||||
} else if (freeSlots(player) == 0) {
|
||||
sendDialogue(player, "You don't have enough space in your inventory.")
|
||||
} else if (inInventory(player, Items.FISHLIKE_THING_6202) || inInventory(player, Items.FISHLIKE_THING_6206) ||
|
||||
inInventory(player, Items.RAW_FISHLIKE_THING_6200) || inInventory(player, Items.RAW_FISHLIKE_THING_6204)) {
|
||||
} else if (getAttribute(player, EvilBobUtils.fishCaught, false)) {
|
||||
sendNPCDialogue(player, NPCs.SERVANT_2481, "You've already got a fish. Come over here to uncook it, then serve it to Evil Bob.", FacialExpression.SAD)
|
||||
} else {
|
||||
lock(player, 6)
|
||||
|
|
@ -68,6 +67,7 @@ class EvilBobListeners : InteractionListener, MapArea {
|
|||
}
|
||||
sendItemDialogue(player, Items.FISHLIKE_THING_6202, "You catch a... what is this?? Is this a fish?? And it's cooked already??")
|
||||
resetAnimator(player)
|
||||
setAttribute(player, EvilBobUtils.fishCaught, true)
|
||||
}
|
||||
}
|
||||
return@on true
|
||||
|
|
@ -119,8 +119,8 @@ class EvilBobListeners : InteractionListener, MapArea {
|
|||
return@queueScript delayScript(player, 2)
|
||||
}
|
||||
3 -> {
|
||||
sendMessage(player, "Welcome back to ${ServerConstants.SERVER_NAME}.")
|
||||
returnPlayer(player)
|
||||
sendMessage(player, "Welcome back to 2009Scape.")
|
||||
teleport(player, getAttribute(player, EvilBobUtils.prevLocation, Location.create(3222, 3219, 0)))
|
||||
EvilBobUtils.reward(player)
|
||||
EvilBobUtils.cleanup(player)
|
||||
resetAnimator(player)
|
||||
|
|
@ -138,11 +138,11 @@ class EvilBobListeners : InteractionListener, MapArea {
|
|||
}
|
||||
|
||||
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS, ZoneRestriction.OFF_MAP)
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS)
|
||||
}
|
||||
|
||||
override fun areaEnter(entity: Entity) {
|
||||
entity.locks.lockTeleport(1000000)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +1,7 @@
|
|||
package content.global.ame.events.evilbob
|
||||
|
||||
import content.global.ame.kidnapPlayer
|
||||
import content.global.ame.returnPlayer
|
||||
import core.api.*
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.node.entity.player.link.TeleportManager
|
||||
import core.game.node.entity.skill.Skills
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
|
|
@ -16,8 +13,10 @@ import org.rs09.consts.NPCs
|
|||
import org.rs09.consts.Scenery
|
||||
|
||||
object EvilBobUtils {
|
||||
const val prevLocation = "/save:evilbob:prevlocation"
|
||||
const val eventComplete = "/save:evilbob:eventcomplete"
|
||||
const val assignedFishingZone = "/save:evilbob:fishingzone"
|
||||
const val fishCaught = "evilbob:fishcaught"
|
||||
const val attentive = "/save:evilbob:attentive"
|
||||
const val servantHelpDialogueSeen = "/save:evilbob:servantdialogeseen"
|
||||
const val attentiveNewSpot = "/save:evilbob:attentivenewspot"
|
||||
|
|
@ -54,11 +53,14 @@ object EvilBobUtils {
|
|||
}
|
||||
|
||||
fun teleport(player: Player) {
|
||||
kidnapPlayer(player, Location.create(3419, 4776, 0), TeleportManager.TeleportType.INSTANT)
|
||||
setAttribute(player, prevLocation, player.location)
|
||||
player.properties.teleportLocation = Location.create(3419, 4776, 0)
|
||||
}
|
||||
|
||||
fun cleanup(player: Player) {
|
||||
removeAttributes(player, assignedFishingZone, eventComplete, attentive, servantHelpDialogueSeen, attentiveNewSpot, startingDialogueSeen)
|
||||
player.locks.unlockTeleport()
|
||||
player.properties.teleportLocation = getAttribute(player, prevLocation, null)
|
||||
removeAttributes(player, assignedFishingZone, eventComplete, prevLocation, attentive, servantHelpDialogueSeen, attentiveNewSpot, startingDialogueSeen)
|
||||
removeAll(player, Items.FISHLIKE_THING_6202)
|
||||
removeAll(player, Items.FISHLIKE_THING_6202, Container.BANK)
|
||||
removeAll(player, Items.FISHLIKE_THING_6206)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package content.global.ame.events.evilbob
|
||||
|
||||
import core.ServerConstants
|
||||
import core.api.getAttribute
|
||||
import core.api.setAttribute
|
||||
import core.game.dialogue.DialogueFile
|
||||
|
|
@ -35,7 +34,7 @@ class ServantDialogue : DialogueFile() {
|
|||
}
|
||||
}
|
||||
2 -> npcl(FacialExpression.SAD, "Come? Come where?").also { stage++ }
|
||||
3 -> playerl(FacialExpression.FRIENDLY, "Away from this place! To ${ServerConstants.SERVER_NAME} proper!").also { stage++ }
|
||||
3 -> playerl(FacialExpression.FRIENDLY, "Away from this place! To 2009Scape proper!").also { stage++ }
|
||||
4 -> npcl(FacialExpression.SAD, "You go, ${player!!.username}, I don't belong there... I belong here, in Scape2009. This is the only place I can ever go...").also { stage++ }
|
||||
5 -> options("But I love you!", "Oh alright then.").also { stage++ }
|
||||
6 -> when(buttonID) {
|
||||
|
|
@ -55,4 +54,4 @@ class ServantDialogue : DialogueFile() {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -9,8 +9,9 @@ import core.tools.RandomFunction
|
|||
import org.rs09.consts.Items
|
||||
import content.global.ame.RandomEventNPC
|
||||
import core.api.utils.WeightBasedTable
|
||||
import java.lang.Integer.max
|
||||
|
||||
val ids = (2463..2468).toList()
|
||||
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!")
|
||||
|
|
@ -18,7 +19,8 @@ class EvilChickenNPC(override var loot: WeightBasedTable? = null) : RandomEventN
|
|||
|
||||
override fun init() {
|
||||
super.init()
|
||||
val id = idForCombatLevel(ids, player)
|
||||
val index = max(0, (player.properties.combatLevel / 20) - 1)
|
||||
val id = ids.toList()[index]
|
||||
this.transform(id)
|
||||
this.attack(player)
|
||||
sendChat(phrases.random().replace("@name",player.username.capitalize()))
|
||||
|
|
|
|||
|
|
@ -57,10 +57,10 @@ class FreakListeners : InteractionListener, MapArea {
|
|||
}
|
||||
|
||||
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS, ZoneRestriction.OFF_MAP)
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS)
|
||||
}
|
||||
|
||||
override fun areaEnter(entity: Entity) {
|
||||
entity.locks.lockTeleport(1000000)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +1,16 @@
|
|||
package content.global.ame.events.freakyforester
|
||||
|
||||
import content.global.ame.kidnapPlayer
|
||||
import content.global.ame.returnPlayer
|
||||
import core.api.*
|
||||
import org.rs09.consts.Items
|
||||
import org.rs09.consts.NPCs
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.node.entity.player.link.TeleportManager
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
import core.tools.RandomFunction
|
||||
|
||||
object FreakUtils{
|
||||
const val freakNpc = NPCs.FREAKY_FORESTER_2458
|
||||
const val freakPreviousLoc = "/save:freakyf:location"
|
||||
const val freakTask = "/save:freakyf:task"
|
||||
const val freakComplete = "/save:freakyf:complete"
|
||||
const val pheasantKilled = "freakyf:killed"
|
||||
|
|
@ -29,12 +27,14 @@ object FreakUtils{
|
|||
}
|
||||
|
||||
fun teleport(player: Player) {
|
||||
kidnapPlayer(player, Location.create(2599, 4777 ,0), TeleportManager.TeleportType.INSTANT)
|
||||
setAttribute(player, freakPreviousLoc, player.location)
|
||||
teleport(player, Location.create(2599, 4777 ,0))
|
||||
}
|
||||
|
||||
fun cleanup(player: Player) {
|
||||
returnPlayer(player)
|
||||
removeAttributes(player, freakTask, freakComplete, pheasantKilled)
|
||||
player.locks.unlockTeleport()
|
||||
player.properties.teleportLocation = getAttribute(player,freakPreviousLoc,null)
|
||||
removeAttributes(player, freakPreviousLoc, freakTask, freakComplete, pheasantKilled)
|
||||
removeAll(player, Items.RAW_PHEASANT_6178)
|
||||
removeAll(player, Items.RAW_PHEASANT_6178, Container.BANK)
|
||||
removeAll(player, Items.RAW_PHEASANT_6179)
|
||||
|
|
|
|||
|
|
@ -1,277 +0,0 @@
|
|||
package content.global.ame.events.maze
|
||||
|
||||
import content.global.ame.returnPlayer
|
||||
import core.api.*
|
||||
import core.api.utils.WeightBasedTable
|
||||
import core.api.utils.WeightedItem
|
||||
import core.game.event.EventHook
|
||||
import core.game.event.TickEvent
|
||||
import core.game.global.action.DoorActionHandler
|
||||
import core.game.interaction.IntType
|
||||
import core.game.interaction.InteractionListener
|
||||
import core.game.interaction.QueueStrength
|
||||
import core.game.node.entity.Entity
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.system.task.Pulse
|
||||
import core.game.world.GameWorld.Pulser
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
import core.game.world.map.zone.ZoneRestriction
|
||||
import core.game.world.update.flag.context.Graphics
|
||||
import org.rs09.consts.*
|
||||
|
||||
class MazeInterface : InteractionListener, EventHook<TickEvent>, MapArea {
|
||||
companion object {
|
||||
const val MAZE_TIMER_INTERFACE = Components.MAZETIMER_209
|
||||
const val MAZE_TIMER_VARP = 531 // Interface 209 child 2 config: [531, 0]
|
||||
const val MAZE_ATTRIBUTE_TICKS_LEFT = "maze:percent-ticks-left"
|
||||
const val MAZE_ATTRIBUTE_CHESTS_OPEN = "/save:maze:chests-opened"
|
||||
|
||||
val STARTING_POINTS = arrayOf(
|
||||
Location(2928, 4553, 0),
|
||||
Location(2917, 4553, 0),
|
||||
Location(2908, 4555, 0),
|
||||
Location(2891, 4589, 0),
|
||||
Location(2891, 4595, 0),
|
||||
Location(2891, 4595, 0),
|
||||
Location(2926, 4597, 0),
|
||||
Location(2931, 4597, 0),
|
||||
// There's 2 more, but there isn't a door for them...
|
||||
)
|
||||
|
||||
val REWARD_ITEM = intArrayOf(
|
||||
Items.COINS_995,
|
||||
Items.FEATHER_314,
|
||||
Items.IRON_ARROW_884,
|
||||
Items.CHAOS_RUNE_562,
|
||||
Items.STEEL_ARROW_886,
|
||||
Items.DEATH_RUNE_560,
|
||||
Items.COAL_454,
|
||||
Items.NATURE_RUNE_561,
|
||||
Items.MITHRIL_ORE_448
|
||||
)
|
||||
|
||||
val ITEM_DIVISOR = arrayOf(
|
||||
1.0,
|
||||
2.0,
|
||||
3.0,
|
||||
9.0,
|
||||
12.0,
|
||||
18.0,
|
||||
45.0,
|
||||
162.0,
|
||||
180.0,
|
||||
)
|
||||
|
||||
val CHEST_REWARDS = WeightBasedTable.create(
|
||||
WeightedItem(Items.AIR_RUNE_556,15,15,1.0),
|
||||
WeightedItem(Items.WATER_RUNE_555,10,10,1.0),
|
||||
WeightedItem(Items.EARTH_RUNE_557,10,10,1.0),
|
||||
WeightedItem(Items.FIRE_RUNE_554,10,10,1.0),
|
||||
WeightedItem(Items.BRONZE_ARROW_882,20,20,1.0),
|
||||
WeightedItem(Items.BRONZE_BOLTS_877,10,10,1.0),
|
||||
WeightedItem(Items.IRON_ARROW_884,15,15,1.0),
|
||||
WeightedItem(Items.ATTACK_POTION2_123,1,1,1.0),
|
||||
WeightedItem(Items.STRENGTH_POTION2_117,1,1,1.0),
|
||||
WeightedItem(Items.DEFENCE_POTION2_135,1,1,1.0),
|
||||
)
|
||||
|
||||
fun initMaze(player: Player) {
|
||||
setAttribute(player, MAZE_ATTRIBUTE_TICKS_LEFT, 300)
|
||||
setVarp(player, MAZE_TIMER_VARP, (getAttribute<Int>(player, MAZE_ATTRIBUTE_TICKS_LEFT, 0) / 3),false)
|
||||
openOverlay(player, MAZE_TIMER_INTERFACE)
|
||||
sendMessage(player, "You need to reach the maze center, then you'll be returned to where you were.")
|
||||
sendNPCDialogue(player, NPCs.MYSTERIOUS_OLD_MAN_410, "You need to reach the maze center, then you'll be returned to where you were.")
|
||||
}
|
||||
|
||||
fun calculateLoot(player: Player) {
|
||||
val randomNumber = (0..8).random()
|
||||
val totalLevel = player.getSkills().totalLevel.toDouble()
|
||||
val rewardPotential = getAttribute(player, MAZE_ATTRIBUTE_TICKS_LEFT, 0).toDouble() / 300.0
|
||||
val itemDivisor = ITEM_DIVISOR[randomNumber]
|
||||
val itemQuantity = (totalLevel * rewardPotential * 3.33) / itemDivisor
|
||||
// sendMessage(player, "Maze reward calculation: $totalLevel * $rewardPotential * 3.33 / $itemDivisor = $itemQuantity")
|
||||
if (itemQuantity.toInt() > 0) {
|
||||
addItemOrDrop(player, REWARD_ITEM[randomNumber], itemQuantity.toInt())
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Chest Location to rotation mapping.
|
||||
* This is needed as it is impossible to obtain the underlying chest scenery for the rotation.
|
||||
* 0: Facing North, 1: Facing East, 2: Facing South, 3: Facing West
|
||||
*/
|
||||
val chestLocationRotationMap = mapOf(
|
||||
Location(2930, 4595, 0).toString() to 2,
|
||||
Location(2924, 4572, 0).toString() to 2,
|
||||
Location(2925, 4573, 0).toString() to 0,
|
||||
Location(2900, 4578, 0).toString() to 2,
|
||||
Location(2901, 4560, 0).toString() to 1,
|
||||
Location(2890, 4599, 0).toString() to 2,
|
||||
Location(2896, 4591, 0).toString() to 2,
|
||||
Location(2895, 4592, 0).toString() to 1,
|
||||
Location(2901, 4560, 0).toString() to 3,
|
||||
Location(2918, 4590, 0).toString() to 1,
|
||||
Location(2917, 4590, 0).toString() to 3,
|
||||
)
|
||||
|
||||
/**
|
||||
* Chest Interaction workaround
|
||||
*
|
||||
* The issue here is that the walls(3626) of the Maze are overlapping some(not all) chest sceneries.
|
||||
*
|
||||
* The types for the wallScenery:
|
||||
* Type 0 - flat panel |
|
||||
* Type 2 - right angle panel with rotation 0:r 1:7 2:> 3:L
|
||||
* Type 3 - corner post . for angle edges of walls
|
||||
*/
|
||||
fun overrideScenery(wallScenery: core.game.node.scenery.Scenery, chestSceneryId: Int): core.game.node.scenery.Scenery {
|
||||
if (wallScenery.id == chestSceneryId) {
|
||||
replaceScenery(wallScenery, Scenery.CHEST_3636, 30)
|
||||
wallScenery.isActive = true
|
||||
return wallScenery // Return the chest scenery as the wallScenery isn't there.
|
||||
}
|
||||
|
||||
addScenery(Scenery.CHEST_3636, wallScenery.location, chestLocationRotationMap[wallScenery.location.toString()] ?: 0, 10)
|
||||
addScenery(wallScenery)
|
||||
// replaceScenery(newChestScenery, Scenery.CHEST_3636, 3) // didn't work for an underlying scenery
|
||||
// I did a world pulse since everyone will get to see the chest open.
|
||||
Pulser.submit(object : Pulse(30) {
|
||||
override fun pulse(): Boolean {
|
||||
addScenery(Scenery.CHEST_3635, wallScenery.location, chestLocationRotationMap[wallScenery.location.toString()] ?: 0, 10)
|
||||
addScenery(wallScenery)
|
||||
return true
|
||||
}
|
||||
})
|
||||
// Return the chest scenery to replace PacketProcessor so that MISMATCH will not happen.
|
||||
return core.game.node.scenery.Scenery(
|
||||
chestSceneryId,
|
||||
wallScenery.location,
|
||||
chestLocationRotationMap[wallScenery.location.toString()] ?: 0
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun defineListeners() {
|
||||
|
||||
// This somehow doesn't trigger as the scenery.id != objId (3626 != 3635)
|
||||
on(Scenery.CHEST_3635, IntType.SCENERY, "open") { player, node ->
|
||||
if (getAttribute(player, MAZE_ATTRIBUTE_TICKS_LEFT, 0) > 0 && getAttribute(player, MAZE_ATTRIBUTE_CHESTS_OPEN, 0) < 10) {
|
||||
animate(player, 536)
|
||||
// val actualScenery = RegionManager.getObject(node.location.z, node.location.x, node.location.y, 3626)
|
||||
val tableRoll = CHEST_REWARDS.roll()
|
||||
addItemOrBank(player, tableRoll[0].id)
|
||||
when (tableRoll[0].id){
|
||||
Items.AIR_RUNE_556 -> sendItemDialogue(player, Items.AIR_RUNE_556, "You've found some air runes!")
|
||||
Items.WATER_RUNE_555 -> sendItemDialogue(player, Items.WATER_RUNE_555, "You've found some water runes!")
|
||||
Items.EARTH_RUNE_557 -> sendItemDialogue(player, Items.EARTH_RUNE_557, "You've found some earth runes!")
|
||||
Items.FIRE_RUNE_554 -> sendItemDialogue(player, Items.FIRE_RUNE_554, "You've found some fire runes!")
|
||||
Items.BRONZE_ARROW_882 -> sendItemDialogue(player, Items.BRONZE_ARROW_882, "You've found some bronze arrows!")
|
||||
Items.BRONZE_BOLTS_877 -> sendItemDialogue(player, Items.BRONZE_BOLTS_877, "You've found some bronze bolts!")
|
||||
Items.IRON_ARROW_884 -> sendItemDialogue(player, Items.IRON_ARROW_884, "You've found some iron arrows!")
|
||||
Items.ATTACK_POTION2_123 -> sendItemDialogue(player, Items.ATTACK_POTION2_123, "You've found an attack potion!")
|
||||
Items.STRENGTH_POTION2_117 -> sendItemDialogue(player, Items.STRENGTH_POTION2_117, "You've found a strength potion!")
|
||||
Items.DEFENCE_POTION2_135 -> sendItemDialogue(player, Items.DEFENCE_POTION2_135, "You've found a defence potion!")
|
||||
}
|
||||
setAttribute(player, MAZE_ATTRIBUTE_CHESTS_OPEN, getAttribute(player, MAZE_ATTRIBUTE_CHESTS_OPEN, 0))
|
||||
} else {
|
||||
sendMessage(player,"You find nothing of interest.")
|
||||
}
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(Scenery.CHEST_3636, SCENERY, "search") { player, node ->
|
||||
sendMessage(player,"You find nothing of interest.")
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(Scenery.WALL_3626, IntType.SCENERY, "open") { player, node ->
|
||||
sendMessage(player, "That bit doesn't open.") // 0xBrLo9woIY
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(Scenery.WALL_3628, IntType.SCENERY, "open") { player, node ->
|
||||
// Door opening workaround
|
||||
// Ignore 3629(WALL_3629) and 3630(WALL_3630) in handleAutowalkDoor ignoreSecondDoor
|
||||
DoorActionHandler.handleAutowalkDoor(player, node as core.game.node.scenery.Scenery)
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(Scenery.STRANGE_SHRINE_3634, IntType.SCENERY, "touch") { player, node ->
|
||||
player.unhook(this)
|
||||
closeOverlay(player)
|
||||
queueScript(player, 0, QueueStrength.SOFT) { stage: Int ->
|
||||
when (stage) {
|
||||
0 -> {
|
||||
lock(player, 6)
|
||||
sendGraphics(Graphics(86, 0, 3), player.location)
|
||||
animate(player,862)
|
||||
return@queueScript delayScript(player, 6)
|
||||
}
|
||||
1 -> {
|
||||
lock(player, 6)
|
||||
sendGraphics(Graphics(1576, 0, 0), player.location)
|
||||
animate(player,8939)
|
||||
playAudio(player, Sounds.TELEPORT_ALL_200)
|
||||
return@queueScript delayScript(player, 3)
|
||||
}
|
||||
2 -> {
|
||||
returnPlayer(player)
|
||||
sendGraphics(Graphics(1577, 0, 0), player.location)
|
||||
animate(player,8941)
|
||||
closeOverlay(player)
|
||||
return@queueScript delayScript(player, 1)
|
||||
}
|
||||
3 -> {
|
||||
calculateLoot(player)
|
||||
removeAttribute(player, MAZE_ATTRIBUTE_TICKS_LEFT)
|
||||
removeAttribute(player, MAZE_ATTRIBUTE_CHESTS_OPEN)
|
||||
return@queueScript stopExecuting(player)
|
||||
}
|
||||
else -> return@queueScript stopExecuting(player)
|
||||
}
|
||||
}
|
||||
|
||||
return@on true
|
||||
}
|
||||
}
|
||||
|
||||
override fun process(entity: Entity, event: TickEvent) {
|
||||
if (entity is Player) {
|
||||
if (getAttribute(entity, MAZE_ATTRIBUTE_TICKS_LEFT, 0) > 0) {
|
||||
setAttribute(entity, MAZE_ATTRIBUTE_TICKS_LEFT, getAttribute(entity, MAZE_ATTRIBUTE_TICKS_LEFT, 0) - 1)
|
||||
}
|
||||
setVarp(entity, MAZE_TIMER_VARP, (getAttribute(entity, MAZE_ATTRIBUTE_TICKS_LEFT, 0) / 3), false)
|
||||
}
|
||||
}
|
||||
|
||||
override fun defineAreaBorders(): Array<ZoneBorders> {
|
||||
return arrayOf(getRegionBorders(11591))
|
||||
}
|
||||
|
||||
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS, ZoneRestriction.TELEPORT, ZoneRestriction.OFF_MAP)
|
||||
}
|
||||
|
||||
override fun areaEnter(entity: Entity) {
|
||||
if (entity is Player) {
|
||||
sendMessage(entity, "Head for the center of the maze.")
|
||||
entity.interfaceManager.removeTabs(0, 1, 2, 3, 4, 5, 6, 12)
|
||||
openOverlay(entity, MAZE_TIMER_INTERFACE)
|
||||
}
|
||||
}
|
||||
|
||||
override fun areaLeave(entity: Entity, logout: Boolean) {
|
||||
if (entity is Player) {
|
||||
entity.interfaceManager.restoreTabs()
|
||||
closeOverlay(entity)
|
||||
entity.unhook(this)
|
||||
}
|
||||
}
|
||||
override fun entityStep(entity: Entity, location: Location, lastLocation: Location) {
|
||||
if (entity is Player) {
|
||||
entity.hook(Event.Tick, this)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
package content.global.ame.events.maze
|
||||
|
||||
import content.global.ame.RandomEventNPC
|
||||
import content.global.ame.kidnapPlayer
|
||||
import core.api.*
|
||||
import core.api.utils.WeightBasedTable
|
||||
import core.game.interaction.QueueStrength
|
||||
import core.game.node.entity.npc.NPC
|
||||
import core.game.node.entity.player.link.TeleportManager
|
||||
import core.game.system.timer.impl.AntiMacro
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.map.build.DynamicRegion
|
||||
import core.game.world.update.flag.context.Graphics
|
||||
import org.rs09.consts.NPCs
|
||||
import org.rs09.consts.Sounds
|
||||
|
||||
class MazeNPC(var type: String = "", override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.MYSTERIOUS_OLD_MAN_410) {
|
||||
|
||||
override fun init() {
|
||||
super.init()
|
||||
sendChat("Aha, you'll do ${player.username}!")
|
||||
face(player)
|
||||
queueScript(player, 4, QueueStrength.SOFT) { stage: Int ->
|
||||
when (stage) {
|
||||
0 -> {
|
||||
lock(player, 6)
|
||||
sendGraphics(Graphics(1576, 0, 0), player.location)
|
||||
animate(player,8939)
|
||||
playAudio(player, Sounds.TELEPORT_ALL_200)
|
||||
return@queueScript delayScript(player, 3)
|
||||
}
|
||||
1 -> {
|
||||
MazeInterface.initMaze(player)
|
||||
// Note: This event is NOT instanced:
|
||||
// Sources:
|
||||
// https://youtu.be/2gpzn9oNdy0 (2007)
|
||||
// https://youtu.be/Tni1HURgnxg (2008)
|
||||
// https://youtu.be/igdwDZOv9LU (2008)
|
||||
// https://youtu.be/0oBCkLArUmc (2011 - even with personal Mysterious Old Man) - "Sorry, this is not the old man you are looking for."
|
||||
// https://youtu.be/FMuKZm-Ikgs (2011)
|
||||
// val region = DynamicRegion.create(11591)
|
||||
kidnapPlayer(player, MazeInterface.STARTING_POINTS.random(), TeleportManager.TeleportType.INSTANT) // 10 random spots
|
||||
AntiMacro.terminateEventNpc(player)
|
||||
sendGraphics(Graphics(1577, 0, 0), player.location)
|
||||
animate(player,8941)
|
||||
removeAttribute(player, MazeInterface.MAZE_ATTRIBUTE_CHESTS_OPEN)
|
||||
return@queueScript stopExecuting(player)
|
||||
}
|
||||
else -> return@queueScript stopExecuting(player)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun talkTo(npc: NPC) {
|
||||
// Do nothing.
|
||||
}
|
||||
}
|
||||
|
|
@ -1,219 +0,0 @@
|
|||
package content.global.ame.events.pillory
|
||||
|
||||
import content.global.ame.RandomEvents
|
||||
import content.global.ame.returnPlayer
|
||||
import core.api.*
|
||||
import core.game.dialogue.FacialExpression
|
||||
import core.game.interaction.IntType
|
||||
import core.game.interaction.InteractionListener
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.interaction.InterfaceListener
|
||||
import core.game.interaction.QueueStrength
|
||||
import core.game.node.entity.Entity
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
import core.game.world.map.zone.ZoneRestriction
|
||||
import core.game.world.update.flag.context.Graphics
|
||||
import org.rs09.consts.NPCs
|
||||
import org.rs09.consts.Scenery
|
||||
import org.rs09.consts.Sounds
|
||||
|
||||
/**
|
||||
* Pillory Unlocking Interface PILLORY_189
|
||||
*
|
||||
* https://www.youtube.com/watch?v=caWn7pE2mkE
|
||||
* https://www.youtube.com/watch?v=TMVR5cZZwZ0
|
||||
* https://www.youtube.com/watch?v=Ym9LCDP-Q74
|
||||
* https://www.youtube.com/watch?v=_vn0QZTtI6U (Failure)
|
||||
* https://www.youtube.com/watch?v=zmXDikQIua4
|
||||
*
|
||||
* Child IDs
|
||||
* 4 - Rotating Lock Model
|
||||
* 5 6 7 - Swinging Keys Models
|
||||
* 8 9 10 - Buttons for the Swinging Keys Models
|
||||
* 11 12 13 14 15 16 - Padlocks at the Top
|
||||
* 17 18 19 20 21 22 - Padlocks stars? Model 15272, Anim 4135
|
||||
*
|
||||
* Model IDs
|
||||
* Using the amazeballs ::listifmodels
|
||||
* 9749, 9750, 9751, 9752 - Swinging Keys Models
|
||||
* 9753, 9754, 9755, 9756 - Rotating Lock Models
|
||||
* 9757 9758 locked unlock
|
||||
*/
|
||||
class PilloryInterface : InterfaceListener, InteractionListener, MapArea {
|
||||
companion object {
|
||||
const val PILLORY_LOCK_INTERFACE = 189
|
||||
const val PILLORY_ATTRIBUTE_EVENT_KEYS = "pillory:event-keys"
|
||||
const val PILLORY_ATTRIBUTE_EVENT_LOCK = "pillory:event-lock"
|
||||
const val PILLORY_ATTRIBUTE_NEEDED_TO_GET_CORRECT = "/save:pillory:target-correct"
|
||||
const val PILLORY_ATTRIBUTE_CORRECT_COUNTER = "/save:pillory:num-correct"
|
||||
|
||||
val LOCATIONS = arrayOf(
|
||||
// Varrock Cages
|
||||
Location(3226, 3407, 0),
|
||||
Location(3228, 3407, 0),
|
||||
Location(3230, 3407, 0),
|
||||
// Seers Village Cages
|
||||
Location(2681, 3489, 0),
|
||||
Location(2683, 3489, 0),
|
||||
Location(2685, 3489, 0),
|
||||
// Yannile Cages
|
||||
Location(2604, 3105, 0),
|
||||
Location(2606, 3105, 0),
|
||||
Location(2608, 3105, 0),
|
||||
)
|
||||
|
||||
fun initPillory(player: Player) {
|
||||
setAttribute(player, PILLORY_ATTRIBUTE_NEEDED_TO_GET_CORRECT, 3)
|
||||
setAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, 0)
|
||||
player.dialogueInterpreter.sendPlainMessage(true, "", "Solve the pillory puzzle to be returned to where you came from.")
|
||||
}
|
||||
|
||||
fun randomPillory(player: Player) {
|
||||
// Shuffle all 4 kinds of keys in, pick 3 for the keys, pick 1 from the 3 as the lock.
|
||||
val keys = (0..3).toIntArray().let{ keys -> keys.shuffle(); return@let keys }
|
||||
val lock = intArrayOf(keys[1], keys[2], keys[3]).random() // Last 3 as there are 4 keys. key[0] is fallback.
|
||||
|
||||
setAttribute(player, PILLORY_ATTRIBUTE_EVENT_KEYS, keys)
|
||||
setAttribute(player, PILLORY_ATTRIBUTE_EVENT_LOCK, lock)
|
||||
|
||||
player.packetDispatch.sendModelOnInterface(9753 + lock, PILLORY_LOCK_INTERFACE, 4, 0)
|
||||
player.packetDispatch.sendModelOnInterface(9749 + keys[1], PILLORY_LOCK_INTERFACE, 5, 0)
|
||||
player.packetDispatch.sendModelOnInterface(9749 + keys[2], PILLORY_LOCK_INTERFACE, 6, 0)
|
||||
player.packetDispatch.sendModelOnInterface(9749 + keys[3], PILLORY_LOCK_INTERFACE, 7, 0)
|
||||
|
||||
val numberToGetCorrect = getAttribute(player, PILLORY_ATTRIBUTE_NEEDED_TO_GET_CORRECT, 3)
|
||||
val correctCount = getAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, 0)
|
||||
for (i in 1.. 6) {
|
||||
// Set if lock is red or green.
|
||||
if (i <= correctCount) {
|
||||
player.packetDispatch.sendModelOnInterface(9758, PILLORY_LOCK_INTERFACE, 10 + i, 0)
|
||||
} else {
|
||||
player.packetDispatch.sendModelOnInterface(9757, PILLORY_LOCK_INTERFACE, 10 + i, 0)
|
||||
}
|
||||
// Set if hide or show lock.
|
||||
player.packetDispatch.sendInterfaceConfig(PILLORY_LOCK_INTERFACE, 10 + i, i > numberToGetCorrect)
|
||||
}
|
||||
}
|
||||
|
||||
fun selectedKey(player: Player, buttonID: Int) {
|
||||
val keys = getAttribute(player, PILLORY_ATTRIBUTE_EVENT_KEYS, intArrayOf(0, 0, 0))
|
||||
val lock = getAttribute(player, PILLORY_ATTRIBUTE_EVENT_LOCK, -1)
|
||||
if (keys[buttonID] == lock) {
|
||||
// CORRECT ANSWER
|
||||
setAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, getAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, 0) + 1)
|
||||
if (getAttribute(player, PILLORY_ATTRIBUTE_NEEDED_TO_GET_CORRECT, 3) <= getAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, -1)) {
|
||||
player.dialogueInterpreter.sendPlainMessage(true, "", "You've escaped!")
|
||||
sendMessage(player, "You've escaped!")
|
||||
removeAttribute(player, PILLORY_ATTRIBUTE_NEEDED_TO_GET_CORRECT)
|
||||
removeAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER)
|
||||
closeInterface(player)
|
||||
queueScript(player, 0, QueueStrength.SOFT) { stage: Int ->
|
||||
when (stage) {
|
||||
0 -> {
|
||||
lock(player, 6)
|
||||
sendGraphics(Graphics(1576, 0, 0), player.location)
|
||||
animate(player,8939)
|
||||
playAudio(player, Sounds.TELEPORT_ALL_200)
|
||||
return@queueScript delayScript(player, 3)
|
||||
}
|
||||
1 -> {
|
||||
val loot = RandomEvents.CERTER.loot!!.roll(player)[0]
|
||||
addItemOrDrop(player, loot.id, loot.amount)
|
||||
returnPlayer(player)
|
||||
sendGraphics(Graphics(1577, 0, 0), player.location)
|
||||
animate(player,8941)
|
||||
closeInterface(player)
|
||||
return@queueScript stopExecuting(player)
|
||||
}
|
||||
else -> return@queueScript stopExecuting(player)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
randomPillory(player)
|
||||
player.dialogueInterpreter.sendPlainMessage(
|
||||
true,
|
||||
"",
|
||||
"Correct!",
|
||||
"" + getAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, 0) + " down, " +
|
||||
(getAttribute(player, PILLORY_ATTRIBUTE_NEEDED_TO_GET_CORRECT, 3) - getAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, 0)) + " to go!")
|
||||
// Animation for the star, but it doesn't work.
|
||||
player.packetDispatch.sendInterfaceConfig(PILLORY_LOCK_INTERFACE, 16 + getAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, 1), false)
|
||||
sendAnimationOnInterface(player, 4135, PILLORY_LOCK_INTERFACE, 16 + getAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, 1))
|
||||
} else {
|
||||
// WRONG ANSWER
|
||||
player.dialogueInterpreter.close()
|
||||
player.dialogueInterpreter.sendDialogues(NPCs.TRAMP_2794 , FacialExpression.OLD_ANGRY1, "Bah, that's not right.","Use the key that matches the hole", "in the spinning lock.")
|
||||
if (getAttribute(player, PILLORY_ATTRIBUTE_NEEDED_TO_GET_CORRECT, 0) < 6) {
|
||||
setAttribute(player, PILLORY_ATTRIBUTE_NEEDED_TO_GET_CORRECT, getAttribute(player, PILLORY_ATTRIBUTE_NEEDED_TO_GET_CORRECT, 0) + 1)
|
||||
}
|
||||
setAttribute(player, PILLORY_ATTRIBUTE_CORRECT_COUNTER, 0)
|
||||
closeInterface(player)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun defineInterfaceListeners() {
|
||||
on(PILLORY_LOCK_INTERFACE){ player, component, opcode, buttonID, slot, itemID ->
|
||||
when (buttonID) {
|
||||
8 -> selectedKey(player, 1)
|
||||
9 -> selectedKey(player, 2)
|
||||
10 -> selectedKey(player, 3)
|
||||
}
|
||||
return@on true
|
||||
}
|
||||
|
||||
onOpen(PILLORY_LOCK_INTERFACE){ player, component ->
|
||||
return@onOpen true
|
||||
}
|
||||
}
|
||||
|
||||
override fun defineListeners() {
|
||||
on(Scenery.CAGE_6836, IntType.SCENERY, "unlock") { player, node ->
|
||||
if (player.location in LOCATIONS) { // When you aren't inside.
|
||||
randomPillory(player)
|
||||
openInterface(player, PILLORY_LOCK_INTERFACE)
|
||||
player.dialogueInterpreter.sendPlainMessage(true, "", "Pick the <col=8A0808>swinging key</col> that matches the", "hole in the <col=8A0808>spinning lock</col>.")
|
||||
} else {
|
||||
sendMessage(player, "You can't unlock the pillory, you'll let all the prisoners out!")
|
||||
}
|
||||
return@on true
|
||||
}
|
||||
}
|
||||
|
||||
override fun defineAreaBorders(): Array<ZoneBorders> {
|
||||
return arrayOf(
|
||||
// Varrock Cages
|
||||
ZoneBorders(3226, 3407, 3226, 3407),
|
||||
ZoneBorders(3228, 3407, 3228, 3407),
|
||||
ZoneBorders(3230, 3407, 3230, 3407),
|
||||
// Seers Village Cages
|
||||
ZoneBorders(2681, 3489, 2681, 3489),
|
||||
ZoneBorders(2683, 3489, 2683, 3489),
|
||||
ZoneBorders(2685, 3489, 2685, 3489),
|
||||
// Yannile Cages
|
||||
ZoneBorders(2604, 3105, 2604, 3105),
|
||||
ZoneBorders(2606, 3105, 2606, 3105),
|
||||
ZoneBorders(2608, 3105, 2608, 3105),
|
||||
)
|
||||
}
|
||||
|
||||
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS, ZoneRestriction.TELEPORT, ZoneRestriction.OFF_MAP)
|
||||
}
|
||||
|
||||
override fun areaEnter(entity: Entity) {
|
||||
if (entity is Player) {
|
||||
entity.interfaceManager.removeTabs(0, 1, 2, 3, 4, 5, 6, 12)
|
||||
}
|
||||
}
|
||||
|
||||
override fun areaLeave(entity: Entity, logout: Boolean) {
|
||||
if (entity is Player) {
|
||||
entity.interfaceManager.restoreTabs()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
package content.global.ame.events.pillory
|
||||
|
||||
import content.global.ame.RandomEventNPC
|
||||
import content.global.ame.kidnapPlayer
|
||||
import core.api.*
|
||||
import core.api.utils.WeightBasedTable
|
||||
import core.game.interaction.QueueStrength
|
||||
import core.game.node.entity.npc.NPC
|
||||
import core.game.node.entity.player.link.TeleportManager
|
||||
import core.game.system.timer.impl.AntiMacro
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.update.flag.context.Graphics
|
||||
import org.rs09.consts.NPCs
|
||||
import org.rs09.consts.Sounds
|
||||
|
||||
// "::revent [-p] <lt>player name<gt> [-e <lt>event name<gt>]"
|
||||
class PilloryNPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.PILLORY_GUARD_2791) {
|
||||
|
||||
override fun init() {
|
||||
super.init()
|
||||
sendChat("${player.username}, you're under arrest!")
|
||||
face(player)
|
||||
player.dialogueInterpreter.sendPlainMessage(true, "", "Solve the pillory puzzle to be returned to where you came from.")
|
||||
queueScript(player, 4, QueueStrength.SOFT) { stage: Int ->
|
||||
when (stage) {
|
||||
0 -> {
|
||||
lock(player, 6)
|
||||
sendGraphics(Graphics(1576, 0, 0), player.location)
|
||||
animate(player,8939)
|
||||
playAudio(player, Sounds.TELEPORT_ALL_200)
|
||||
return@queueScript delayScript(player, 3)
|
||||
}
|
||||
1 -> {
|
||||
PilloryInterface.initPillory(player)
|
||||
val dest = PilloryInterface.LOCATIONS.random() //9 random spots!
|
||||
kidnapPlayer(player, dest, TeleportManager.TeleportType.INSTANT)
|
||||
AntiMacro.terminateEventNpc(player)
|
||||
sendGraphics(Graphics(1577, 0, 0), player.location)
|
||||
animate(player,8941)
|
||||
return@queueScript stopExecuting(player)
|
||||
}
|
||||
else -> return@queueScript stopExecuting(player)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun talkTo(npc: NPC) {
|
||||
//player.dialogueInterpreter.open(FreakyForesterDialogue(),npc)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
package content.global.ame.events.quizmaster
|
||||
|
||||
import core.api.*
|
||||
import core.game.node.entity.Entity
|
||||
import core.game.node.entity.npc.NPC
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
import core.game.world.map.zone.ZoneRestriction
|
||||
import org.rs09.consts.NPCs
|
||||
|
||||
class QuizMasterBorders : MapArea {
|
||||
override fun defineAreaBorders(): Array<ZoneBorders> {
|
||||
return arrayOf(getRegionBorders(7754))
|
||||
}
|
||||
|
||||
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS, ZoneRestriction.TELEPORT, ZoneRestriction.OFF_MAP)
|
||||
}
|
||||
|
||||
override fun areaEnter(entity: Entity) {
|
||||
if (entity is Player) {
|
||||
entity.interfaceManager.removeTabs(0, 1, 2, 3, 4, 5, 6, 12)
|
||||
face(entity, Location(1952, 4768, 1))
|
||||
animate(entity,2378)
|
||||
openDialogue(entity, QuizMasterDialogueFile(), NPC(NPCs.QUIZ_MASTER_2477))
|
||||
}
|
||||
}
|
||||
|
||||
override fun areaLeave(entity: Entity, logout: Boolean) {
|
||||
if (entity is Player) {
|
||||
entity.interfaceManager.restoreTabs()
|
||||
//closeOverlay(entity)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,129 +0,0 @@
|
|||
package content.global.ame.events.quizmaster
|
||||
|
||||
import content.global.ame.returnPlayer
|
||||
import core.ServerConstants
|
||||
import core.api.*
|
||||
import core.api.utils.WeightBasedTable
|
||||
import core.api.utils.WeightedItem
|
||||
import core.game.dialogue.DialogueFile
|
||||
import core.game.dialogue.FacialExpression
|
||||
import core.game.interaction.QueueStrength
|
||||
import core.game.node.entity.player.Player
|
||||
import core.tools.END_DIALOGUE
|
||||
import org.rs09.consts.Components
|
||||
import org.rs09.consts.Items
|
||||
|
||||
class QuizMasterDialogueFile : DialogueFile() {
|
||||
companion object {
|
||||
const val QUIZMASTER_INTERFACE = Components.MACRO_QUIZSHOW_191
|
||||
const val QUIZMASTER_ATTRIBUTE_QUESTIONS_CORRECT = "/save:quizmaster:questions-correct"
|
||||
const val QUIZMASTER_ATTRIBUTE_RANDOM_ANSWER = "quizmaster:random-answer"
|
||||
|
||||
/*
|
||||
// Golden Models:
|
||||
8828 ADAMANT_BATTLEAXE_1371
|
||||
8829 SALMON_329
|
||||
8830 TROUT_333
|
||||
8831 NECKLACE
|
||||
8832 WOODEN_SHIELD_1171
|
||||
8833 BRONZE_MED_HELM_1139
|
||||
8834 RING
|
||||
8835 SECATEURS_5329
|
||||
8836 BRONZE_SWORD_1277
|
||||
8837 GARDENING_TROWEL_5325
|
||||
*/
|
||||
val sets = arrayOf(
|
||||
intArrayOf(8828, 8829, 8829),
|
||||
intArrayOf(8831, 8837, 8835),
|
||||
intArrayOf(8830, 8832, 8833),
|
||||
intArrayOf(8835, 8834, 8831),
|
||||
intArrayOf(8837, 8836, 8828),
|
||||
)
|
||||
|
||||
fun randomQuestion(player: Player): Int {
|
||||
val randomSet = intArrayOf(*sets.random())
|
||||
val answer = intArrayOf(*randomSet)[0]
|
||||
randomSet.shuffle()
|
||||
val correctButton = randomSet.indexOf(answer) + 2 // buttons are 3,4,5
|
||||
|
||||
player.packetDispatch.sendModelOnInterface(randomSet[0], QUIZMASTER_INTERFACE, 6, 512)
|
||||
player.packetDispatch.sendModelOnInterface(randomSet[1], QUIZMASTER_INTERFACE, 7, 512)
|
||||
player.packetDispatch.sendModelOnInterface(randomSet[2], QUIZMASTER_INTERFACE, 8, 512)
|
||||
player.packetDispatch.sendAngleOnInterface(QUIZMASTER_INTERFACE, 6, 512,0,0)
|
||||
player.packetDispatch.sendAngleOnInterface(QUIZMASTER_INTERFACE, 7, 512,0,0)
|
||||
player.packetDispatch.sendAngleOnInterface(QUIZMASTER_INTERFACE, 8, 512,0,0)
|
||||
|
||||
return correctButton
|
||||
}
|
||||
|
||||
// Random Item should be "Mystery Box", but the current MYSTERY_BOX_6199 is already inauthentically used by Giftmas.
|
||||
val tableRoll = WeightBasedTable.create(
|
||||
WeightedItem(Items.LAMP_2528, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.CABBAGE_1965, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.DIAMOND_1601, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.BUCKET_1925, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.FLIER_956, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.OLD_BOOT_685, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.BODY_RUNE_559, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.ONION_1957, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.MITHRIL_SCIMITAR_1329, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.CASKET_405, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.STEEL_PLATEBODY_1119, 1, 1, 1.0, false),
|
||||
WeightedItem(Items.NATURE_RUNE_561, 20, 20, 1.0, false),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
override fun handle(componentID: Int, buttonID: Int) {
|
||||
when (stage) {
|
||||
0 -> npc(FacialExpression.FRIENDLY,"WELCOME to the GREATEST QUIZ SHOW in the", "whole of ${ServerConstants.SERVER_NAME}:", "<col=8A0808>O D D</col> <col=8A088A>O N E</col> <col=08088A>O U T</col>").also { stage++ }
|
||||
1 -> player(FacialExpression.THINKING, "I'm sure I didn't ask to take part in a quiz show...").also { stage++ }
|
||||
2 -> npc(FacialExpression.FRIENDLY,"Please welcome our newest contestant:", "<col=FF0000>${player?.username}</col>!", "Just pick the O D D O N E O U T.", "Four questions right, and then you win!").also { stage++ }
|
||||
3 -> {
|
||||
setAttribute(player!!, QUIZMASTER_ATTRIBUTE_RANDOM_ANSWER, randomQuestion(player!!))
|
||||
player!!.interfaceManager.openChatbox(QUIZMASTER_INTERFACE)
|
||||
stage++
|
||||
}
|
||||
4-> {
|
||||
if (buttonID == getAttribute(player!!, QUIZMASTER_ATTRIBUTE_RANDOM_ANSWER, 0)) {
|
||||
// Correct Answer
|
||||
setAttribute(player!!, QUIZMASTER_ATTRIBUTE_QUESTIONS_CORRECT, getAttribute(player!!, QUIZMASTER_ATTRIBUTE_QUESTIONS_CORRECT, 0) + 1)
|
||||
if (getAttribute(player!!, QUIZMASTER_ATTRIBUTE_QUESTIONS_CORRECT, 0) >= 4) {
|
||||
npc(FacialExpression.FRIENDLY,"<col=08088A>CONGRATULATIONS!</col>", "You are a <col=8A0808>WINNER</col>!", "Please choose your <col=08088A>PRIZE</col>!")
|
||||
stage = 5
|
||||
} else {
|
||||
npc(FacialExpression.FRIENDLY,"Wow, you're a smart one!", "You're absolutely RIGHT!", "Okay, next question!")
|
||||
stage = 3
|
||||
}
|
||||
} else {
|
||||
// Wrong Answer
|
||||
npc(FacialExpression.FRIENDLY,"WRONG!", "That's just WRONG!", "Okay, next question!")
|
||||
stage = 3
|
||||
}
|
||||
}
|
||||
// Random Item should be "Mystery Box", but the current MYSTERY_BOX_6199 is already inauthentically used by Giftmas.
|
||||
5 -> options("1000 Coins", "Random Item").also { stage++ }
|
||||
6 -> {
|
||||
resetAnimator(player!!)
|
||||
returnPlayer(player!!)
|
||||
when (buttonID) {
|
||||
1 -> {
|
||||
queueScript(player!!, 0, QueueStrength.SOFT) { stage: Int ->
|
||||
addItemOrDrop(player!!, Items.COINS_995, 1000)
|
||||
return@queueScript stopExecuting(player!!)
|
||||
}
|
||||
}
|
||||
2 -> {
|
||||
queueScript(player!!, 0, QueueStrength.SOFT) { stage: Int ->
|
||||
addItemOrDrop(player!!, tableRoll.roll()[0].id)
|
||||
return@queueScript stopExecuting(player!!)
|
||||
}
|
||||
}
|
||||
}
|
||||
removeAttributes(player!!, QUIZMASTER_ATTRIBUTE_QUESTIONS_CORRECT, QUIZMASTER_ATTRIBUTE_RANDOM_ANSWER)
|
||||
stage = END_DIALOGUE
|
||||
end()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
package content.global.ame.events.quizmaster
|
||||
|
||||
import content.global.ame.RandomEventNPC
|
||||
import content.global.ame.kidnapPlayer
|
||||
import core.api.*
|
||||
import core.api.utils.WeightBasedTable
|
||||
import core.game.interaction.QueueStrength
|
||||
import core.game.node.entity.npc.NPC
|
||||
import core.game.node.entity.player.link.TeleportManager
|
||||
import core.game.system.timer.impl.AntiMacro
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.update.flag.context.Graphics
|
||||
import org.rs09.consts.NPCs
|
||||
import org.rs09.consts.Sounds
|
||||
|
||||
/**
|
||||
* Quiz Master NPC:
|
||||
*
|
||||
* https://www.youtube.com/watch?v=EFAWSiPTfcM
|
||||
* https://www.youtube.com/watch?v=caWn7pE2mkE
|
||||
* https://www.youtube.com/watch?v=Bc1gAov2o4w
|
||||
* https://www.youtube.com/watch?v=oHU8-MUarxE
|
||||
* https://www.youtube.com/watch?v=wvjYiF4v9tI
|
||||
* https://www.youtube.com/watch?v=dC6rlSnXEfw
|
||||
*/
|
||||
class QuizMasterNPC(var type: String = "", override var loot: WeightBasedTable? = null) : RandomEventNPC(NPCs.QUIZ_MASTER_2477) {
|
||||
override fun init() {
|
||||
super.init()
|
||||
sendChat("Hey ${player.username}! It's your lucky day!")
|
||||
queueScript(player, 4, QueueStrength.SOFT) { stage: Int ->
|
||||
when (stage) {
|
||||
0 -> {
|
||||
lock(player, 6)
|
||||
sendGraphics(Graphics(1576, 0, 0), player.location)
|
||||
animate(player,8939)
|
||||
playAudio(player, Sounds.TELEPORT_ALL_200)
|
||||
return@queueScript delayScript(player, 3)
|
||||
}
|
||||
1 -> {
|
||||
kidnapPlayer(player, Location(1952, 4764, 1), TeleportManager.TeleportType.INSTANT)
|
||||
setAttribute(player, QuizMasterDialogueFile.QUIZMASTER_ATTRIBUTE_QUESTIONS_CORRECT, 0)
|
||||
AntiMacro.terminateEventNpc(player)
|
||||
sendGraphics(Graphics(1577, 0, 0), player.location)
|
||||
animate(player,8941)
|
||||
sendMessage(player, "Answer four questions correctly in a row to be teleported back where you came from.")
|
||||
sendMessage(player, "You will need to relog in if you lose the quiz dialog.") // Inauthentic, but there to notify the player in case.
|
||||
return@queueScript delayScript(player, 6)
|
||||
}
|
||||
2 -> {
|
||||
face(player, Location(1952, 4768, 1))
|
||||
animate(player,2378)
|
||||
// This is not needed as when you enter the QuizMasterBorders, it should fire off the dialogue
|
||||
// openDialogue(player, QuizMasterDialogueFile(), this.asNpc())
|
||||
return@queueScript stopExecuting(player)
|
||||
}
|
||||
else -> return@queueScript stopExecuting(player)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
override fun talkTo(npc: NPC) {
|
||||
openDialogue(player, QuizMasterDialogueFile(), this.asNpc())
|
||||
}
|
||||
}
|
||||
|
|
@ -4,14 +4,17 @@ import core.game.node.entity.Entity
|
|||
import core.game.node.entity.npc.NPC
|
||||
import content.global.ame.RandomEventNPC
|
||||
import core.api.utils.WeightBasedTable
|
||||
import java.lang.Integer.max
|
||||
|
||||
val ids = (391..396).toList()
|
||||
|
||||
val ids = 391..396
|
||||
|
||||
class RiverTrollRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(391){
|
||||
override fun talkTo(npc: NPC) {}
|
||||
override fun init() {
|
||||
super.init()
|
||||
val id = idForCombatLevel(ids, player)
|
||||
val index = max(0, (player.properties.combatLevel / 20) - 1)
|
||||
val id = ids.toList()[index]
|
||||
this.transform(id)
|
||||
this.attack(player)
|
||||
sendChat("Fishies be mine, leave dem fishies!")
|
||||
|
|
|
|||
|
|
@ -4,14 +4,17 @@ import core.game.node.entity.Entity
|
|||
import core.game.node.entity.npc.NPC
|
||||
import content.global.ame.RandomEventNPC
|
||||
import core.api.utils.WeightBasedTable
|
||||
import kotlin.math.max
|
||||
|
||||
val ids = (413..418).toList()
|
||||
|
||||
val ids = 413..418
|
||||
|
||||
class RockGolemRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(413){
|
||||
override fun talkTo(npc: NPC) {}
|
||||
override fun init() {
|
||||
super.init()
|
||||
val id = idForCombatLevel(ids, player)
|
||||
val index = max(0,(player.properties.combatLevel / 20) - 1)
|
||||
val id = ids.toList()[index]
|
||||
this.transform(id)
|
||||
this.attack(player)
|
||||
sendChat("Raarrrgghh! Flee human!")
|
||||
|
|
|
|||
|
|
@ -4,13 +4,15 @@ import core.game.node.entity.Entity
|
|||
import core.game.node.entity.npc.NPC
|
||||
import content.global.ame.RandomEventNPC
|
||||
import core.api.utils.WeightBasedTable
|
||||
import kotlin.math.*
|
||||
|
||||
class ShadeRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(425){
|
||||
val ids = (425..430).toList()
|
||||
override fun talkTo(npc: NPC) {}
|
||||
override fun init() {
|
||||
super.init()
|
||||
val id = idForCombatLevel(ids, player)
|
||||
val index = max(0, min(ids.size, (player.properties.combatLevel / 20) - 1))
|
||||
val id = ids[index]
|
||||
this.transform(id)
|
||||
this.attack(player)
|
||||
sendChat("Leave this place!")
|
||||
|
|
|
|||
|
|
@ -32,8 +32,4 @@ class StrangePlantBehavior() : NPCBehavior(NPCs.STRANGE_PLANT_408) {
|
|||
override fun onDeathStarted(self: NPC, killer: Entity) {
|
||||
AntiMacro.terminateEventNpc(killer.asPlayer())
|
||||
}
|
||||
|
||||
override fun getXpMultiplier(self: NPC, attacker: Entity): Double {
|
||||
return super.getXpMultiplier(self, attacker) / 16.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package content.global.ame.events.surpriseexam
|
||||
package content.global.ame.events.supriseexam
|
||||
|
||||
import core.game.component.Component
|
||||
import core.game.dialogue.FacialExpression
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package content.global.ame.events.surpriseexam
|
||||
package content.global.ame.events.supriseexam
|
||||
|
||||
import core.game.dialogue.DialogueFile
|
||||
import core.tools.END_DIALOGUE
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package content.global.ame.events.surpriseexam
|
||||
package content.global.ame.events.supriseexam
|
||||
|
||||
import core.game.node.entity.npc.NPC
|
||||
import org.rs09.consts.Components
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package content.global.ame.events.surpriseexam
|
||||
package content.global.ame.events.supriseexam
|
||||
|
||||
import core.game.component.Component
|
||||
import core.game.node.entity.player.Player
|
||||
|
|
@ -9,22 +9,20 @@ import org.rs09.consts.NPCs
|
|||
import core.game.interaction.InteractionListener
|
||||
import core.game.interaction.IntType
|
||||
import content.global.handlers.iface.ExperienceInterface
|
||||
import core.api.MapArea
|
||||
import core.api.removeItem
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
import core.game.world.map.zone.ZoneRestriction
|
||||
|
||||
class SupriseExamListeners : InteractionListener, MapArea {
|
||||
class SupriseExamListeners : InteractionListener {
|
||||
val MORDAUT = NPCs.MR_MORDAUT_6117
|
||||
val BOOK_OF_KNOWLEDGE = Items.BOOK_OF_KNOWLEDGE_11640
|
||||
override fun defineListeners() {
|
||||
|
||||
on(NPCs.MR_MORDAUT_6117, IntType.NPC, "talk-to") { player, node ->
|
||||
on(MORDAUT, IntType.NPC, "talk-to"){ player, node ->
|
||||
player.faceLocation(Location.create(1886, 5024, 0))
|
||||
val examComplete = player.getAttribute(SurpriseExamUtils.SE_KEY_CORRECT, 0) == 3
|
||||
player.dialogueInterpreter.open(MordautDialogue(examComplete), node.asNpc())
|
||||
val examComplete = player.getAttribute(SurpriseExamUtils.SE_KEY_CORRECT,0) == 3
|
||||
player.dialogueInterpreter.open(MordautDialogue(examComplete),node.asNpc())
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(SurpriseExamUtils.SE_DOORS, IntType.SCENERY, "open") { player, node ->
|
||||
on(SurpriseExamUtils.SE_DOORS, IntType.SCENERY, "open"){ player, node ->
|
||||
val correctDoor = player.getAttribute(SurpriseExamUtils.SE_DOOR_KEY,-1)
|
||||
|
||||
if(correctDoor == -1){
|
||||
|
|
@ -41,9 +39,9 @@ class SupriseExamListeners : InteractionListener, MapArea {
|
|||
return@on true
|
||||
}
|
||||
|
||||
on(Items.BOOK_OF_KNOWLEDGE_11640, IntType.ITEM, "read") { player, _ ->
|
||||
player.setAttribute("caller") { skill: Int, p: Player ->
|
||||
if (removeItem(p, Items.BOOK_OF_KNOWLEDGE_11640)) {
|
||||
on(BOOK_OF_KNOWLEDGE, IntType.ITEM, "read"){ player, _ ->
|
||||
player.setAttribute("caller"){skill: Int,p: Player ->
|
||||
if(p.inventory.remove(Item(BOOK_OF_KNOWLEDGE))) {
|
||||
val level = p.skills.getStaticLevel(skill)
|
||||
val experience = level * 15.0
|
||||
p.skills.addExperience(skill, experience)
|
||||
|
|
@ -56,16 +54,8 @@ class SupriseExamListeners : InteractionListener, MapArea {
|
|||
}
|
||||
|
||||
override fun defineDestinationOverrides() {
|
||||
setDest(IntType.NPC, NPCs.MR_MORDAUT_6117) { _, _ ->
|
||||
setDest(IntType.NPC,MORDAUT){ _, _ ->
|
||||
return@setDest Location.create(1886, 5025, 0)
|
||||
}
|
||||
}
|
||||
|
||||
override fun defineAreaBorders(): Array<ZoneBorders> {
|
||||
return arrayOf(ZoneBorders.forRegion(7502))
|
||||
}
|
||||
|
||||
override fun getRestrictions(): Array<ZoneRestriction> {
|
||||
return arrayOf(ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON, ZoneRestriction.FOLLOWERS, ZoneRestriction.OFF_MAP)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +1,21 @@
|
|||
package content.global.ame.events.surpriseexam
|
||||
package content.global.ame.events.supriseexam
|
||||
|
||||
import content.global.ame.kidnapPlayer
|
||||
import content.global.ame.returnPlayer
|
||||
import core.api.*
|
||||
import core.game.node.entity.impl.PulseType
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.node.item.GroundItemManager
|
||||
import core.game.node.item.Item
|
||||
import core.game.system.task.Pulse
|
||||
import core.game.world.map.Location
|
||||
import org.rs09.consts.Components
|
||||
import org.rs09.consts.Items
|
||||
import core.game.node.entity.player.link.TeleportManager
|
||||
import core.ServerConstants
|
||||
|
||||
object SurpriseExamUtils {
|
||||
|
||||
val SE_KEY_LOC = "supexam:loc"
|
||||
val SE_KEY_INDEX = "supexam:index"
|
||||
val SE_LOGOUT_KEY = "suprise_exam"
|
||||
val SE_DOOR_KEY = "supexam:door"
|
||||
val INTER_PATTERN_CHILDS = intArrayOf(6,7,8)
|
||||
val INTER_OPTION_CHILDS = intArrayOf(10,11,12,13)
|
||||
|
|
@ -26,16 +29,28 @@ object SurpriseExamUtils {
|
|||
intArrayOf(Items.FLY_FISHING_ROD_309,Items.BARBARIAN_ROD_11323,Items.SMALL_FISHING_NET_303,Items.HARPOON_311)
|
||||
)
|
||||
|
||||
fun teleport(player: Player) {
|
||||
kidnapPlayer(player, Location.create(1886, 5025, 0), TeleportManager.TeleportType.INSTANT)
|
||||
fun teleport(player: Player){
|
||||
player.setAttribute(SE_KEY_LOC,player.location)
|
||||
|
||||
registerLogoutListener(player, SE_LOGOUT_KEY){p ->
|
||||
p.location = getAttribute(p, SE_KEY_LOC, ServerConstants.HOME_LOCATION)
|
||||
}
|
||||
|
||||
player.properties.teleportLocation = Location.create(1886, 5025, 0)
|
||||
}
|
||||
|
||||
fun cleanup(player: Player){
|
||||
returnPlayer(player)
|
||||
removeAttributes(player, SE_KEY_INDEX, SE_KEY_CORRECT)
|
||||
player.properties.teleportLocation = player.getAttribute(SE_KEY_LOC,null)
|
||||
clearLogoutListener(player, SE_LOGOUT_KEY)
|
||||
player.removeAttribute(SE_KEY_LOC)
|
||||
player.removeAttribute(SE_KEY_INDEX)
|
||||
player.removeAttribute(SE_KEY_CORRECT)
|
||||
player.pulseManager.run(object : Pulse(2){
|
||||
override fun pulse(): Boolean {
|
||||
addItemOrDrop(player, Items.BOOK_OF_KNOWLEDGE_11640)
|
||||
val reward = Item(Items.BOOK_OF_KNOWLEDGE_11640)
|
||||
if(!player.inventory.add(reward)){
|
||||
GroundItemManager.create(reward,player)
|
||||
}
|
||||
return true
|
||||
}
|
||||
}, PulseType.CUSTOM_1)
|
||||
|
|
@ -4,14 +4,17 @@ import core.game.node.entity.Entity
|
|||
import core.game.node.entity.npc.NPC
|
||||
import content.global.ame.RandomEventNPC
|
||||
import core.api.utils.WeightBasedTable
|
||||
import kotlin.math.max
|
||||
|
||||
val ids = (438..443).toList()
|
||||
|
||||
val ids = 438..443
|
||||
|
||||
class TreeSpiritRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(438){
|
||||
override fun talkTo(npc: NPC) {}
|
||||
override fun init() {
|
||||
super.init()
|
||||
val id = idForCombatLevel(ids, player)
|
||||
val index = max(0,(player.properties.combatLevel / 20) - 1)
|
||||
val id = ids.toList()[index]
|
||||
this.transform(id)
|
||||
this.attack(player)
|
||||
sendChat("Leave these woods and never return!")
|
||||
|
|
|
|||
|
|
@ -4,13 +4,15 @@ import core.game.node.entity.Entity
|
|||
import core.game.node.entity.npc.NPC
|
||||
import content.global.ame.RandomEventNPC
|
||||
import core.api.utils.WeightBasedTable
|
||||
import kotlin.math.*
|
||||
|
||||
class ZombieRENPC(override var loot: WeightBasedTable? = null) : RandomEventNPC(419){
|
||||
val ids = (419..424).toList()
|
||||
override fun talkTo(npc: NPC) {}
|
||||
override fun init() {
|
||||
super.init()
|
||||
val id = idForCombatLevel(ids, player)
|
||||
val index = max(0, min(ids.size, (player.properties.combatLevel / 20) - 1))
|
||||
val id = ids[index]
|
||||
this.transform(id)
|
||||
this.attack(player)
|
||||
sendChat("Brainsssss!")
|
||||
|
|
|
|||
|
|
@ -12,16 +12,15 @@ import core.game.world.map.Location
|
|||
import core.game.world.map.RegionManager
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
import core.game.world.update.flag.*
|
||||
import core.tools.RandomFunction
|
||||
import org.json.simple.JSONArray
|
||||
import org.json.simple.JSONObject
|
||||
import core.ServerConstants
|
||||
import core.api.log
|
||||
import core.game.bots.AIRepository
|
||||
import core.game.bots.CombatBotAssembler
|
||||
import core.game.bots.Script
|
||||
import core.game.interaction.IntType
|
||||
import core.game.interaction.InteractionListeners
|
||||
import core.tools.Log
|
||||
import java.io.File
|
||||
import java.io.FileReader
|
||||
import java.time.LocalDateTime
|
||||
|
|
@ -41,27 +40,21 @@ import kotlin.random.Random
|
|||
* @author Ceikry
|
||||
*/
|
||||
|
||||
// Adventure Bots v1.1.0 : Expansion Edition (Previously v4.0.0)
|
||||
// Super Grand Exchange Update
|
||||
//Adventure Bots v4.0.0 -Expansion Edition-
|
||||
class Adventurer(val style: CombatStyle): Script() {
|
||||
|
||||
var city: Location = lumbridge
|
||||
var poiloc: Location = karamja
|
||||
var geSocialLoc: Location = getRandomGESocialLocation()
|
||||
var geClerkLoc: Location = getRandomGELocation()
|
||||
var geClerksloc: Location = neGEClerk
|
||||
var ticks = 0
|
||||
var freshspawn = true
|
||||
var sold = false
|
||||
private val geloc: Location = if (Random.nextBoolean()){
|
||||
Location.create(3165, 3487, 0)
|
||||
}else{
|
||||
Location.create(3164, 3492, 0)
|
||||
}
|
||||
|
||||
var freshspawn: Boolean = true
|
||||
var sold: Boolean = false
|
||||
var poi: Boolean = false
|
||||
|
||||
val chance: Int = if (cityLocationsGE.contains(city)) 3500 else 3000
|
||||
var ticks: Int = 0
|
||||
var counter: Int = 0
|
||||
val waitTotal: Int = 8
|
||||
var returnToAdventure: Int = 0
|
||||
var geWait: Int = 0
|
||||
var geLongWait: Int = 0
|
||||
var random: Int = (5..30).random()
|
||||
|
||||
val type = when(style){
|
||||
CombatStyle.MELEE -> CombatBotAssembler.Type.MELEE
|
||||
|
|
@ -81,81 +74,23 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "${bot.username} is an Adventurer bot " +
|
||||
"at ${bot.location}! " +
|
||||
"State: $state - " +
|
||||
"City: $city - " +
|
||||
"Ticks: $ticks - " +
|
||||
"Freshspawn: $freshspawn - " +
|
||||
"Sold: $sold - " +
|
||||
"Counter: $counter"
|
||||
return "${bot.name} is an Adventurer bot at ${bot.location}! State: $state - City: $city"
|
||||
}
|
||||
|
||||
var state = State.START
|
||||
|
||||
private fun getRandomCity(): Location{
|
||||
fun getRandomCity(): Location{
|
||||
return cities.random()
|
||||
}
|
||||
|
||||
private fun getRandomPoi(): Location{
|
||||
fun getRandomPoi(): Location{
|
||||
return pois.random()
|
||||
}
|
||||
|
||||
private fun getRandomGESocialLocation(): Location{
|
||||
return socialLocationsGE.random()
|
||||
}
|
||||
|
||||
private fun getRandomGELocation(): Location {
|
||||
return cityLocationsGE.random()
|
||||
}
|
||||
|
||||
private fun randomNumberFromOne(maxInt: Int): Int {
|
||||
return Random.nextInt(0, maxInt)
|
||||
}
|
||||
|
||||
private fun otherPlayersNearby(): Boolean {
|
||||
val localPlayers = RegionManager.getLocalPlayers(bot)
|
||||
val otherPlayers = localPlayers.filter { it.name != bot.name }
|
||||
return otherPlayers.isNotEmpty()
|
||||
}
|
||||
|
||||
private fun checkNearBank() {
|
||||
if(bankMap[city] == null){
|
||||
scriptAPI.teleport(getRandomCity().also { city = it })
|
||||
} else {
|
||||
if(bankMap[city]?.insideBorder(bot) == true){
|
||||
state = State.FIND_BANK
|
||||
} else {
|
||||
bankMap[city]?.let { scriptAPI.walkTo(it.randomLoc) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkCounter(maxCounter: Int) {
|
||||
if (counter++ >= maxCounter) {
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
}
|
||||
|
||||
private fun teleportToRandomCity() {
|
||||
city = getRandomCity()
|
||||
when (city) {
|
||||
neGEClerk -> { scriptAPI.teleport(scriptAPI.randomizeLocationInRanges(city,-3,2,0,1,0)) }
|
||||
swGEClerk -> { scriptAPI.teleport(scriptAPI.randomizeLocationInRanges(city,-2,3,-1,0,0)) }
|
||||
nwGEBanker -> { scriptAPI.teleport(scriptAPI.randomizeLocationInRanges(city,-2,0,-3,2,0)) }
|
||||
seGEBanker -> { scriptAPI.teleport(scriptAPI.randomizeLocationInRanges(city,0,2,-2,3,0)) }
|
||||
else -> { scriptAPI.teleport(scriptAPI.randomizeLocationInRanges(city,-1,1,-1,1,0)) }
|
||||
}
|
||||
}
|
||||
|
||||
val resources = listOf(
|
||||
"Rocks","Tree","Oak","Willow",
|
||||
"Maple tree","Yew","Magic tree",
|
||||
"Teak","Mahogany")
|
||||
|
||||
//TODO: Optimise and adjust how bots handle picking up ground items further.
|
||||
fun immerse() {
|
||||
if (counter++ >= Random.nextInt(150,300)) { state = State.TELEPORTING }
|
||||
if (counter++ == 180) {state = State.TELEPORTING
|
||||
}
|
||||
val items = AIRepository.groundItems[bot]
|
||||
if (Random.nextBoolean()) {
|
||||
if (items.isNullOrEmpty()) {
|
||||
|
|
@ -163,13 +98,33 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
state = State.LOOT_DELAY
|
||||
}
|
||||
if (bot.inventory.isFull) {
|
||||
checkNearBank()
|
||||
if(bankMap[city] == null){
|
||||
scriptAPI.teleport(getRandomCity().also { city = it })
|
||||
} else {
|
||||
if(bankMap[city]?.insideBorder(bot) == true){
|
||||
state = State.FIND_BANK
|
||||
} else {
|
||||
scriptAPI.walkTo(bankMap[city]?.randomLoc ?: Location(0, 0, 0))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
if (bot.inventory.isFull){
|
||||
checkNearBank()
|
||||
if(bankMap[city] == null){
|
||||
scriptAPI.teleport(getRandomCity().also { city = it })
|
||||
} else {
|
||||
if(bankMap[city]?.insideBorder(bot) == true){
|
||||
state = State.FIND_BANK
|
||||
} else {
|
||||
scriptAPI.walkTo(bankMap[city]?.randomLoc ?: Location(0, 0, 0))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
val resources = listOf(
|
||||
"Rocks","Tree","Oak","Willow",
|
||||
"Maple tree","Yew","Magic tree",
|
||||
"Teak","Mahogany")
|
||||
val resource = scriptAPI.getNearestNodeFromList(resources,true)
|
||||
if(resource != null){
|
||||
if(resource.name.contains("ocks")) InteractionListeners.run(resource.id,
|
||||
|
|
@ -182,17 +137,18 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
}
|
||||
|
||||
fun refresh() {
|
||||
// log(this::class.java, Log.WARN, "${bot.username} refreshed from $state at $city with $ticks and $counter counter.")
|
||||
scriptAPI.teleport(lumbridge)
|
||||
freshspawn = true
|
||||
state = State.START
|
||||
}
|
||||
|
||||
var poi = false
|
||||
var poiloc = karamja
|
||||
|
||||
//Adventure Bots Actual Code STARTS HERE!!!
|
||||
// 100 ticks = 60 seconds
|
||||
override fun tick() {
|
||||
ticks++
|
||||
// Hard refresh
|
||||
if (ticks >= 1000) {
|
||||
if (ticks++ >= 800) {
|
||||
ticks = 0
|
||||
refresh()
|
||||
return
|
||||
|
|
@ -230,42 +186,49 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
}
|
||||
return
|
||||
} else {
|
||||
state = State.ADVENTURE
|
||||
state = State.EXPLORE
|
||||
}
|
||||
}
|
||||
|
||||
State.START -> {
|
||||
if (freshspawn) {
|
||||
freshspawn = false
|
||||
scriptAPI.randomWalkTo(lumbridge, randomNumberFromOne(25))
|
||||
scriptAPI.randomWalkTo(lumbridge, 20)
|
||||
} else {
|
||||
city = getRandomCity()
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
}
|
||||
|
||||
State.TELEPORTING -> {
|
||||
if (freshspawn){ freshspawn = false }
|
||||
teleportToRandomCity()
|
||||
poi = false
|
||||
sold = false
|
||||
ticks = 0
|
||||
counter = 0
|
||||
state = State.ADVENTURE
|
||||
return
|
||||
if (bot.location != city) {
|
||||
poi = false
|
||||
scriptAPI.teleport(city)
|
||||
} else {
|
||||
poi = false
|
||||
state = State.EXPLORE
|
||||
}
|
||||
}
|
||||
|
||||
State.ADVENTURE -> {
|
||||
checkCounter(800)
|
||||
if (randomNumberFromOne(chance) <= 10) {
|
||||
if (otherPlayersNearby()) {
|
||||
State.EXPLORE -> {
|
||||
if (counter++ == 350) {
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
|
||||
val chance = if (city == ge || city == ge2) 5000 else 2500
|
||||
if (RandomFunction.random(chance) <= 10) {
|
||||
val nearbyPlayers = RegionManager.getLocalPlayers(bot)
|
||||
if (nearbyPlayers.isNotEmpty()) {
|
||||
ticks = 0
|
||||
dialogue()
|
||||
}
|
||||
}
|
||||
|
||||
if (!poi && randomNumberFromOne(1000) <= 75) {
|
||||
val roamDistance = if (!cityLocationsGE.contains(city)) 225 else randomNumberFromOne(5)
|
||||
if (cityLocationsGE.contains(city) && randomNumberFromOne(100) < 90) {
|
||||
if (RandomFunction.random(1000) <= 150 && !poi) {
|
||||
val roamDistance = if (city != ge && city != ge2) 225 else 7
|
||||
if ((city == ge || city == ge2) && RandomFunction.random(100) < 90) {
|
||||
if (!bot.bank.isEmpty) {
|
||||
state = State.FIND_GE
|
||||
}
|
||||
|
|
@ -275,46 +238,33 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
return
|
||||
}
|
||||
|
||||
if (poi && randomNumberFromOne(1000) <= 100){
|
||||
immerse()
|
||||
return
|
||||
}
|
||||
|
||||
if (poi && randomNumberFromOne(1000) <= 25){
|
||||
dialogue()
|
||||
}
|
||||
|
||||
if (poi && randomNumberFromOne(1000) <= 50){
|
||||
if (RandomFunction.random(1000) <= 50 && poi){
|
||||
val roamDistancePoi = when(poiloc){
|
||||
gemrocks, chaosnpc, chaosnpc2 -> 1
|
||||
magics, coalTrucks -> 7
|
||||
miningguild, teakfarm, crawlinghands -> 5
|
||||
varLumberYard -> 20
|
||||
keldagrimout, teak1 -> 30
|
||||
eaglespeek, isafdar -> 40
|
||||
teakfarm, crawlinghands -> 5
|
||||
treegnome -> 50
|
||||
isafdar -> 40
|
||||
eaglespeek -> 40
|
||||
keldagrimout -> 30
|
||||
teak1 -> 30
|
||||
miningguild -> 5
|
||||
magics, coal -> 7
|
||||
gemrocks, chaosnpc, chaosnpc2 -> 1
|
||||
else -> 60
|
||||
}
|
||||
scriptAPI.randomWalkTo(poiloc,roamDistancePoi)
|
||||
return
|
||||
}
|
||||
|
||||
if (randomNumberFromOne(1000) <= 75) {
|
||||
if (!cityLocationsGE.contains(city)) {
|
||||
ticks = 0
|
||||
if (RandomFunction.random(1000) <= 75) {
|
||||
if (city != ge && city != ge2) {
|
||||
immerse()
|
||||
return
|
||||
} else if (randomNumberFromOne(chance) <= 55 && otherPlayersNearby()) {
|
||||
ticks = 0
|
||||
dialogue()
|
||||
} else {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if (cityLocationsGE.contains(city) && randomNumberFromOne(1000) <= 50) {
|
||||
state = State.IDLE_GE
|
||||
}
|
||||
|
||||
if (!poi && randomNumberFromOne(1000) <= 5) {
|
||||
if (RandomFunction.random(20000) <= 60 && !poi) {
|
||||
poiloc = getRandomPoi()
|
||||
city = teak1
|
||||
poi = true
|
||||
|
|
@ -322,24 +272,26 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
return
|
||||
}
|
||||
|
||||
if (cityLocationsGE.contains(city) && randomNumberFromOne(1000) <= 100) {
|
||||
state = State.TELEPORTING
|
||||
return
|
||||
}
|
||||
|
||||
if (cityLocationsGE.contains(city)) {
|
||||
return
|
||||
}
|
||||
|
||||
if (poi && randomNumberFromOne(1000) <= 20){
|
||||
state = State.TELEPORTING
|
||||
return
|
||||
}
|
||||
|
||||
if (counter++ >= 750 && randomNumberFromOne(100) <= 50) {
|
||||
// log(this::class.java, Log.FINE, "${bot.username} has moved on to a different city at $ticks ticks and $counter counter.")
|
||||
if ((city == ge || city == ge2) && RandomFunction.random(1000) >= 999) {
|
||||
ticks = 0
|
||||
city = getRandomCity()
|
||||
if (randomNumberFromOne(100) % 2 == 0) {
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
|
||||
if (city == ge || city == ge2) {
|
||||
return
|
||||
}
|
||||
|
||||
if (city == teak1 && counter++ >= 240){
|
||||
city = getRandomCity()
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
|
||||
if (counter++ >= 240 && RandomFunction.random(100) >= 10) {
|
||||
city = getRandomCity()
|
||||
if (RandomFunction.random(100) % 2 == 0) {
|
||||
counter = 0
|
||||
ticks = 0
|
||||
state = State.TELEPORTING
|
||||
} else {
|
||||
if (citygroupA.contains(city)) {
|
||||
|
|
@ -357,122 +309,122 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
return
|
||||
}
|
||||
|
||||
State.IDLE_GE -> {
|
||||
returnToAdventure = Random.nextInt(350, 750)
|
||||
if (counter++ >= returnToAdventure){
|
||||
if (randomNumberFromOne(100) <= 25){
|
||||
ticks = 0
|
||||
counter = 0
|
||||
poiloc = getRandomPoi()
|
||||
city = teak1
|
||||
poi = true
|
||||
scriptAPI.teleport(poiloc)
|
||||
state = State.ADVENTURE
|
||||
return
|
||||
} else {
|
||||
counter = 0
|
||||
ticks = 0
|
||||
state = State.TELEPORTING
|
||||
return
|
||||
}
|
||||
State.GE -> {
|
||||
var ge = false
|
||||
if (counter++ == 180) {
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
if (cityLocationsGE.contains(city)){
|
||||
if (randomNumberFromOne(1000) <= 5) {
|
||||
if (!sold) {
|
||||
if (counter++ >= 15) {
|
||||
sold = true
|
||||
ge = true
|
||||
counter = 0
|
||||
ticks = 0
|
||||
geSocialLoc = scriptAPI.randomizeLocationInRanges(getRandomGESocialLocation(),-1,1,-1,1,0)
|
||||
} else if (randomNumberFromOne(1000) <= 10) {
|
||||
ticks = 0
|
||||
scriptAPI.randomWalkTo(geSocialLoc, randomNumberFromOne(5))
|
||||
return
|
||||
}
|
||||
if (randomNumberFromOne(1000) <= 5 && otherPlayersNearby()){
|
||||
ticks = 0
|
||||
dialogue()
|
||||
} else if (randomNumberFromOne(1000) <= 250){
|
||||
scriptAPI.sellAllOnGeAdv()
|
||||
return
|
||||
}
|
||||
} else if (ge && sold) {
|
||||
ge = false
|
||||
city = getRandomCity()
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
State.FIND_GE -> {
|
||||
if (counter++ == 180) {
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
sold = false
|
||||
val ge: Scenery? = scriptAPI.getNearestNode("Desk", true) as Scenery?
|
||||
if (ge == null || bot.bank.isEmpty) state = State.ADVENTURE
|
||||
if (ge == null || bot.bank.isEmpty) state = State.EXPLORE
|
||||
class GEPulse : MovementPulse(bot, ge, DestinationFlag.OBJECT) {
|
||||
override fun pulse(): Boolean {
|
||||
bot.faceLocation(ge?.location)
|
||||
return true.also { state = State.GE }
|
||||
state = State.GE
|
||||
return true
|
||||
}
|
||||
}
|
||||
if (ge == null || bot.bank.isEmpty) state = State.ADVENTURE
|
||||
if (ge != null && !bot.bank.isEmpty) {
|
||||
if (randomNumberFromOne(1000) <= 25 && otherPlayersNearby()){
|
||||
dialogue()
|
||||
scriptAPI.randomWalkTo(geSocialLoc, randomNumberFromOne(5))
|
||||
} else if (randomNumberFromOne(500) <= 50) {
|
||||
GameWorld.Pulser.submit(GEPulse())
|
||||
}
|
||||
counter = 0
|
||||
scriptAPI.randomWalkTo(geloc, 3)
|
||||
GameWorld.Pulser.submit(GEPulse())
|
||||
}
|
||||
checkCounter(500)
|
||||
return
|
||||
}
|
||||
|
||||
State.GE -> {
|
||||
geClerksloc = clerkLocationsGe.random()
|
||||
geWait = Random.nextInt(35, 100)
|
||||
geLongWait = Random.nextInt(350, 750)
|
||||
if (!sold) {
|
||||
if (randomNumberFromOne(500) <= 25){ scriptAPI.randomWalkTo(geClerksloc, randomNumberFromOne(4))}
|
||||
if (counter++ >= geWait) {
|
||||
scriptAPI.randomWalkTo(geClerksloc, randomNumberFromOne(1))
|
||||
sold = true
|
||||
counter = 0
|
||||
ticks = 0
|
||||
scriptAPI.sellAllOnGeAdv()
|
||||
state = State.TELEPORTING
|
||||
return
|
||||
}
|
||||
} else if (counter++ >= geLongWait) {
|
||||
state = State.TELEPORTING
|
||||
return
|
||||
}
|
||||
checkCounter(1000)
|
||||
return
|
||||
}
|
||||
|
||||
State.FIND_BANK -> {
|
||||
val bank: Scenery? = scriptAPI.getNearestNode("Bank booth", true) as Scenery?
|
||||
if (bank == null) { state = State.TELEPORTING }
|
||||
if (bank != null && randomNumberFromOne(100) <= 5) {
|
||||
scriptAPI.depositAtBank()
|
||||
} else if (bank != null && randomNumberFromOne(100) <= 5){
|
||||
scriptAPI.randomWalkTo(bank.location,3)
|
||||
if (counter++ == 300) {
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
val bank: Scenery? = scriptAPI.getNearestNode("Bank booth", true) as Scenery?
|
||||
if (badedge.insideBorder(bot) || bot.location == badedge2 || bot.location == badedge3 || bot.location == badedge4) {
|
||||
bot.randomWalk(5, 5)
|
||||
}
|
||||
if (bank == null) state = State.EXPLORE
|
||||
class BankingPulse : MovementPulse(bot, bank, DestinationFlag.OBJECT) {
|
||||
override fun pulse(): Boolean {
|
||||
bot.faceLocation(bank?.location)
|
||||
state = State.IDLE_BANKS
|
||||
return true
|
||||
}
|
||||
}
|
||||
if (bank != null) {
|
||||
bot.pulseManager.run(BankingPulse())
|
||||
}
|
||||
checkCounter(500)
|
||||
return
|
||||
}
|
||||
|
||||
State.IDLE_BANKS -> {
|
||||
if (counter++ == 300) {
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
if (RandomFunction.random(1000) < 100) {
|
||||
for (item in bot.inventory.toArray()) {
|
||||
item ?: continue
|
||||
when (item.id) {
|
||||
1359, 590, 1271, 995 -> continue
|
||||
}
|
||||
bot.bank.add(item)
|
||||
bot.inventory.remove(item)
|
||||
}
|
||||
counter = 0
|
||||
state = State.EXPLORE
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
State.FIND_CITY -> {
|
||||
if (counter++ >= 500 || cityLocationsGE.contains(city)){
|
||||
if (counter++ >= 600 || (city == ge || city == ge2)) {
|
||||
counter = 0
|
||||
scriptAPI.teleport(getRandomCity().also { city = it })
|
||||
state = State.ADVENTURE
|
||||
state = State.EXPLORE
|
||||
}
|
||||
if (bot.location.equals(city)) {
|
||||
state = State.ADVENTURE
|
||||
state = State.EXPLORE
|
||||
} else {
|
||||
scriptAPI.randomWalkTo(city, randomNumberFromOne(10))
|
||||
scriptAPI.randomWalkTo(city, 5)
|
||||
}
|
||||
checkCounter(600)
|
||||
return
|
||||
}
|
||||
|
||||
State.IDLE_CITY -> {
|
||||
if (counter++ == 300) {
|
||||
state = State.TELEPORTING
|
||||
}
|
||||
var random = (120..300).random()
|
||||
if (counter++ == random && RandomFunction.random(1000) % 33 == 0) {
|
||||
counter = 0
|
||||
state = State.EXPLORE
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fun dialogue() {
|
||||
val localPlayer = RegionManager.getLocalPlayers(bot).random()
|
||||
val until = 1225 - dateCode
|
||||
val lineStd = dialogue.getLines("standard").rand()
|
||||
var lineAlt = ""
|
||||
|
|
@ -503,29 +455,20 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
dateCode == 404 -> lineAlt = dialogue.getLines("easter").rand()
|
||||
}
|
||||
|
||||
var localPlayers = RegionManager.getLocalPlayers(bot)
|
||||
if (localPlayers.isNotEmpty()) {
|
||||
val localPlayer = localPlayers
|
||||
.filter { it.name != bot.name }
|
||||
.randomOrNull()
|
||||
if (localPlayer != null) {
|
||||
val chat = if (lineAlt.isNotEmpty() && Random.nextBoolean()) { lineAlt } else { lineStd }
|
||||
.replace("@name", localPlayer.username)
|
||||
.replace("@timer", until.toString())
|
||||
scriptAPI.sendChat(chat)
|
||||
} else {
|
||||
val chat = if (lineAlt.isNotEmpty() && Random.nextBoolean()) { lineAlt } else { lineStd }
|
||||
scriptAPI.sendChat(chat)
|
||||
}
|
||||
}
|
||||
val chat = if (lineAlt.isNotEmpty() && Random.nextBoolean()) { lineAlt } else { lineStd }
|
||||
.replace("@name", localPlayer.username)
|
||||
.replace("@timer", until.toString())
|
||||
|
||||
scriptAPI.sendChat(chat)
|
||||
}
|
||||
|
||||
enum class State{
|
||||
START,
|
||||
ADVENTURE,
|
||||
EXPLORE,
|
||||
FIND_BANK,
|
||||
IDLE_BANKS,
|
||||
FIND_CITY,
|
||||
IDLE_GE,
|
||||
IDLE_CITY,
|
||||
GE,
|
||||
TELEPORTING,
|
||||
LOOT,
|
||||
|
|
@ -546,94 +489,44 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
}
|
||||
|
||||
companion object {
|
||||
// Start Cities
|
||||
val badedge = ZoneBorders(3094, 3494, 3096, 3497)
|
||||
val badedge2 = Location.create(3094, 3492, 0)
|
||||
val badedge3 = Location.create(3094, 3490, 0)
|
||||
val badedge4 = Location.create(3094, 3494, 0)
|
||||
|
||||
val yanille: Location = Location.create(2615, 3104, 0)
|
||||
val ardougne: Location = Location.create(2662, 3304, 0)
|
||||
val seers: Location = Location.create(2726, 3485, 0)
|
||||
val edgeville: Location = Location.create(3088, 3486, 0)
|
||||
val ge: Location = Location.create(3168, 3487, 0)
|
||||
val ge2: Location = Location.create(3161, 3493, 0)
|
||||
val catherby: Location = Location.create(2809, 3435, 0)
|
||||
val falador: Location = Location.create(2965, 3380, 0)
|
||||
val varrock: Location = Location.create(3213, 3428, 0)
|
||||
val draynor: Location = Location.create(3080, 3250, 0)
|
||||
val rimmington: Location = Location.create(2977, 3239, 0)
|
||||
val lumbridge: Location = Location.create(3222, 3219, 0)
|
||||
val karamja: Location = Location.create(2849, 3033, 0)
|
||||
val alkharid: Location = Location.create(3297, 3219, 0)
|
||||
|
||||
// Start POI
|
||||
val feldiphills: Location = Location.create(2535, 2919, 0)
|
||||
val isafdar: Location = Location.create(2241, 3217, 0)
|
||||
val eaglespeek: Location = Location.create(2333, 3579, 0)
|
||||
val canafis: Location = Location.create(3492, 3485, 0)
|
||||
val treegnome: Location = Location.create(2437, 3441, 0)
|
||||
val teak1: Location = Location.create(2334, 3048, 0)
|
||||
val teakfarm: Location = Location.create(2825, 3085, 0)
|
||||
val keldagrimout: Location = Location.create(2724,3692, 0)
|
||||
val miningguild: Location = Location.create(3046,9740, 0)
|
||||
val magics: Location = Location.create(2285,3146, 0)
|
||||
val coalTrucks: Location = Location.create(2581,3481, 0)
|
||||
val crawlinghands: Location = Location.create(3422,3548, 0)
|
||||
val gemrocks: Location = Location.create(2825,2997, 0)
|
||||
val chaosnpc: Location = Location.create(2612,9484, 0)
|
||||
val chaosnpc2: Location = Location.create(2586, 9501, 0)
|
||||
val varLumberYard: Location = Location.create(3289, 3482, 0)
|
||||
val taverly: Location = Location.create(2909, 3436, 0)
|
||||
|
||||
val swGEClerk: Location = Location.create(3164, 3487, 0)
|
||||
val neGEClerk: Location = Location.create(3165, 3492, 0)
|
||||
val nwGEBanker: Location = Location.create(3162, 3490, 0)
|
||||
val seGEBanker: Location = Location.create(3167, 3489, 0)
|
||||
|
||||
val badedge = ZoneBorders(3094, 3494, 3096, 3497)
|
||||
val badedge2: Location = Location.create(3094, 3492, 0)
|
||||
val badedge3: Location = Location.create(3094, 3490, 0)
|
||||
val badedge4: Location = Location.create(3094, 3494, 0)
|
||||
|
||||
val karamja = Location.create(2849, 3033, 0)
|
||||
val alkharid = Location.create(3297, 3219, 0)
|
||||
val feldiphills = Location.create(2535, 2919, 0)
|
||||
val isafdar = Location.create(2241, 3217, 0)
|
||||
val eaglespeek = Location.create(2333, 3579, 0)
|
||||
val canafis = Location.create(3492, 3485, 0)
|
||||
val treegnome = Location.create(2437, 3441, 0)
|
||||
val teak1 = Location.create(2334, 3048, 0)
|
||||
val teakfarm = Location.create(2825, 3085, 0)
|
||||
val keldagrimout = Location.create(2724,3692,0)
|
||||
val miningguild = Location.create(3046,9740,0)
|
||||
val magics = Location.create(2285,3146,0)
|
||||
val coal = Location.create(2581,3481,0)
|
||||
val crawlinghands = Location.create(3422,3548,0)
|
||||
val gemrocks = Location.create(2825,2997,0)
|
||||
val chaosnpc = Location.create(2612,9484,0)
|
||||
val chaosnpc2 = Location.create(2580,9501,0)
|
||||
val taverly = Location.create(2909, 3436, 0)
|
||||
var citygroupA = listOf(falador, varrock, draynor, rimmington, lumbridge, edgeville)
|
||||
var citygroupB = listOf(yanille, ardougne, seers, catherby)
|
||||
|
||||
val cities = listOf(
|
||||
swGEClerk, neGEClerk, nwGEBanker, seGEBanker,
|
||||
yanille, ardougne, seers, catherby,
|
||||
falador, varrock, draynor, rimmington,
|
||||
lumbridge, edgeville
|
||||
)
|
||||
|
||||
val pois = listOf(
|
||||
karamja, karamja, alkharid,
|
||||
alkharid, feldiphills, feldiphills,
|
||||
isafdar, eaglespeek, eaglespeek,
|
||||
canafis, treegnome, treegnome,
|
||||
teak1, teakfarm, keldagrimout,
|
||||
miningguild, coalTrucks, crawlinghands,
|
||||
magics, gemrocks, chaosnpc, chaosnpc,
|
||||
chaosnpc2, taverly,
|
||||
varLumberYard)
|
||||
|
||||
val cityLocationsGE = listOf(swGEClerk, neGEClerk, nwGEBanker, seGEBanker)
|
||||
|
||||
val socialLocationsGE = listOf(
|
||||
Location.create(3158, 3483, 0),
|
||||
Location.create(3165, 3480, 0),
|
||||
Location.create(3172, 3483, 0),
|
||||
Location.create(3174, 3489, 0),
|
||||
Location.create(3171, 3497, 0),
|
||||
Location.create(3164, 3499, 0),
|
||||
Location.create(3157, 3497, 0),
|
||||
Location.create(3155, 3489, 0),
|
||||
Location.create(3167, 3492, 0),
|
||||
Location.create(3162, 3492, 0),
|
||||
Location.create(3162, 3487, 0),
|
||||
Location.create(3167, 3487, 0)
|
||||
)
|
||||
|
||||
val clerkLocationsGe = listOf(
|
||||
Location.create(3165, 3492, 0),
|
||||
Location.create(3164, 3492, 0),
|
||||
Location.create(3164, 3487, 0),
|
||||
Location.create(3165, 3487, 0)
|
||||
)
|
||||
|
||||
var bankMap = mapOf<Location, ZoneBorders>(
|
||||
falador to ZoneBorders(2950, 3374, 2943, 3368),
|
||||
varrock to ZoneBorders(3182, 3435, 3189, 3446),
|
||||
|
|
@ -645,10 +538,22 @@ class Adventurer(val style: CombatStyle): Script() {
|
|||
catherby to ZoneBorders(2807, 3438, 2811, 3441)
|
||||
)
|
||||
|
||||
val cities = listOf(yanille, ardougne, seers, catherby, falador, varrock,
|
||||
draynor, rimmington, lumbridge, ge, ge2, edgeville)
|
||||
|
||||
val pois = listOf(
|
||||
karamja, karamja, alkharid,
|
||||
alkharid, feldiphills, feldiphills,
|
||||
isafdar, eaglespeek, eaglespeek,
|
||||
canafis, treegnome, treegnome,
|
||||
teak1, teakfarm, keldagrimout,
|
||||
miningguild, coal, crawlinghands,
|
||||
magics, gemrocks, chaosnpc, chaosnpc,
|
||||
chaosnpc2, taverly)
|
||||
|
||||
private val whiteWolfMountainTop = Location(2850, 3496, 0)
|
||||
private val catherbyToTopOfWhiteWolf = arrayOf(Location(2856, 3442, 0), Location(2848, 3455, 0), Location(2848, 3471, 0), Location(2848, 3487, 0))
|
||||
private val tavleryToTopOfWhiteWolf = arrayOf(Location(2872, 3425, 0), Location(2863, 3440, 0), Location(2863, 3459, 0), Location(2854, 3475, 0), Location(2859, 3488, 0))
|
||||
|
||||
val common_stuck_locations = mapOf(
|
||||
// South of Tavlery dungeon
|
||||
ZoneBorders(2878, 3386, 2884, 3395) to { it: Adventurer ->
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@ import core.api.*
|
|||
import core.game.bots.*
|
||||
import core.game.ge.GrandExchange
|
||||
import core.game.interaction.DestinationFlag
|
||||
import core.game.interaction.IntType
|
||||
import core.game.interaction.InteractionListeners
|
||||
import core.game.interaction.MovementPulse
|
||||
import core.game.node.Node
|
||||
import core.game.node.entity.skill.Skills
|
||||
|
|
@ -14,7 +16,6 @@ import core.game.node.item.Item
|
|||
import core.game.world.map.Location
|
||||
import core.game.world.map.zone.ZoneBorders
|
||||
import org.rs09.consts.Items
|
||||
import content.data.Quests
|
||||
|
||||
@PlayerCompatible
|
||||
@ScriptName("Falador Cannonball Smelter")
|
||||
|
|
@ -272,6 +273,6 @@ class CannonballSmelter : Script() {
|
|||
skills.put(Skills.HITPOINTS,99)
|
||||
skills.put(Skills.DEFENCE,99)
|
||||
skills.put(Skills.SMITHING,35)
|
||||
quests.add(Quests.DWARF_CANNON)
|
||||
quests.add("Dwarf Cannon")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,8 +8,6 @@ import core.game.world.map.zone.ZoneBorders
|
|||
import org.rs09.consts.Items
|
||||
import core.game.bots.SkillingBotAssembler
|
||||
import core.game.bots.Script
|
||||
import core.game.interaction.IntType
|
||||
import core.game.interaction.InteractionListeners
|
||||
|
||||
class DraynorFisher : Script() {
|
||||
val fishingZone = ZoneBorders(3085, 3223,3089, 3233)
|
||||
|
|
@ -24,11 +22,7 @@ class DraynorFisher : Script() {
|
|||
scriptAPI.walkTo(fishingZone.randomLoc)
|
||||
else {
|
||||
val spot = scriptAPI.getNearestNode(316,false)
|
||||
if (spot != null) {
|
||||
InteractionListeners.run(spot.id, IntType.NPC,"net",bot,spot)
|
||||
} else {
|
||||
scriptAPI.walkTo(fishingZone.randomLoc)
|
||||
}
|
||||
spot?.interaction?.handle(bot,spot.interaction[0]) ?: scriptAPI.walkTo(fishingZone.randomLoc)
|
||||
if(bot.inventory.getMaximumAdd(Item(4151)) < 5)
|
||||
state = State.BANKING
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
package content.global.bots
|
||||
|
||||
import content.global.skill.crafting.glass.GlassCraftingPulse
|
||||
import content.global.skill.crafting.glass.GlassProduct
|
||||
import core.game.bots.Script
|
||||
import core.game.bots.SkillingBotAssembler
|
||||
import content.global.handlers.iface.GlassInterface
|
||||
import core.game.node.entity.skill.Skills
|
||||
import content.global.skill.crafting.GlassProduct
|
||||
import core.game.node.item.Item
|
||||
import org.rs09.consts.Items
|
||||
import core.game.bots.SkillingBotAssembler
|
||||
import core.game.bots.Script
|
||||
|
||||
class GlassBlowingBankstander : Script(){
|
||||
var state = State.BLOWING
|
||||
|
|
@ -17,7 +17,7 @@ class GlassBlowingBankstander : Script(){
|
|||
State.BLOWING -> {
|
||||
bot.inventory.add(Item(Items.GLASSBLOWING_PIPE_1785))
|
||||
bot.inventory.add(Item(Items.MOLTEN_GLASS_1775,27))
|
||||
bot.pulseManager.run(GlassCraftingPulse(bot, GlassProduct.ORB, 27))
|
||||
GlassInterface.make(bot, GlassProduct.ORB,27)
|
||||
State.BANKING
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
package content.global.bots
|
||||
|
||||
import content.global.skill.prayer.BoneBuryListener
|
||||
import core.api.submitIndividualPulse
|
||||
import core.game.interaction.DestinationFlag
|
||||
import core.game.interaction.MovementPulse
|
||||
import core.game.node.entity.Entity
|
||||
|
|
@ -9,6 +7,7 @@ import core.game.node.entity.combat.CombatStyle
|
|||
import core.game.node.entity.combat.InteractionType
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.node.entity.skill.Skills
|
||||
import content.global.skill.prayer.BoneBuryingOptionPlugin
|
||||
import core.game.node.item.Item
|
||||
import core.game.system.task.Pulse
|
||||
import core.game.world.map.Location
|
||||
|
|
@ -22,7 +21,6 @@ import core.game.bots.CombatBotAssembler
|
|||
import core.game.bots.Script
|
||||
import core.game.interaction.IntType
|
||||
import core.game.interaction.InteractionListeners
|
||||
import core.game.node.Node
|
||||
import core.game.node.entity.combat.CombatSwingHandler
|
||||
import core.game.node.entity.combat.MeleeSwingHandler
|
||||
import kotlin.random.Random
|
||||
|
|
@ -226,7 +224,7 @@ class GreenDragonKiller(val style: CombatStyle, area: ZoneBorders? = null) : Scr
|
|||
|
||||
private fun attemptToBuryBone() {
|
||||
if (bot.inventory.containsAtLeastOneItem(Items.DRAGON_BONES_536)) {
|
||||
InteractionListeners.run(Items.DRAGON_BONES_536, IntType.ITEM, "bury", bot, bot.inventory.get(Item(Items.DRAGON_BONES_536)))
|
||||
BoneBuryingOptionPlugin().handle(bot, bot.inventory.get(Item(Items.DRAGON_BONES_536)), "bury")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ class NonBankingMiner : Script() {
|
|||
}
|
||||
//checks if the bot has tin ore in his inventory and drops it if he does
|
||||
if(bot.inventory.containsAtLeastOneItem(Items.TIN_ORE_438)){
|
||||
produceGroundItem(bot,438,1,bot.location)
|
||||
produceGroundItem(null,438,1,bot.location)
|
||||
bot.inventory.remove(Item(Items.TIN_ORE_438,1))
|
||||
}
|
||||
//The following is to prevent lucky bots from breaking by having a full inventory of gems
|
||||
|
|
|
|||
|
|
@ -45,7 +45,18 @@ class BankerDialogue(player: Player? = null) : core.game.dialogue.DialoguePlugin
|
|||
|
||||
2 -> showTopics(
|
||||
Topic(core.game.dialogue.FacialExpression.FRIENDLY, "I'd like to access my bank account, please.", 10),
|
||||
Topic(core.game.dialogue.FacialExpression.FRIENDLY, "I'd like to switch my default bank account.", 7),
|
||||
IfTopic(
|
||||
core.game.dialogue.FacialExpression.FRIENDLY,
|
||||
"I'd like to switch to my ${getBankAccountName(player, true)} bank account.",
|
||||
13,
|
||||
hasActivatedSecondaryBankAccount(player)
|
||||
),
|
||||
IfTopic(
|
||||
core.game.dialogue.FacialExpression.FRIENDLY,
|
||||
"I'd like to open a secondary bank account.",
|
||||
20,
|
||||
!hasActivatedSecondaryBankAccount(player)
|
||||
),
|
||||
Topic(core.game.dialogue.FacialExpression.FRIENDLY, "I'd like to check my PIN settings.", 11),
|
||||
Topic(core.game.dialogue.FacialExpression.FRIENDLY, "I'd like to collect items.", 12),
|
||||
Topic(core.game.dialogue.FacialExpression.ASKING, "What is this place?", 3),
|
||||
|
|
@ -67,53 +78,6 @@ class BankerDialogue(player: Player? = null) : core.game.dialogue.DialoguePlugin
|
|||
"Leave your valuables with us if you want to keep them safe."
|
||||
).also { stage = END_DIALOGUE }
|
||||
|
||||
7 -> showTopics(
|
||||
IfTopic(
|
||||
core.game.dialogue.FacialExpression.FRIENDLY,
|
||||
"I'd like to turn on the Clan bank, please.",
|
||||
8,
|
||||
!(player.getAttribute("clanbank:enabled",false))
|
||||
),
|
||||
IfTopic(
|
||||
core.game.dialogue.FacialExpression.FRIENDLY,
|
||||
"I'd like to turn off the Clan bank, please.",
|
||||
9,
|
||||
player.getAttribute("clanbank:enabled",false)
|
||||
),
|
||||
IfTopic(
|
||||
core.game.dialogue.FacialExpression.FRIENDLY,
|
||||
"I'd like to switch to my ${getBankAccountName(player, true)} bank account.",
|
||||
13,
|
||||
hasActivatedSecondaryBankAccount(player)
|
||||
),
|
||||
IfTopic(
|
||||
core.game.dialogue.FacialExpression.FRIENDLY,
|
||||
"I'd like to open a secondary bank account.",
|
||||
20,
|
||||
!hasActivatedSecondaryBankAccount(player)
|
||||
),
|
||||
)
|
||||
|
||||
8 -> {
|
||||
player.setAttribute("/save:clanbank:enabled", true)
|
||||
|
||||
npcl(
|
||||
core.game.dialogue.FacialExpression.FRIENDLY,
|
||||
"The Clan bank has been enabled. " +
|
||||
"If the Clan owner is online, you will access their primary bank account instead of your own."
|
||||
).also { stage = 2 }
|
||||
}
|
||||
|
||||
9 -> {
|
||||
player.removeAttribute("clanbank:enabled")
|
||||
|
||||
npcl(
|
||||
core.game.dialogue.FacialExpression.FRIENDLY,
|
||||
"The Clan bank has been disabled. " +
|
||||
"You will now always open your personal bank account."
|
||||
).also { stage = 2 }
|
||||
}
|
||||
|
||||
10 -> {
|
||||
openBankAccount(player)
|
||||
end()
|
||||
|
|
|
|||
|
|
@ -3,227 +3,160 @@ package content.global.dialogue
|
|||
import content.global.skill.farming.FarmerPayOptionDialogue
|
||||
import content.global.skill.farming.Farmers
|
||||
import content.global.skill.farming.FarmingPatch
|
||||
import content.global.skill.farming.PatchType
|
||||
import core.api.*
|
||||
import core.game.dialogue.FacialExpression
|
||||
import core.game.dialogue.IfTopic
|
||||
import core.game.dialogue.Topic
|
||||
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 core.tools.END_DIALOGUE
|
||||
import core.tools.START_DIALOGUE
|
||||
|
||||
@Initializable
|
||||
class GardenerDialoguePlugin(player: Player? = null) : core.game.dialogue.DialoguePlugin(player) {
|
||||
override fun newInstance(player: Player?): core.game.dialogue.DialoguePlugin {
|
||||
return GardenerDialoguePlugin(player)
|
||||
}
|
||||
|
||||
override fun open(vararg args: Any?): Boolean {
|
||||
npc = args[0] as NPC
|
||||
options("Would you look after my crops for me?","Can you sell me something?")
|
||||
return true
|
||||
}
|
||||
|
||||
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
|
||||
val patches = Farmers.forId(npc.id)!!.patches
|
||||
when (stage) {
|
||||
// TODO: Can fruit trees be chopped down by the gardener too?
|
||||
START_DIALOGUE -> {
|
||||
val patch = patches[0].getPatchFor(player)
|
||||
showTopics(
|
||||
IfTopic(
|
||||
FacialExpression.ASKING,
|
||||
"Would you chop my tree down for me?",
|
||||
1000,
|
||||
patch.patch.type == PatchType.TREE_PATCH && patch.plantable != null && patch.isGrown()
|
||||
),
|
||||
IfTopic(
|
||||
FacialExpression.ASKING,
|
||||
"Would you look after my crops for me?",
|
||||
10,
|
||||
!(patch.patch.type == PatchType.TREE_PATCH && patch.plantable != null && patch.isGrown())
|
||||
),
|
||||
Topic(FacialExpression.ASKING, "Can you give me any farming advice?", 2000),
|
||||
Topic(FacialExpression.ASKING, "Can you sell me something?", 30),
|
||||
Topic(FacialExpression.NEUTRAL, "That's all, thanks.", END_DIALOGUE)
|
||||
)
|
||||
when(stage){
|
||||
0 -> when(buttonId){
|
||||
1 -> player("Would you look after my crops for me?").also { stage = 10 }
|
||||
2 -> player("Can you sell me something?").also { stage = 30 }
|
||||
}
|
||||
|
||||
10 -> {
|
||||
if (patches.size > 1) {
|
||||
npc("I might. Which one were you thinking of?").also { stage = 20 }
|
||||
} else {
|
||||
openPayGardenerDialogue(player, patches[0])
|
||||
}
|
||||
10 -> npc("I might. Which one were you thinking of?").also { stage++ }
|
||||
11 -> when(npc.id){
|
||||
Farmers.ELSTAN.id, Farmers.LYRA.id -> options("The north-western allotment.","The south-eastern allotment.").also { stage = 15 }
|
||||
Farmers.DANTAERA.id, Farmers.KRAGEN.id -> options("The north allotment.","The south allotment.").also { stage = 15 }
|
||||
else -> player("Uh, that one.").also { stage++ }
|
||||
}
|
||||
|
||||
20 -> when (npc.id) {
|
||||
Farmers.ELSTAN.id, Farmers.LYRA.id -> showTopics(
|
||||
Topic(FacialExpression.NEUTRAL, "The north-western allotment.", 21),
|
||||
Topic(FacialExpression.NEUTRAL, "The south-eastern allotment.", 22)
|
||||
)
|
||||
Farmers.DANTAERA.id, Farmers.KRAGEN.id -> showTopics(
|
||||
Topic(FacialExpression.NEUTRAL, "The northern allotment.", 21),
|
||||
Topic(FacialExpression.NEUTRAL, "The southern allotment.", 22)
|
||||
)
|
||||
}
|
||||
21 -> openPayGardenerDialogue(player, patches[0])
|
||||
22 -> openPayGardenerDialogue(player, patches[1])
|
||||
12 -> npc("Oh, right. My bad.").also { stage++ }
|
||||
13 -> checkPatch(player,Farmers.forId(npc.id)!!.patches[0])
|
||||
|
||||
30 -> npc(FacialExpression.NEUTRAL, "That depends on whether I have it to sell. What is it", "that you're looking for?").also { stage++ }
|
||||
31 -> showTopics(
|
||||
Topic(FacialExpression.NEUTRAL, "Some plant cure.", 100),
|
||||
Topic(FacialExpression.NEUTRAL, "A bucket of compost.", 200),
|
||||
Topic(FacialExpression.NEUTRAL, "A rake.", 300),
|
||||
Topic("(See more items)", 32, true)
|
||||
)
|
||||
32 -> showTopics(
|
||||
Topic(FacialExpression.NEUTRAL, "A watering can.", 400),
|
||||
Topic(FacialExpression.NEUTRAL, "A gardening trowel.", 500),
|
||||
Topic(FacialExpression.NEUTRAL, "A seed dibber.", 600),
|
||||
Topic("(See previous items)", 31, true),
|
||||
Topic(FacialExpression.NEUTRAL, "Forget it.", 40, true)
|
||||
)
|
||||
|
||||
40 -> player("Forget it, you don't have anything I need.").also { stage = END_DIALOGUE }
|
||||
|
||||
100 -> npc("Plant cure, eh? I might have some put aside for myself.", "Tell you what. I'll sell you some plant cure for 25 gp if", "you like.").also { stage++ }
|
||||
101 -> options("Yes, that sounds like a fair price.", "No thanks, I can get that much cheaper elsewhere.").also { stage++ }
|
||||
102 -> when (buttonId) {
|
||||
1 -> {
|
||||
player(FacialExpression.HAPPY, "Yes, that sounds like a fair price.").also { stage = END_DIALOGUE }
|
||||
if (removeItem(player, Item(Items.COINS_995, 25))) {
|
||||
addItemOrDrop(player, Items.PLANT_CURE_6036)
|
||||
} else {
|
||||
sendMessage(player, "You need 25 gp to pay for that.")
|
||||
}
|
||||
}
|
||||
2 -> player("No thanks, I can get that much cheaper elsewhere.").also { stage = END_DIALOGUE }
|
||||
15 -> when(buttonId){
|
||||
1 -> checkPatch(player,Farmers.forId(npc.id)!!.patches[0])
|
||||
2 -> checkPatch(player,Farmers.forId(npc.id)!!.patches[1])
|
||||
}
|
||||
|
||||
200 -> npc("A bucket of compost, eh? I might have one spare...", "tell you what, I'll sell it to you for 35 gp if you like.").also { stage++ }
|
||||
201 -> options("Yes, that sounds like a fair price.", "No thanks, I can get that much cheaper elsewhere.").also { stage++ }
|
||||
202 -> when (buttonId) {
|
||||
30 -> npc("That depends on whether I have it to sell.","What is it that you're looking for?").also { stage++ }
|
||||
31 -> options("Some plant cure.","A bucket of compost.","A rake.","(See more items)").also { stage = 32 }
|
||||
32 -> when(buttonId){
|
||||
1 -> player("Some plant cure.").also { stage = 100 }
|
||||
2 -> player("A bucket of compost.").also { stage = 200 }
|
||||
3 -> player("A rake.").also { stage = 300 }
|
||||
4 -> options("A watering can.","A gardening trowel.","A seed dibber.","(See previous items)").also { stage++ }
|
||||
}
|
||||
33 -> when(buttonId){
|
||||
1 -> player("A watering can.").also { stage = 400 }
|
||||
2 -> player("A gardening trowel.").also { stage = 500 }
|
||||
3 -> player("A seed dibber.").also { stage = 600 }
|
||||
4 -> options("Some plant cure.","A bucket of compost.","A rake.","(See more items)").also { stage = 32 }
|
||||
}
|
||||
|
||||
100 -> npc("Plant cure, eh? I might have some put aside for myself.","Tell you what, I'll sell you some plant cure","for 25 gp if you like.").also { stage++ }
|
||||
101 -> options("Yes, that sounds like a fair price.","No thanks, I can get that much cheaper.").also { stage++ }
|
||||
102 -> when(buttonId){
|
||||
1 -> {
|
||||
player("Yes, that sounds like a fair price.").also { stage = END_DIALOGUE }
|
||||
if (removeItem(player, Item(Items.COINS_995, 35))) {
|
||||
addItemOrDrop(player, Items.COMPOST_6032)
|
||||
if(player.inventory.remove(Item(995,25))){
|
||||
player.inventory.add(Item(Items.PLANT_CURE_6036))
|
||||
} else {
|
||||
sendMessage(player, "You need 35 gp to pay for that.")
|
||||
player.sendMessage("You need 25 gp to pay for that.")
|
||||
}
|
||||
}
|
||||
2 -> player("No thanks, I can get that much cheaper elsewhere.").also { stage = END_DIALOGUE }
|
||||
2 -> end()
|
||||
}
|
||||
|
||||
300 -> npc("A rake, eh? I might have one spare...", "tell you what, I'll sell it to you for 15 gp if you like.").also { stage++ }
|
||||
301 -> options("Yes, that sounds like a fair price.", "No thanks, I can get that much cheaper elsewhere.").also { stage++ }
|
||||
302 -> when (buttonId) {
|
||||
200 -> npc("A bucket of compost, eh? I might have one spare...","tell you what, I'll sell it to you for 35 gp if you like.").also { stage++ }
|
||||
201 -> options("Yes, that sounds fair.","No thanks, I can get that cheaper.").also { stage++ }
|
||||
202 -> when(buttonId){
|
||||
1 -> {
|
||||
player("Yes, that sounds like a fair price.").also { stage = END_DIALOGUE }
|
||||
if (removeItem(player, Item(Items.COINS_995, 15))) {
|
||||
addItemOrDrop(player, Items.RAKE_5341)
|
||||
if(player.inventory.remove(Item(995,35))){
|
||||
player.inventory.add(Item(Items.COMPOST_6032))
|
||||
} else {
|
||||
sendMessage(player, "You need 15 gp to pay for that.")
|
||||
player.sendMessage("You need 35 gp to pay for that.")
|
||||
}
|
||||
}
|
||||
2 -> player("No thanks, I can get that much cheaper elsewhere.").also { stage = END_DIALOGUE }
|
||||
2 -> end()
|
||||
}
|
||||
|
||||
400 -> npc("A watering can, eh? I might have one spare...", "tell you what, I'll sell it to you for 25 gp if you like.").also { stage++ }
|
||||
401 -> options("Yes, that sounds like a fair price.", "No thanks, I can get that much cheaper elsewhere.").also { stage++ }
|
||||
300 -> npc("A rake, eh? I might have one spare...","tell you what, I'll sell it to you for 15 gp if you like.").also { stage++ }
|
||||
301 -> options("Yes, that sounds fair.","No thanks, I can get that cheaper.").also { stage++ }
|
||||
302 -> when(buttonId){
|
||||
1 -> {
|
||||
player("Yes, that sounds like a fair price.").also { stage = END_DIALOGUE }
|
||||
if(player.inventory.remove(Item(995,15))){
|
||||
player.inventory.add(Item(Items.RAKE_5341))
|
||||
} else {
|
||||
player.sendMessage("You need 15 gp to pay for that.")
|
||||
}
|
||||
}
|
||||
2 -> end()
|
||||
}
|
||||
|
||||
400 -> npc("A watering can, eh? I might have one spare...","tell you what, I'll sell it to you for 25 gp if you like.").also { stage++ }
|
||||
401 -> options("Yes, that sounds fair.","No thanks, I can get that cheaper.").also { stage++ }
|
||||
402 -> when(buttonId){
|
||||
1 -> {
|
||||
player("Yes, that sounds like a fair price.").also { stage = END_DIALOGUE }
|
||||
if (removeItem(player, Item(Items.COINS_995, 25))) {
|
||||
addItemOrDrop(player, Items.WATERING_CAN8_5340)
|
||||
if(player.inventory.remove(Item(995,25))){
|
||||
player.inventory.add(Item(Items.WATERING_CAN8_5340))
|
||||
} else {
|
||||
sendMessage(player, "You need 25 gp to pay for that.")
|
||||
player.sendMessage("You need 25 gp to pay for that.")
|
||||
}
|
||||
}
|
||||
2 -> player("No thanks, I can get that much cheaper elsewhere.").also { stage = END_DIALOGUE }
|
||||
2 -> end()
|
||||
}
|
||||
|
||||
500 -> npc("A gardening trowel, eh? I might have one spare...", "tell you what, I'll sell it to you for 15 gp if you like.").also { stage++ }
|
||||
501 -> options("Yes, that sounds like a fair price.", "No thanks, I can get that much cheaper elsewhere.").also { stage++ }
|
||||
502 -> when (buttonId) {
|
||||
500 -> npc("A gardening trowel, eh? I might have one spare...","tell you what, I'll sell it to you for 15 gp if you like.").also { stage++ }
|
||||
501 -> options("Yes, that sounds fair.","No thanks, I can get that cheaper.").also { stage++ }
|
||||
502 -> when(buttonId){
|
||||
1 -> {
|
||||
player("Yes, that sounds like a fair price.").also { stage = END_DIALOGUE }
|
||||
if (removeItem(player, Item(Items.COINS_995, 15))) {
|
||||
addItemOrDrop(player, Items.GARDENING_TROWEL_5325)
|
||||
if(player.inventory.remove(Item(995,15))){
|
||||
player.inventory.add(Item(Items.GARDENING_TROWEL_5325))
|
||||
} else {
|
||||
sendMessage(player, "You need 15 gp to pay for that.")
|
||||
player.sendMessage("You need 15 gp to pay for that.")
|
||||
}
|
||||
}
|
||||
2 -> player("No thanks, I can get that much cheaper elsewhere.").also { stage = END_DIALOGUE }
|
||||
2 -> end()
|
||||
}
|
||||
|
||||
600 -> npc("A seed dibber, eh? I might have one spare...", "tell you what, I'll sell it to you for 15 gp if you like.").also { stage++ }
|
||||
601 -> options("Yes, that sounds like a fair price.", "No thanks, I can get that much cheaper elsewhere.").also { stage++ }
|
||||
602 -> when (buttonId) {
|
||||
600 -> npc("A seed dibber, eh? I might have one spare...","tell you what, I'll sell it to you for 15 gp if you like.").also { stage++ }
|
||||
601 -> options("Yes, that sounds fair.","No thanks, I can get that cheaper.").also { stage++ }
|
||||
602 -> when(buttonId){
|
||||
1 -> {
|
||||
player("Yes, that sounds like a fair price.").also { stage = END_DIALOGUE }
|
||||
if (removeItem(player, Item(Items.COINS_995, 15))) {
|
||||
addItemOrDrop(player, Items.SEED_DIBBER_5343)
|
||||
if(player.inventory.remove(Item(995,15))){
|
||||
player.inventory.add(Item(Items.SEED_DIBBER_5343))
|
||||
} else {
|
||||
sendMessage(player, "You need 15 gp to pay for that.")
|
||||
player.sendMessage("You need 15 gp to pay for that.")
|
||||
}
|
||||
}
|
||||
2 -> player("No thanks, I can get that much cheaper elsewhere.").also { stage = END_DIALOGUE }
|
||||
}
|
||||
|
||||
// Note: This dialogue changes slightly in April 2009, and significantly in December 2009
|
||||
1000 -> npc(FacialExpression.THINKING, "Why? You look like you could chop it down yourself!").also { stage++ }
|
||||
1001 -> showTopics(
|
||||
Topic(FacialExpression.NEUTRAL, "Yes, you're right - I'll do it myself.", END_DIALOGUE),
|
||||
Topic(FacialExpression.NEUTRAL, "I can't be bothered - I'd rather pay you to do it.", 1020)
|
||||
)
|
||||
|
||||
1020 -> npc(FacialExpression.NEUTRAL, "Well, it's a lot of hard work - if you pay me 200 GP", "I'll chop it down for you.").also { stage++ }
|
||||
1021 -> {
|
||||
if (inInventory(player, Items.COINS_995, 200)) {
|
||||
showTopics(
|
||||
Topic(FacialExpression.NEUTRAL, "Here's 200GP - chop my tree down please.", 1022),
|
||||
Topic(FacialExpression.NEUTRAL, "I don't want to pay that much, sorry.", END_DIALOGUE)
|
||||
)
|
||||
} else {
|
||||
player("I don't have that much money on me.").also { stage = END_DIALOGUE } // not authentic
|
||||
}
|
||||
}
|
||||
1022 -> {
|
||||
end()
|
||||
if (removeItem(player, Item(Items.COINS_995, 200))) {
|
||||
patches[0].getPatchFor(player).clear()
|
||||
}
|
||||
}
|
||||
|
||||
2000 -> {
|
||||
val advice = arrayOf(
|
||||
"There are four main Farming areas - Elstan looks after an area south of Falador, Dantaera has one to the north of Catherby, Kragen has one near Ardougne, and Lyra looks after a place in north Morytania.",
|
||||
"If you want to grow fruit trees you could try a few places: Catherby and Brimhaven have a couple of fruit tree patches, and I hear that the gnomes are big on that sort of thing.",
|
||||
"Bittercap mushrooms can only be grown in a special patch in Morytania, near the Mort Myre swamp. There the ground is especially dank and suited to growing poisonous fungi.",
|
||||
"There is a special patch for growing Belladonna - I believe it's somewhere near Draynor Manor, where the ground is a tad 'unblessed'.",
|
||||
|
||||
"Don't just throw away your weeds after you've raked a patch - put them in a compost bin and make some compost.",
|
||||
"Applying compost to a patch will not only reduce the chance that your crops will get diseased, but you will also grow more crops to harvest.",
|
||||
"Supercompost is far better than normal compost, but more expensive to make. You need to rot the right type of item; show me an item, and I'll tell you if it's super-compostable or not.",
|
||||
|
||||
"Tree seeds must be grown in a plantpot of soil into a sapling, and then transferred to a tree patch to continue growing to adulthood.",
|
||||
"You don't have to buy all your plantpots you know, you can make them yourself on a pottery wheel. If you're a good enough ${if (player!!.isMale) "craftsman" else "craftswoman"}, that is.",
|
||||
"You can fill plantpots with soil from Farming patches, if you have a gardening trowel.",
|
||||
|
||||
"Vegetables, hops and flowers are far more likely to grow healthily if you water them periodically.",
|
||||
"The only way to cure a bush or tree of disease is to prune away the diseased leaves with a pair of secateurs. For all other crops I would just apply some plant-cure.",
|
||||
"If you need to be rid of your fruit trees for any reason, all you have to do is chop them down and then dig up the stump.",
|
||||
|
||||
"You can put up to ten potatoes, cabbages or onions in vegetable sacks, although you can't have a mix in the same sack.",
|
||||
"You can put up to five tomatoes, strawberries, apples, bananas or oranges into a fruit basket, although you can't have a mix in the same basket.",
|
||||
"If you want to make your own sacks and baskets you'll need to use the loom that's near the Farming shop in Falador. If you're a good enough ${if (player!!.isMale) "craftsman" else "craftswoman"}, that is.",
|
||||
"You can buy all the farming tools from farming shops, which can be found close to the allotments.",
|
||||
|
||||
"Hops are good for brewing ales. I believe there's a brewery up in Keldagrim somewhere, and I've heard rumours that a place called Phasmatys used to be good for that type of thing. 'Fore they all died, of course.",
|
||||
)
|
||||
npcl(FacialExpression.NEUTRAL, advice.random()).also { stage = START_DIALOGUE }
|
||||
2 -> end()
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
fun openPayGardenerDialogue(player: Player, fPatch: FarmingPatch) {
|
||||
end()
|
||||
openDialogue(player, FarmerPayOptionDialogue(fPatch.getPatchFor(player)), npc)
|
||||
fun checkPatch(player: Player,fPatch: FarmingPatch){
|
||||
if(fPatch.getPatchFor(player).isWeedy()){
|
||||
npc("You don't have anything planted in that patch.","Plant something and I might agree to look after it for you.").also { stage = END_DIALOGUE }
|
||||
} else if(fPatch.getPatchFor(player).isGrown()){
|
||||
npc("That patch is already fully grown!","I don't know what you want me to do with it!").also { stage = END_DIALOGUE }
|
||||
} else if(fPatch.getPatchFor(player).protectionPaid) {
|
||||
npc("Are you alright? You've already", "paid me for that.").also { stage = END_DIALOGUE }
|
||||
} else {
|
||||
end()
|
||||
player.dialogueInterpreter.open(FarmerPayOptionDialogue(fPatch.getPatchFor(player)),npc)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getIds(): IntArray {
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ public class ManDialoguePlugin extends DialoguePlugin {
|
|||
/**
|
||||
* The NPC ids that use this dialogue plugin.
|
||||
*/
|
||||
private static final int[] NPC_IDS = {1, 2, 3, 4, 5, 6, 16, 24, 25, 170, 1086, 2675, 2776, 3224, 3225, 3227, 5923, 5924,};
|
||||
private static final int[] NPC_IDS = {1, 2, 3, 4, 5, 6, 16, 24, 25, 170, 351, 352, 353, 354, 359, 360, 361, 362, 363, 726, 727, 728, 729, 730, 1086, 2675, 2776, 3224, 3225, 3227, 5923, 5924,};
|
||||
|
||||
public ManDialoguePlugin() {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,21 +36,17 @@ public final class ClanInterfacePlugin extends ComponentPlugin {
|
|||
switch (component.getId()) {
|
||||
case 589:
|
||||
switch (button) {
|
||||
case 9:
|
||||
if (player.getInterfaceManager().getComponent(590) != null) {
|
||||
player.getPacketDispatch().sendMessage("Please close the interface you have open before using 'Clan Setup'");
|
||||
return true;
|
||||
}
|
||||
ClanRepository.openSettings(player);
|
||||
case 9:
|
||||
if (player.getInterfaceManager().getComponent(590) != null) {
|
||||
player.getPacketDispatch().sendMessage("Please close the interface you have open before using 'Clan Setup'");
|
||||
return true;
|
||||
case 14:
|
||||
if (player.getIronmanManager().checkRestriction()) {
|
||||
return false;
|
||||
}
|
||||
player.getDetails().getCommunication().toggleLootshare(player);
|
||||
return true;
|
||||
}
|
||||
ClanRepository.openSettings(player);
|
||||
return true;
|
||||
case 14:
|
||||
player.getDetails().getCommunication().toggleLootshare(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
case 590:
|
||||
final ClanRepository clan = ClanRepository.get(player.getName(), true);
|
||||
|
|
|
|||
136
Server/src/main/content/global/handlers/iface/EllisDialogue.java
Normal file
136
Server/src/main/content/global/handlers/iface/EllisDialogue.java
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
package content.global.handlers.iface;
|
||||
|
||||
import core.game.dialogue.DialoguePlugin;
|
||||
import content.global.skill.crafting.TanningProduct;
|
||||
import core.game.node.entity.npc.NPC;
|
||||
import core.game.node.entity.player.Player;
|
||||
import core.plugin.Initializable;
|
||||
import core.game.node.item.Item;
|
||||
|
||||
/**
|
||||
* Represents the ellis dialogue plugin.
|
||||
* @author 'Vexia
|
||||
* @version 1.0
|
||||
*/
|
||||
@Initializable
|
||||
public final class EllisDialogue extends DialoguePlugin {
|
||||
|
||||
/**
|
||||
* Constructs a new {@code EllisDialogue} {@code Object}.
|
||||
*/
|
||||
public EllisDialogue() {
|
||||
/**
|
||||
* empty.
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new {@code EllisDialogue} {@code Object}.
|
||||
* @param player the player.
|
||||
*/
|
||||
public EllisDialogue(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DialoguePlugin newInstance(Player player) {
|
||||
return new EllisDialogue(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean open(Object... args) {
|
||||
npc = (NPC) args[0];
|
||||
npc("Greetings friend I am a manufacturer of leather.");
|
||||
stage = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handle(int interfaceId, int buttonId) {
|
||||
switch (stage) {
|
||||
case 0:
|
||||
player.getInventory().refresh();
|
||||
Item items[] = player.getInventory().toArray();
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
if (items[i] == null) {
|
||||
continue;
|
||||
}
|
||||
if (TanningProduct.forItemId(items[i].getId()) != null) {
|
||||
npc("I see you have brought me some hides.", "Would you like me to tan them for you?");
|
||||
stage = 100;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
options("Can I buy some leather?", "Leather is rather weak stuff.");
|
||||
stage = 1;
|
||||
break;
|
||||
case 1:
|
||||
switch (buttonId) {
|
||||
case 1:
|
||||
player("Can I buy some leather then?");
|
||||
stage = 10;
|
||||
break;
|
||||
case 2:
|
||||
player("Leather is rather weak stuff.");
|
||||
stage = 3000;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
npc("I make leather from animal hides. Bring me some cowhides", "and one gold coin per hide, and I'll tan them into soft", "leather for you.");
|
||||
stage = 2000;
|
||||
break;
|
||||
case 2000:
|
||||
end();
|
||||
break;
|
||||
case 3000:
|
||||
npc("Normal leather may be quite weak, but it's very cheap - I", "make it from cowhides for only 1 gp per hide - and it's so", "easy to craft that anyone can work with it.");
|
||||
stage = 3001;
|
||||
break;
|
||||
case 3001:
|
||||
npc("Alternatively you could try hard leather. It's not so easy", "to craft, but I only charge 3 gp per cowhide to prepare it,", "and it makes much sturdier armour.");
|
||||
stage = 3002;
|
||||
break;
|
||||
case 3002:
|
||||
player("Thanks; I'll bear it in mind.");
|
||||
stage = 3003;
|
||||
break;
|
||||
case 3003:
|
||||
end();
|
||||
break;
|
||||
case 100:
|
||||
options("Yes please.", "No thanks.");
|
||||
stage = 101;
|
||||
break;
|
||||
case 101:
|
||||
switch (buttonId) {
|
||||
case 1:
|
||||
player("Yes please.");
|
||||
stage = 210;
|
||||
break;
|
||||
case 2:
|
||||
player("No thanks.");
|
||||
stage = 200;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 210:
|
||||
end();
|
||||
TanningProduct.open(player, 2824);
|
||||
break;
|
||||
case 200:
|
||||
npc("Very well, sir, as you wish.");
|
||||
stage = 201;
|
||||
break;
|
||||
case 201:
|
||||
end();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIds() {
|
||||
return new int[] { 2824 };
|
||||
}
|
||||
}
|
||||
|
|
@ -10,7 +10,6 @@ import core.plugin.Initializable
|
|||
import core.plugin.Plugin
|
||||
import core.tools.Log
|
||||
import org.rs09.consts.Sounds
|
||||
import content.data.Quests
|
||||
|
||||
/**
|
||||
* Represents the experience interface.
|
||||
|
|
@ -79,15 +78,15 @@ class ExperienceInterface() : ComponentPlugin() {
|
|||
}
|
||||
|
||||
private fun checkHerblore(player: Player): Boolean{
|
||||
return (player.questRepository.isComplete(Quests.DRUIDIC_RITUAL))
|
||||
return (player.questRepository.isComplete("Druidic Ritual"))
|
||||
}
|
||||
|
||||
private fun checkSummoning(player: Player): Boolean{
|
||||
return player.questRepository.isComplete(Quests.WOLF_WHISTLE)
|
||||
return player.questRepository.isComplete("Wolf Whistle")
|
||||
}
|
||||
|
||||
private fun checkRunecrafting(player: Player): Boolean{
|
||||
return player.questRepository.isComplete(Quests.RUNE_MYSTERIES)
|
||||
return player.questRepository.isComplete("Rune Mysteries")
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
|
|
|||
|
|
@ -2,130 +2,109 @@ package content.global.handlers.iface
|
|||
|
||||
import core.api.*
|
||||
import core.game.event.FairyRingDialEvent
|
||||
import core.game.interaction.InterfaceListener
|
||||
import core.game.component.Component
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.node.entity.player.link.TeleportManager
|
||||
import core.game.system.task.Pulse
|
||||
import core.game.world.GameWorld
|
||||
import core.game.world.map.Location
|
||||
import core.game.world.map.RegionManager
|
||||
import core.tools.RandomFunction
|
||||
import content.data.Quests
|
||||
import core.game.interaction.InterfaceListener
|
||||
import core.game.world.GameWorld
|
||||
|
||||
val RING_1 = arrayOf('a','d','c','b')
|
||||
val RING_2 = arrayOf('i','l','k','j')
|
||||
val RING_3 = arrayOf('p','s','r','q')
|
||||
|
||||
/**
|
||||
* Handles the fairy ring interface
|
||||
* @author Ceikry
|
||||
*/
|
||||
class FairyRingInterface : InterfaceListener {
|
||||
companion object {
|
||||
const val RINGS_IFACE = 734
|
||||
const val LOG_IFACE_ID = 735
|
||||
const val VARP_F_RING = 816
|
||||
const val VB_LOG_SORT_ORDER = 4618
|
||||
const val VB_RING_1 = 2341
|
||||
const val VB_RING_2 = 2342
|
||||
const val VB_RING_3 = 2343
|
||||
val RING_1 = arrayOf('a','d','c','b')
|
||||
val RING_2 = arrayOf('i','l','k','j')
|
||||
val RING_3 = arrayOf('p','s','r','q')
|
||||
}
|
||||
|
||||
val RINGS = 734
|
||||
val TRAVEL_LOG = 735
|
||||
|
||||
override fun defineInterfaceListeners() {
|
||||
|
||||
onOpen(RINGS_IFACE){ player, _ ->
|
||||
openSingleTab(player, LOG_IFACE_ID)
|
||||
saveVarp(player, VARP_F_RING)
|
||||
onOpen(RINGS){player, _ ->
|
||||
player.interfaceManager.openSingleTab(Component(TRAVEL_LOG))
|
||||
player.setAttribute("fr:ring1", 0)
|
||||
player.setAttribute("fr:ring2", 0)
|
||||
player.setAttribute("fr:ring3", 0)
|
||||
FairyRing.drawLog(player)
|
||||
return@onOpen true
|
||||
}
|
||||
|
||||
onOpen(LOG_IFACE_ID){ player, _ ->
|
||||
drawLog(player)
|
||||
return@onOpen true
|
||||
}
|
||||
|
||||
onClose(RINGS_IFACE){ player, _ ->
|
||||
onClose(RINGS){player, _ ->
|
||||
closeTabInterface(player)
|
||||
player.removeAttribute("fr:ring1")
|
||||
player.removeAttribute("fr:ring2")
|
||||
player.removeAttribute("fr:ring3")
|
||||
setVarp(player, 816, 0)
|
||||
closeTabInterface(player)
|
||||
return@onClose true
|
||||
}
|
||||
|
||||
on(RINGS_IFACE){ player, _, _, buttonID, _, _ ->
|
||||
on(RINGS){player, _, _, buttonID, _, _ ->
|
||||
if(player.getAttribute("fr:time",0L) > System.currentTimeMillis()) return@on true
|
||||
var delayIncrementer = 1750L
|
||||
when(buttonID){
|
||||
23 -> increment(player,1)
|
||||
25 -> increment(player,2)
|
||||
27 -> increment(player,3)
|
||||
23 -> delayIncrementer += increment(player,1)
|
||||
25 -> delayIncrementer += increment(player,2)
|
||||
27 -> delayIncrementer += increment(player,3)
|
||||
24 -> decrement(player,1)
|
||||
26 -> decrement(player,2)
|
||||
28 -> decrement(player,3)
|
||||
21 -> confirm(player)
|
||||
}
|
||||
player.setAttribute("fr:time",System.currentTimeMillis() + delayIncrementer)
|
||||
return@on true
|
||||
}
|
||||
|
||||
on(LOG_IFACE_ID,12){ player, _, _, _, _, _ ->
|
||||
on(TRAVEL_LOG,12){player, _, _, _, _, _ ->
|
||||
toggleSortOrder(player)
|
||||
return@on true
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws the travel log interface
|
||||
* Currently, the visited logs is a bool array in globalData. Someone should migrate this to prefs or something at some point.
|
||||
* On transmit of Varp 816, which all used varbits are part of here, the CS2 is invoked to populate the codes in the log and sort them correctly.
|
||||
* @param player The player to draw the interface for
|
||||
*/
|
||||
private fun drawLog (player: Player)
|
||||
{
|
||||
for (i in FairyRing.values().indices) {
|
||||
/* Snowscape: show all fairy ring destinations, whether they have been there or not.
|
||||
if (!player.savedData.globalData.hasTravelLog(i)) {
|
||||
continue
|
||||
}
|
||||
*/
|
||||
val ring = FairyRing.values()[i]
|
||||
if (ring.childId == -1) {
|
||||
continue
|
||||
}
|
||||
setInterfaceText(player, "<br>${ring.tip}", LOG_IFACE_ID, ring.childId)
|
||||
private fun toggleSortOrder(player: Player): Long{
|
||||
val ring1index = player.getAttribute("fr:ring1",0)
|
||||
var toSet = player.getAttribute("fr:sortorder",true)
|
||||
toSet = !toSet
|
||||
player.setAttribute("fr:sortorder",toSet)
|
||||
if(toSet) {
|
||||
setVarp(player, 816, ring1index)
|
||||
player.setAttribute("fr:ring2",0)
|
||||
player.setAttribute("fr:ring3",0)
|
||||
}
|
||||
return -1750L
|
||||
}
|
||||
|
||||
private fun toggleSortOrder(player: Player) {
|
||||
val curSort = getVarbit(player, VB_LOG_SORT_ORDER) == 0
|
||||
setVarbit(player, VB_LOG_SORT_ORDER, if (curSort) 1 else 0)
|
||||
drawLog(player)
|
||||
}
|
||||
|
||||
fun increment(player: Player,ring: Int) {
|
||||
val vbit = when(ring) {
|
||||
1 -> VB_RING_1
|
||||
2 -> VB_RING_2
|
||||
3 -> VB_RING_3
|
||||
else -> return
|
||||
}
|
||||
val curIndex = getVarbit(player, vbit)
|
||||
val nextIndex: Int = if(curIndex == 3) 0
|
||||
else curIndex + 1
|
||||
setVarbit(player, vbit, nextIndex)
|
||||
fun increment(player: Player,ring: Int): Long{
|
||||
val curIndex = player.getAttribute("fr:ring$ring",0)
|
||||
var nextIndex = 0
|
||||
if(curIndex == 3) nextIndex = 0
|
||||
else if(curIndex == 1) nextIndex = 3
|
||||
else if(curIndex == 2) nextIndex = 2
|
||||
else nextIndex = curIndex + 1
|
||||
player.setAttribute("fr:ring$ring",nextIndex)
|
||||
return if (curIndex == 1) 1750L else 0L
|
||||
}
|
||||
|
||||
fun decrement(player: Player,ring: Int){
|
||||
val vbit = when(ring) {
|
||||
1 -> VB_RING_1
|
||||
2 -> VB_RING_2
|
||||
3 -> VB_RING_3
|
||||
else -> return
|
||||
}
|
||||
val curIndex = getVarbit(player, vbit)
|
||||
val nextIndex: Int = if(curIndex == 0) 3
|
||||
else curIndex - 1
|
||||
setVarbit(player, vbit, nextIndex)
|
||||
val curIndex = player.getAttribute("fr:ring$ring",0)
|
||||
var nextIndex = 0
|
||||
if(curIndex == 0) nextIndex = 3
|
||||
else nextIndex = curIndex - 1
|
||||
player.setAttribute("fr:ring$ring",nextIndex)
|
||||
}
|
||||
|
||||
private fun confirm(player: Player){
|
||||
val ring1index = getVarbit(player, VB_RING_1)
|
||||
val ring2index = getVarbit(player, VB_RING_2)
|
||||
val ring3index = getVarbit(player, VB_RING_3)
|
||||
val ring1index = player.getAttribute("fr:ring1",0)
|
||||
val ring2index = player.getAttribute("fr:ring2",0)
|
||||
val ring3index = player.getAttribute("fr:ring3",0)
|
||||
val code = "${RING_1[ring1index]}${RING_2[ring2index]}${RING_3[ring3index]}"
|
||||
val ring: FairyRing? = try {
|
||||
FairyRing.valueOf(code.uppercase())
|
||||
|
|
@ -181,7 +160,7 @@ enum class FairyRing(val tile: Location?, val tip: String = "", val childId: Int
|
|||
AKS(Location.create(2571, 2956, 0), "Feldip Hills: Jungle Hunter area", 25),
|
||||
ALQ(Location.create(3597, 3495, 0), "Morytania: Haunted Woods east of Canifis", 27) {
|
||||
override fun checkAccess(player: Player) : Boolean {
|
||||
return requireQuest(player, Quests.PRIEST_IN_PERIL, "to use this ring.")
|
||||
return requireQuest(player, "Priest in Peril", "to use this ring.")
|
||||
}
|
||||
},
|
||||
ALS(Location.create(2644, 3495, 0), "Kandarin: McGrubor's Wood", 29),
|
||||
|
|
@ -193,7 +172,7 @@ enum class FairyRing(val tile: Location?, val tip: String = "", val childId: Int
|
|||
BKQ(Location.create(3041, 4532, 0), "Other realms: Enchanted Valley", 39),
|
||||
BKR(Location.create(3469, 3431, 0), "Morytania: Mort Myre, south of Canifis", 40) {
|
||||
override fun checkAccess(player: Player) : Boolean {
|
||||
return requireQuest(player, Quests.PRIEST_IN_PERIL, "to use this ring.")
|
||||
return requireQuest(player, "Priest in Peril", "to use this ring.")
|
||||
}
|
||||
},
|
||||
BLP(Location.create(2437, 5126, 0), "Dungeons: TzHaar area", 42),
|
||||
|
|
@ -201,7 +180,7 @@ enum class FairyRing(val tile: Location?, val tip: String = "", val childId: Int
|
|||
BLR(Location.create(2740, 3351, 0), "Kandarin: Legends' Guild", 44),
|
||||
CIP(Location.create(2513, 3884, 0), "Islands: Miscellania", 46) {
|
||||
override fun checkAccess(player: Player): Boolean {
|
||||
return requireQuest(player, Quests.THE_FREMENNIK_TRIALS, "to use this ring.")
|
||||
return requireQuest(player, "Fremennik Trials", "to use this ring.")
|
||||
}
|
||||
},
|
||||
CIQ(Location.create(2528, 3127, 0), "Kandarin: North-west of Yanille", 47),
|
||||
|
|
@ -210,7 +189,7 @@ enum class FairyRing(val tile: Location?, val tip: String = "", val childId: Int
|
|||
CKR(Location.create(2801, 3003, 0), "Karamja: South of Tai Bwo Wannai Village", 56),
|
||||
CKS(Location.create(3447, 3470, 0), "Morytania: Canifis", 57) {
|
||||
override fun checkAccess(player: Player) : Boolean {
|
||||
return requireQuest(player, Quests.PRIEST_IN_PERIL, "to use this ring.")
|
||||
return requireQuest(player, "Priest in Peril", "to use this ring.")
|
||||
}
|
||||
},
|
||||
CLP(Location.create(3082, 3206, 0), "Islands: South of Draynor Village", 58),
|
||||
|
|
@ -229,4 +208,23 @@ enum class FairyRing(val tile: Location?, val tip: String = "", val childId: Int
|
|||
open fun checkAccess(player: Player) : Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
companion object {
|
||||
/**
|
||||
* Draws the travel log.
|
||||
* @param player the player.
|
||||
*/
|
||||
fun drawLog(player: Player) {
|
||||
for (i in FairyRing.values().indices) {
|
||||
if (!player.savedData.globalData.hasTravelLog(i)) {
|
||||
continue
|
||||
}
|
||||
val ring = FairyRing.values()[i]
|
||||
if (ring.childId == -1) {
|
||||
continue
|
||||
}
|
||||
setInterfaceText(player, "<br>${ring.tip}", 735, ring.childId)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,120 @@
|
|||
package content.global.handlers.iface;
|
||||
|
||||
import static core.api.ContentAPIKt.*;
|
||||
import core.game.component.Component;
|
||||
import core.game.component.ComponentDefinition;
|
||||
import core.game.component.ComponentPlugin;
|
||||
import core.game.node.entity.player.Player;
|
||||
import core.game.node.entity.skill.Skills;
|
||||
import content.global.skill.crafting.GlassProduct;
|
||||
import core.game.node.item.Item;
|
||||
import core.game.system.task.Pulse;
|
||||
import core.game.world.update.flag.context.Animation;
|
||||
import core.plugin.Initializable;
|
||||
import core.plugin.Plugin;
|
||||
import kotlin.Unit;
|
||||
import org.rs09.consts.Sounds;
|
||||
|
||||
/**
|
||||
* Represents the glass making interface plugin.
|
||||
* @author 'Vexia
|
||||
* @version 1.0
|
||||
*/
|
||||
@Initializable
|
||||
public final class GlassInterface extends ComponentPlugin {
|
||||
|
||||
/**
|
||||
* Represents the animation to use.
|
||||
*/
|
||||
private static final Animation ANIMATION = new Animation(884);
|
||||
|
||||
/**
|
||||
* Represents the molten glass item.
|
||||
*/
|
||||
private static final Item MOLTEN_GLASS = new Item(1775);
|
||||
|
||||
/**
|
||||
* Represents the soda ash item.
|
||||
*/
|
||||
private static final Item SODA_ASH = new Item(1781, 1);
|
||||
|
||||
@Override
|
||||
public Plugin<Object> newInstance(Object arg) throws Throwable {
|
||||
ComponentDefinition.put(542, this);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handle(final Player p, Component component, int opcode, int button, int slot, int itemId) {
|
||||
final GlassProduct def = GlassProduct.forId(button);
|
||||
if (def == null) {
|
||||
return true;
|
||||
}
|
||||
if (!p.getInventory().contains(1785, 1)) {
|
||||
p.getPacketDispatch().sendMessage("You need a glassblowing pipe to do this.");
|
||||
return true;
|
||||
}
|
||||
if (!p.getInventory().contains(1775, 1)) {
|
||||
p.getPacketDispatch().sendMessage("You need molten glass to do this.");
|
||||
return true;
|
||||
}
|
||||
if (p.getSkills().getLevel(Skills.CRAFTING) < def.getLevel()) {
|
||||
p.getPacketDispatch().sendMessage("You need a crafting level of " + def.getLevel() + " to make this.");
|
||||
return true;
|
||||
}
|
||||
int real = -1;
|
||||
switch (opcode) {
|
||||
case 230:
|
||||
real = 1;
|
||||
break;
|
||||
case 205:
|
||||
real = 5;
|
||||
break;
|
||||
case 127:
|
||||
real = p.getInventory().getAmount(MOLTEN_GLASS);
|
||||
break;
|
||||
case 211:
|
||||
sendInputDialogue(p, true, "Enter the amount:", (value) -> {
|
||||
make(p, def, (int) value);
|
||||
return Unit.INSTANCE;
|
||||
});
|
||||
break;
|
||||
}
|
||||
if (opcode == 211) {
|
||||
return true;
|
||||
}
|
||||
make(p, def, real);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used to make a glass product.
|
||||
* @param player the player.
|
||||
* @param glass the glass.
|
||||
* @param amount the amount.
|
||||
*/
|
||||
public static void make(final Player player, final GlassProduct glass, final int amount) {
|
||||
player.getInterfaceManager().close();
|
||||
player.animate(ANIMATION);
|
||||
player.getPulseManager().clear();
|
||||
player.getPulseManager().run(new Pulse(2, player) {
|
||||
int amt = amount;
|
||||
|
||||
@Override
|
||||
public boolean pulse() {
|
||||
if (!player.getInventory().contains(1775, 1) || amt == 0) {
|
||||
return true;
|
||||
}
|
||||
player.animate(ANIMATION);
|
||||
playAudio(player, Sounds.GLASSBLOWING_2724);
|
||||
player.getInventory().remove(MOLTEN_GLASS);
|
||||
player.getInventory().add(new Item(glass.getProduct(), 1));
|
||||
player.getSkills().addExperience(Skills.CRAFTING, glass.getExperience(), true);
|
||||
player.getPacketDispatch().sendMessage("You make a " + new Item(glass.getProduct()).getName().toLowerCase().replace("unpowered", "").trim() + ".");
|
||||
amt--;
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -165,7 +165,6 @@ public final class JewelleryInterface extends ComponentPlugin {
|
|||
amount = 5;
|
||||
break;
|
||||
case 124:
|
||||
/* No need to calculate the maximum amount here, because the make() function will perform that step
|
||||
if (data.name().contains("GOLD")) {
|
||||
amount = player.getInventory().getAmount(new Item(GOLD_BAR));
|
||||
} else {
|
||||
|
|
@ -179,8 +178,6 @@ public final class JewelleryInterface extends ComponentPlugin {
|
|||
amount = first;
|
||||
}
|
||||
}
|
||||
*/
|
||||
amount = 99;
|
||||
break;
|
||||
case 199:
|
||||
final JewelleryItem d = data;
|
||||
|
|
|
|||
|
|
@ -14,9 +14,6 @@ import core.game.node.entity.player.link.SpellBookManager.SpellBook;
|
|||
import core.game.world.GameWorld;
|
||||
import core.plugin.Plugin;
|
||||
|
||||
import content.data.Quests;
|
||||
import static core.api.ContentAPIKt.hasRequirement;
|
||||
|
||||
/**
|
||||
* Represents the magic book interface handling of non-combat spells.
|
||||
* @author 'Vexia
|
||||
|
|
@ -45,44 +42,9 @@ public final class MagicBookInterface extends ComponentPlugin {
|
|||
? SpellBook.ANCIENT
|
||||
: SpellBook.LUNAR;
|
||||
|
||||
// Snowscape: Allow switching between unlocked spellbooks with the magic interface sort buttons
|
||||
if (spellBook == SpellBook.MODERN) {
|
||||
if (button == 65 && swapSpellBook(player, SpellBook.ANCIENT)) {
|
||||
return true;
|
||||
} else if (button == 66 && swapSpellBook(player, SpellBook.LUNAR)) {
|
||||
return true;
|
||||
}
|
||||
} else if (spellBook == SpellBook.ANCIENT) {
|
||||
if (button == 29 && swapSpellBook(player, SpellBook.MODERN)) {
|
||||
return true;
|
||||
} else if (button == 31 && swapSpellBook(player, SpellBook.LUNAR)) {
|
||||
return true;
|
||||
}
|
||||
} else if (spellBook == SpellBook.LUNAR) {
|
||||
if (button == 40 && swapSpellBook(player, SpellBook.MODERN)) {
|
||||
return true;
|
||||
} else if (button == 41 && swapSpellBook(player, SpellBook.ANCIENT)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SpellListeners.run(button, SpellListener.NONE, SpellUtils.getBookFromInterface(component.getId()),player,null);
|
||||
boolean result = MagicSpell.castSpell(player, spellBook, button, player);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Snowscape custom function
|
||||
private boolean swapSpellBook(final Player player, SpellBook spellBook) {
|
||||
if (spellBook == SpellBook.ANCIENT && !hasRequirement(player, Quests.DESERT_TREASURE)) {
|
||||
return false;
|
||||
} else if (spellBook == SpellBook.LUNAR && !hasRequirement(player, Quests.LUNAR_DIPLOMACY)) {
|
||||
return false;
|
||||
}
|
||||
player.getSpellBookManager().setSpellBook(spellBook);
|
||||
player.getSpellBookManager().update(player);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import java.util.HashMap;
|
|||
public final class MysticStaffEnchantingPlugin extends ComponentPlugin {
|
||||
|
||||
private final Component COMPONENT = new Component(332);
|
||||
private final int cost = 40000;
|
||||
|
||||
protected enum EnchantedStaff {
|
||||
AIR(Items.MYSTIC_AIR_STAFF_1405, Items.AIR_BATTLESTAFF_1397, 21),
|
||||
|
|
@ -27,8 +28,7 @@ public final class MysticStaffEnchantingPlugin extends ComponentPlugin {
|
|||
EARTH(Items.MYSTIC_EARTH_STAFF_1407, Items.EARTH_BATTLESTAFF_1399, 23),
|
||||
FIRE(Items.MYSTIC_FIRE_STAFF_1401, Items.FIRE_BATTLESTAFF_1393, 24),
|
||||
LAVA(Items.MYSTIC_LAVA_STAFF_3054, Items.LAVA_BATTLESTAFF_3053, 25),
|
||||
MUD(Items.MYSTIC_MUD_STAFF_6563, Items.MUD_BATTLESTAFF_6562, 26),
|
||||
STEAM(Items.MYSTIC_STEAM_STAFF_11738, Items.STEAM_BATTLESTAFF_11736, 27);
|
||||
MUD(Items.MYSTIC_MUD_STAFF_6563, Items.MUD_BATTLESTAFF_6562, 26);
|
||||
|
||||
public final int enchanted;
|
||||
public final int basic;
|
||||
|
|
@ -68,6 +68,7 @@ public final class MysticStaffEnchantingPlugin extends ComponentPlugin {
|
|||
|
||||
@Override
|
||||
public boolean handle(Player player, Component component, int opcode, int buttonId, int slot, int itemId) {
|
||||
player.getPacketDispatch().sendMessage("op: " + opcode + " button: " + buttonId + " slot: "+ slot + " item: " + itemId);
|
||||
|
||||
if (EnchantedStaff.childToBasic.containsKey(buttonId)) {
|
||||
Item basicStaff = new Item(EnchantedStaff.childToBasic.get(buttonId));
|
||||
|
|
@ -77,10 +78,9 @@ public final class MysticStaffEnchantingPlugin extends ComponentPlugin {
|
|||
player.getPacketDispatch().sendMessage("You don't have a" + (StringUtils.isPlusN(basicStaff.getName()) ? "n " : " ") + basicStaff.getName() + " to enchant.");
|
||||
return true;
|
||||
}
|
||||
int cost = player.getEquipment().contains(Items.SEERS_HEADBAND_14631, 1)? 27000 : 40000;
|
||||
if (!player.getInventory().contains(995, cost)) {
|
||||
player.getInterfaceManager().close();
|
||||
player.getDialogueInterpreter().sendDialogues(389, null, "I need " + String.format("%,d", cost) + " coins for materials. Come", "back when you have the money!");
|
||||
player.getDialogueInterpreter().sendDialogues(389, null, "I need 40,000 coins for materials. Come", "back when you have the money!");
|
||||
return true;
|
||||
}
|
||||
if (player.getInventory().remove(basicStaff, new Item(995, cost))) {
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import core.plugin.Initializable;
|
|||
import core.plugin.Plugin;
|
||||
|
||||
import static core.api.ContentAPIKt.hasRequirement;
|
||||
import content.data.Quests;
|
||||
|
||||
/**
|
||||
* Represents the prayer interface.
|
||||
|
|
@ -28,7 +27,7 @@ public final class PrayerTabInterface extends ComponentPlugin {
|
|||
public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) {
|
||||
final PrayerType type = PrayerType.get(button);
|
||||
if (type == PrayerType.CHIVALRY || type == PrayerType.PIETY)
|
||||
if (!hasRequirement(player, Quests.KINGS_RANSOM))
|
||||
if (!hasRequirement(player, "King's Ransom"))
|
||||
return true;
|
||||
if (type == null) {
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -10,13 +10,12 @@ import kotlin.math.*
|
|||
import java.util.*
|
||||
|
||||
import org.rs09.consts.*
|
||||
import content.data.Quests
|
||||
|
||||
object QuestTabUtils {
|
||||
@JvmStatic
|
||||
fun showRequirementsInterface(player: Player, button: Int) {
|
||||
val questName = getNameForButton(button)
|
||||
val questReq = QuestRequirements.values().filter { it.quest.questName == questName }.firstOrNull() ?: return
|
||||
fun showRequirementsInterface (player: Player, button: Int) {
|
||||
val questName = getNameForButton (button)
|
||||
val questReq = QuestRequirements.values().filter { it.questName.equals(questName, true) }.firstOrNull() ?: return
|
||||
var (isMet, unmetReqs) = QuestReq(questReq).evaluate(player)
|
||||
|
||||
var messageList = ArrayList<String>()
|
||||
|
|
@ -28,7 +27,7 @@ object QuestTabUtils {
|
|||
closeInterface(player)
|
||||
for (req in unmetReqs) {
|
||||
if (req is QuestReq)
|
||||
questList.add(req.questReq.quest.questName)
|
||||
questList.add(req.questReq.questName)
|
||||
else if (req is SkillReq) {
|
||||
if (statMap[req.skillId] == null || (statMap[req.skillId] != null && statMap[req.skillId]!! < req.level))
|
||||
statMap[req.skillId] = req.level
|
||||
|
|
@ -83,163 +82,163 @@ object QuestTabUtils {
|
|||
openInterface(player, Components.QUESTJOURNAL_SCROLL_275)
|
||||
}
|
||||
|
||||
private fun getNameForButton(button: Int) : String {
|
||||
val quest = when (button) {
|
||||
10 -> Quests.MYTHS_OF_THE_WHITE_LANDS.questName
|
||||
11 -> Quests.MYTHS_OF_THE_WHITE_LANDS.questName
|
||||
fun getNameForButton (button: Int) : String {
|
||||
val name = when (button) {
|
||||
10 -> "Myths of the White Lands"
|
||||
11 -> "Myths of the White Lands"
|
||||
12 -> "Free Quests"
|
||||
13 -> Quests.BLACK_KNIGHTS_FORTRESS.questName
|
||||
14 -> Quests.COOKS_ASSISTANT.questName
|
||||
15 -> Quests.DEMON_SLAYER.questName
|
||||
16 -> Quests.DORICS_QUEST.questName
|
||||
17 -> Quests.DRAGON_SLAYER.questName
|
||||
18 -> Quests.ERNEST_THE_CHICKEN.questName
|
||||
19 -> Quests.GOBLIN_DIPLOMACY.questName
|
||||
20 -> Quests.IMP_CATCHER.questName
|
||||
21 -> Quests.THE_KNIGHTS_SWORD.questName
|
||||
22 -> Quests.PIRATES_TREASURE.questName
|
||||
23 -> Quests.PRINCE_ALI_RESCUE.questName
|
||||
24 -> Quests.THE_RESTLESS_GHOST.questName
|
||||
25 -> Quests.ROMEO_JULIET.questName
|
||||
26 -> Quests.RUNE_MYSTERIES.questName
|
||||
27 -> Quests.SHEEP_SHEARER.questName
|
||||
28 -> Quests.SHIELD_OF_ARRAV.questName
|
||||
29 -> Quests.VAMPIRE_SLAYER.questName
|
||||
30 -> Quests.WITCHS_POTION.questName
|
||||
13 -> "Black Knights' Fortress"
|
||||
14 -> "Cook's Assistant"
|
||||
15 -> "Demon Slayer"
|
||||
16 -> "Doric's Quest"
|
||||
17 -> "Dragon Slayer"
|
||||
18 -> "Ernest the Chicken"
|
||||
19 -> "Goblin Diplomacy"
|
||||
20 -> "Imp Catcher"
|
||||
21 -> "The Knight's Sword"
|
||||
22 -> "Pirate's Treasure"
|
||||
23 -> "Prince Ali Rescue"
|
||||
24 -> "The Restless Ghost"
|
||||
25 -> "Romeo & Juliet"
|
||||
26 -> "Rune Mysteries"
|
||||
27 -> "Sheep Shearer"
|
||||
28 -> "Shield of Arrav"
|
||||
29 -> "Vampire Slayer"
|
||||
30 -> "Witch's Potion"
|
||||
31 -> "Members' Quests"
|
||||
32 -> Quests.ANIMAL_MAGNETISM.questName
|
||||
33 -> Quests.BETWEEN_A_ROCK.questName
|
||||
34 -> Quests.BIG_CHOMPY_BIRD_HUNTING.questName
|
||||
35 -> Quests.BIOHAZARD.questName
|
||||
36 -> Quests.CABIN_FEVER.questName
|
||||
37 -> Quests.CLOCK_TOWER.questName
|
||||
38 -> Quests.CONTACT.questName
|
||||
39 -> Quests.ZOGRE_FLESH_EATERS.questName
|
||||
40 -> Quests.CREATURE_OF_FENKENSTRAIN.questName
|
||||
41 -> Quests.DARKNESS_OF_HALLOWVALE.questName
|
||||
42 -> Quests.DEATH_TO_THE_DORGESHUUN.questName
|
||||
43 -> Quests.DEATH_PLATEAU.questName
|
||||
44 -> Quests.DESERT_TREASURE.questName
|
||||
45 -> Quests.DEVIOUS_MINDS.questName
|
||||
46 -> Quests.THE_DIG_SITE.questName
|
||||
47 -> Quests.DRUIDIC_RITUAL.questName
|
||||
48 -> Quests.DWARF_CANNON.questName
|
||||
49 -> Quests.EADGARS_RUSE.questName
|
||||
50 -> Quests.EAGLES_PEAK.questName
|
||||
51 -> Quests.ELEMENTAL_WORKSHOP_I.questName
|
||||
52 -> Quests.ELEMENTAL_WORKSHOP_II.questName
|
||||
53 -> Quests.ENAKHRAS_LAMENT.questName
|
||||
54 -> Quests.ENLIGHTENED_JOURNEY.questName
|
||||
55 -> Quests.THE_EYES_OF_GLOUPHRIE.questName
|
||||
56 -> Quests.FAIRYTALE_I_GROWING_PAINS.questName
|
||||
57 -> Quests.FAIRYTALE_II_CURE_A_QUEEN.questName
|
||||
58 -> Quests.FAMILY_CREST.questName
|
||||
59 -> Quests.THE_FEUD.questName
|
||||
60 -> Quests.FIGHT_ARENA.questName
|
||||
61 -> Quests.FISHING_CONTEST.questName
|
||||
62 -> Quests.FORGETTABLE_TALE.questName
|
||||
63 -> Quests.THE_FREMENNIK_TRIALS.questName
|
||||
64 -> Quests.WATERFALL_QUEST.questName
|
||||
65 -> Quests.GARDEN_OF_TRANQUILITY.questName
|
||||
66 -> Quests.GERTRUDES_CAT.questName
|
||||
67 -> Quests.GHOSTS_AHOY.questName
|
||||
68 -> Quests.THE_GIANT_DWARF.questName
|
||||
69 -> Quests.THE_GOLEM.questName
|
||||
70 -> Quests.THE_GRAND_TREE.questName
|
||||
71 -> Quests.THE_HAND_IN_THE_SAND.questName
|
||||
72 -> Quests.HAUNTED_MINE.questName
|
||||
73 -> Quests.HAZEEL_CULT.questName
|
||||
74 -> Quests.HEROES_QUEST.questName
|
||||
75 -> Quests.HOLY_GRAIL.questName
|
||||
76 -> Quests.HORROR_FROM_THE_DEEP.questName
|
||||
77 -> Quests.ICTHLARINS_LITTLE_HELPER.questName
|
||||
78 -> Quests.IN_AID_OF_THE_MYREQUE.questName
|
||||
79 -> Quests.IN_SEARCH_OF_THE_MYREQUE.questName
|
||||
80 -> Quests.JUNGLE_POTION.questName
|
||||
81 -> Quests.LEGENDS_QUEST.questName
|
||||
82 -> Quests.LOST_CITY.questName
|
||||
83 -> Quests.THE_LOST_TRIBE.questName
|
||||
84 -> Quests.LUNAR_DIPLOMACY.questName
|
||||
85 -> Quests.MAKING_HISTORY.questName
|
||||
86 -> Quests.MERLINS_CRYSTAL.questName
|
||||
87 -> Quests.MONKEY_MADNESS.questName
|
||||
88 -> Quests.MONKS_FRIEND.questName
|
||||
89 -> Quests.MOUNTAIN_DAUGHTER.questName
|
||||
90 -> Quests.MOURNINGS_END_PART_I.questName
|
||||
91 -> Quests.MOURNINGS_END_PART_II.questName
|
||||
92 -> Quests.MURDER_MYSTERY.questName
|
||||
93 -> Quests.MY_ARMS_BIG_ADVENTURE.questName
|
||||
94 -> Quests.NATURE_SPIRIT.questName
|
||||
95 -> Quests.OBSERVATORY_QUEST.questName
|
||||
96 -> Quests.ONE_SMALL_FAVOUR.questName
|
||||
97 -> Quests.PLAGUE_CITY.questName
|
||||
98 -> Quests.PRIEST_IN_PERIL.questName
|
||||
99 -> Quests.RAG_AND_BONE_MAN.questName
|
||||
100 -> Quests.RATCATCHERS.questName
|
||||
101 -> Quests.RECIPE_FOR_DISASTER.questName
|
||||
102 -> Quests.RECRUITMENT_DRIVE.questName
|
||||
103 -> Quests.REGICIDE.questName
|
||||
104 -> Quests.ROVING_ELVES.questName
|
||||
105 -> Quests.ROYAL_TROUBLE.questName
|
||||
106 -> Quests.RUM_DEAL.questName
|
||||
107 -> Quests.SCORPION_CATCHER.questName
|
||||
108 -> Quests.SEA_SLUG.questName
|
||||
109 -> Quests.THE_SLUG_MENACE.questName
|
||||
110 -> Quests.SHADES_OF_MORTTON.questName
|
||||
111 -> Quests.SHADOW_OF_THE_STORM.questName
|
||||
112 -> Quests.SHEEP_HERDER.questName
|
||||
113 -> Quests.SHILO_VILLAGE.questName
|
||||
114 -> Quests.A_SOULS_BANE.questName
|
||||
115 -> Quests.SPIRITS_OF_THE_ELID.questName
|
||||
116 -> Quests.SWAN_SONG.questName
|
||||
117 -> Quests.TAI_BWO_WANNAI_TRIO.questName
|
||||
118 -> Quests.A_TAIL_OF_TWO_CATS.questName
|
||||
119 -> Quests.TEARS_OF_GUTHIX.questName
|
||||
120 -> Quests.TEMPLE_OF_IKOV.questName
|
||||
121 -> Quests.THRONE_OF_MISCELLANIA.questName
|
||||
122 -> Quests.THE_TOURIST_TRAP.questName
|
||||
123 -> Quests.WITCHS_HOUSE.questName
|
||||
124 -> Quests.TREE_GNOME_VILLAGE.questName
|
||||
125 -> Quests.TRIBAL_TOTEM.questName
|
||||
126 -> Quests.TROLL_ROMANCE.questName
|
||||
127 -> Quests.TROLL_STRONGHOLD.questName
|
||||
128 -> Quests.UNDERGROUND_PASS.questName
|
||||
129 -> Quests.WANTED.questName
|
||||
130 -> Quests.WATCHTOWER.questName
|
||||
131 -> Quests.COLD_WAR.questName
|
||||
132 -> Quests.THE_FREMENNIK_ISLES.questName
|
||||
133 -> Quests.TOWER_OF_LIFE.questName
|
||||
134 -> Quests.THE_GREAT_BRAIN_ROBBERY.questName
|
||||
135 -> Quests.WHAT_LIES_BELOW.questName
|
||||
136 -> Quests.OLAFS_QUEST.questName
|
||||
137 -> Quests.ANOTHER_SLICE_OF_HAM.questName
|
||||
138 -> Quests.DREAM_MENTOR.questName
|
||||
139 -> Quests.GRIM_TALES.questName
|
||||
140 -> Quests.KINGS_RANSOM.questName
|
||||
141 -> Quests.THE_PATH_OF_GLOUPHRIE.questName
|
||||
142 -> Quests.BACK_TO_MY_ROOTS.questName
|
||||
143 -> Quests.LAND_OF_THE_GOBLINS.questName
|
||||
144 -> Quests.DEALING_WITH_SCABARAS.questName
|
||||
145 -> Quests.WOLF_WHISTLE.questName
|
||||
146 -> Quests.AS_A_FIRST_RESORT.questName
|
||||
147 -> Quests.CATAPULT_CONSTRUCTION.questName
|
||||
148 -> Quests.KENNITHS_CONCERNS.questName
|
||||
149 -> Quests.LEGACY_OF_SEERGAZE.questName
|
||||
150 -> Quests.PERILS_OF_ICE_MOUNTAIN.questName
|
||||
151 -> Quests.TOKTZ_KET_DILL.questName
|
||||
152 -> Quests.SMOKING_KILLS.questName
|
||||
153 -> Quests.ROCKING_OUT.questName
|
||||
154 -> Quests.SPIRIT_OF_SUMMER.questName
|
||||
155 -> Quests.MEETING_HISTORY.questName
|
||||
156 -> Quests.ALL_FIRED_UP.questName
|
||||
157 -> Quests.SUMMERS_END.questName
|
||||
158 -> Quests.DEFENDER_OF_VARROCK.questName
|
||||
159 -> Quests.SWEPT_AWAY.questName
|
||||
160 -> Quests.WHILE_GUTHIX_SLEEPS.questName
|
||||
161 -> Quests.IN_PYRE_NEED.questName
|
||||
162 -> Quests.MYTHS_OF_THE_WHITE_LANDS.questName
|
||||
32 -> "Animal Magnetism"
|
||||
33 -> "Between a Rock..."
|
||||
34 -> "Big Chompy Bird Hunting"
|
||||
35 -> "Biohazard"
|
||||
36 -> "Cabin Fever"
|
||||
37 -> "Clock Tower"
|
||||
38 -> "Contact!"
|
||||
39 -> "Zogre Flesh Eaters"
|
||||
40 -> "Creature of Fenkenstrain"
|
||||
41 -> "Darkness of Hallowvale"
|
||||
42 -> "Death to the Dorgeshuun"
|
||||
43 -> "Death Plateau"
|
||||
44 -> "Desert Treasure"
|
||||
45 -> "Devious Minds"
|
||||
46 -> "The Dig Site"
|
||||
47 -> "Druidic Ritual"
|
||||
48 -> "Dwarf Cannon"
|
||||
49 -> "Eadgar's Ruse"
|
||||
50 -> "Eagles' Peak"
|
||||
51 -> "Elemental Workshop I"
|
||||
52 -> "Elemental Workshop II"
|
||||
53 -> "Enakhra's Lament"
|
||||
54 -> "Enlightened Journey"
|
||||
55 -> "The Eyes of Glouphrie"
|
||||
56 -> "Fairytale I - Growing Pains"
|
||||
57 -> "Fairytale II - Cure a Queen"
|
||||
58 -> "Family Crest"
|
||||
59 -> "The Feud"
|
||||
60 -> "Fight Arena"
|
||||
61 -> "Fishing Contest"
|
||||
62 -> "Forgettable Tale..."
|
||||
63 -> "The Fremennik Trials"
|
||||
64 -> "Waterfall Quest"
|
||||
65 -> "Garden of Tranquillity"
|
||||
66 -> "Gertrude's Cat"
|
||||
67 -> "Ghosts Ahoy"
|
||||
68 -> "The Giant Dwarf"
|
||||
69 -> "The Golem"
|
||||
70 -> "The Grand Tree"
|
||||
71 -> "The Hand in the Sand"
|
||||
72 -> "Haunted Mine"
|
||||
73 -> "Hazeel Cult"
|
||||
74 -> "Heroes' Quest"
|
||||
75 -> "Holy Grail"
|
||||
76 -> "Horror from the Deep"
|
||||
77 -> "Icthlarin's Little Helper"
|
||||
78 -> "In Aid of the Myreque"
|
||||
79 -> "In Search of the Myreque"
|
||||
80 -> "Jungle Potion"
|
||||
81 -> "Legend's Quest"
|
||||
82 -> "Lost City"
|
||||
83 -> "The Lost Tribe"
|
||||
84 -> "Lunar Diplomacy"
|
||||
85 -> "Making History"
|
||||
86 -> "Merlin's Crystal"
|
||||
87 -> "Monkey Madness"
|
||||
88 -> "Monk's Friend"
|
||||
89 -> "Mountain Daughter"
|
||||
90 -> "Mourning's End Part I"
|
||||
91 -> "Mourning's End Part II"
|
||||
92 -> "Murder Mystery"
|
||||
93 -> "My Arm's Big Adventure"
|
||||
94 -> "Nature Spirit"
|
||||
95 -> "Observatory Quest"
|
||||
96 -> "One Small Favour"
|
||||
97 -> "Plague City"
|
||||
98 -> "Priest in Peril"
|
||||
99 -> "Rag and Bone Man"
|
||||
100 -> "Ratcatchers"
|
||||
101 -> "Recipe for Disaster"
|
||||
102 -> "Recruitment Drive"
|
||||
103 -> "Regicide"
|
||||
104 -> "Roving Elves"
|
||||
105 -> "Royal Trouble"
|
||||
106 -> "Rum Deal"
|
||||
107 -> "Scorpion Catcher"
|
||||
108 -> "Sea Slug"
|
||||
109 -> "The Slug Menace"
|
||||
110 -> "Shades of Mort'ton"
|
||||
111 -> "Shadow of the Storm"
|
||||
112 -> "Sheep Herder"
|
||||
113 -> "Shilo Village"
|
||||
114 -> "A Soul's Bane"
|
||||
115 -> "Spirits of the Elid"
|
||||
116 -> "Swan Song"
|
||||
117 -> "Tai Bwo Wannai Trio"
|
||||
118 -> "A Tail of Two Cats"
|
||||
119 -> "Tears of Guthix"
|
||||
120 -> "Temple of Ikov"
|
||||
121 -> "Throne of Miscellania"
|
||||
122 -> "The Tourist Trap"
|
||||
123 -> "Witch's House"
|
||||
124 -> "Tree Gnome Village"
|
||||
125 -> "Tribal Totem"
|
||||
126 -> "Troll Romance"
|
||||
127 -> "Troll Stronghold"
|
||||
128 -> "Underground Pass"
|
||||
129 -> "Wanted!"
|
||||
130 -> "Watchtower"
|
||||
131 -> "Cold War"
|
||||
132 -> "The Fremennik Isles"
|
||||
133 -> "Tower of Life"
|
||||
134 -> "The Great Brain Robbery"
|
||||
135 -> "What Lies Below"
|
||||
136 -> "Olaf's Quest"
|
||||
137 -> "Another Slice of H.A.M"
|
||||
138 -> "Dream Mentor"
|
||||
139 -> "Grim Tales"
|
||||
140 -> "King's Ransom"
|
||||
141 -> "The Path of Glouphrie"
|
||||
142 -> "Back to my Roots"
|
||||
143 -> "Land of the Goblins"
|
||||
144 -> "Dealing with Scabaras"
|
||||
145 -> "Wolf Whistle"
|
||||
146 -> "As a First Resort..."
|
||||
147 -> "Catapult Construction"
|
||||
148 -> "Kennith's Concerns"
|
||||
149 -> "Legacy of Seergaze"
|
||||
150 -> "Perils of Ice Mountain"
|
||||
151 -> "TokTz-Ket-Dill"
|
||||
152 -> "Smoking Kills"
|
||||
153 -> "Rocking Out"
|
||||
154 -> "Spirit of Summer"
|
||||
155 -> "Meeting History"
|
||||
156 -> "All Fired Up"
|
||||
157 -> "Summer's End"
|
||||
158 -> "Defender of Varrock"
|
||||
159 -> "Swept Away"
|
||||
160 -> "While Guthix Sleeps"
|
||||
161 -> "In Pyre Need"
|
||||
162 -> "Myths of the White Lands"
|
||||
else -> ""
|
||||
}
|
||||
return quest as String
|
||||
return name
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ public class SmeltingInterface extends ComponentPlugin {
|
|||
* @author 'Vexia
|
||||
*/
|
||||
public enum BarButton {
|
||||
BRONZE_1(16, Bar.BRONZE, 1), BRONZE_5(15, Bar.BRONZE, 5), BRONZE_10(14, Bar.BRONZE, 30), BRONZE_X(13, Bar.BRONZE, -1), BLURITE_1(20, Bar.BLURITE, 1), BLURITE_5(19, Bar.BLURITE, 5), BLURITE_10(18, Bar.BLURITE, 30), BLURITE_X(17, Bar.BLURITE, -1), IRON_1(24, Bar.IRON, 1), IRON_5(23, Bar.IRON, 5), IRON_10(22, Bar.IRON, 30), IRON_X(21, Bar.IRON, -1), SILVER_1(28, Bar.SILVER, 1), SILVER_5(27, Bar.SILVER, 5), SILVER_10(26, Bar.SILVER, 30), SILVER_X(25, Bar.SILVER, -1), STEEL_1(32, Bar.STEEL, 1), STEEL_5(31, Bar.STEEL, 5), STEEL_10(30, Bar.STEEL, 30), STEEL_X(29, Bar.STEEL, -1), GOLD_1(36, Bar.GOLD, 1), GOLD_5(35, Bar.GOLD, 5), GOLD_10(34, Bar.GOLD, 30), GOLD_X(33, Bar.GOLD, -1), MITHRIL_1(40, Bar.MITHRIL, 1), MITHRIL_5(39, Bar.MITHRIL, 5), MITHRIL_10(38, Bar.MITHRIL, 30), MITHRIL_X(37, Bar.MITHRIL, -1), ADAMANT_1(44, Bar.ADAMANT, 1), ADAMANT_5(43, Bar.ADAMANT, 5), ADAMANT_10(42, Bar.ADAMANT, 30), ADAMANT_X(41, Bar.ADAMANT, -1), RUNE_1(48, Bar.RUNITE, 1), RUNE_5(47, Bar.RUNITE, 5), RUNE_10(46, Bar.RUNITE, 30), RUNE_X(45, Bar.RUNITE, -1);
|
||||
BRONZE_1(16, Bar.BRONZE, 1), BRONZE_5(15, Bar.BRONZE, 5), BRONZE_10(14, Bar.BRONZE, 10), BRONZE_X(13, Bar.BRONZE, -1), BLURITE_1(20, Bar.BLURITE, 1), BLURITE_5(19, Bar.BLURITE, 5), BLURITE_10(18, Bar.BLURITE, 10), BLURITE_X(17, Bar.BLURITE, -1), IRON_1(24, Bar.IRON, 1), IRON_5(23, Bar.IRON, 5), IRON_10(22, Bar.IRON, 10), IRON_X(21, Bar.IRON, -1), SILVER_1(28, Bar.SILVER, 1), SILVER_5(27, Bar.SILVER, 5), SILVER_10(26, Bar.SILVER, 10), SILVER_X(25, Bar.SILVER, -1), STEEL_1(32, Bar.STEEL, 1), STEEL_5(31, Bar.STEEL, 5), STEEL_10(30, Bar.STEEL, 10), STEEL_X(29, Bar.STEEL, -1), GOLD_1(36, Bar.GOLD, 1), GOLD_5(35, Bar.GOLD, 5), GOLD_10(34, Bar.GOLD, 10), GOLD_X(33, Bar.GOLD, -1), MITHRIL_1(40, Bar.MITHRIL, 1), MITHRIL_5(39, Bar.MITHRIL, 5), MITHRIL_10(38, Bar.MITHRIL, 10), MITHRIL_X(37, Bar.MITHRIL, -1), ADAMANT_1(44, Bar.ADAMANT, 1), ADAMANT_5(43, Bar.ADAMANT, 5), ADAMANT_10(42, Bar.ADAMANT, 10), ADAMANT_X(41, Bar.ADAMANT, -1), RUNE_1(48, Bar.RUNITE, 1), RUNE_5(47, Bar.RUNITE, 5), RUNE_10(46, Bar.RUNITE, 10), RUNE_X(45, Bar.RUNITE, -1);
|
||||
|
||||
/**
|
||||
* Constructs a new {@code BarButton} {@code Object}.
|
||||
|
|
|
|||
|
|
@ -1,15 +1,15 @@
|
|||
package content.global.handlers.iface.bank
|
||||
|
||||
import content.global.dialogue.BankDepositDialogue
|
||||
import content.global.dialogue.BankHelpDialogue
|
||||
import core.ServerConstants
|
||||
import core.api.*
|
||||
import core.game.component.Component
|
||||
import core.game.container.Container
|
||||
import core.game.interaction.InterfaceListener
|
||||
import core.game.node.entity.player.Player
|
||||
import org.rs09.consts.Components
|
||||
import org.rs09.consts.Items
|
||||
import core.ServerConstants
|
||||
import content.global.dialogue.BankDepositDialogue
|
||||
import content.global.dialogue.BankHelpDialogue
|
||||
import core.game.interaction.InterfaceListener
|
||||
|
||||
/**
|
||||
* Allows the user to interact with the Bank Interface.
|
||||
|
|
@ -58,6 +58,8 @@ class BankInterface : InterfaceListener {
|
|||
}
|
||||
|
||||
private fun onBankInterfaceOpen(player: Player, component: Component): Boolean {
|
||||
player.bank.sendBankSpace()
|
||||
|
||||
val settings = IfaceSettingsBuilder()
|
||||
.enableAllOptions()
|
||||
.enableSlotSwitch()
|
||||
|
|
@ -72,12 +74,14 @@ class BankInterface : InterfaceListener {
|
|||
ServerConstants.BANK_SIZE
|
||||
)
|
||||
|
||||
resetSearch(player)
|
||||
return false
|
||||
}
|
||||
|
||||
private fun handleTabInteraction(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean {
|
||||
resetSearch(player)
|
||||
if (getAttribute(player, "search", false)) {
|
||||
player.bank.reopen()
|
||||
}
|
||||
|
||||
val clickedTabIndex = -((buttonID - 41) / 2)
|
||||
|
||||
when (opcode) {
|
||||
|
|
@ -98,16 +102,36 @@ class BankInterface : InterfaceListener {
|
|||
private fun handleBankMenu(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean {
|
||||
val item = player.bank.get(slot)
|
||||
?: return true
|
||||
resetSearch(player)
|
||||
|
||||
when (opcode) {
|
||||
OP_AMOUNT_ONE -> player.bank.takeItem(slot, 1)
|
||||
OP_AMOUNT_FIVE -> player.bank.takeItem(slot, 5)
|
||||
OP_AMOUNT_TEN -> player.bank.takeItem(slot, 10)
|
||||
OP_AMOUNT_LAST_X -> player.bank.takeItem(slot, player.bank.lastAmountX)
|
||||
OP_AMOUNT_X -> BankUtils.transferX(player, slot, true)
|
||||
OP_AMOUNT_ALL -> player.bank.takeItem(slot, player.bank.getAmount(item))
|
||||
OP_AMOUNT_ALL_BUT_ONE -> player.bank.takeItem(slot, player.bank.getAmount(item) - 1)
|
||||
OP_AMOUNT_ONE -> runWorldTask { player.bank.takeItem(slot, 1) }
|
||||
OP_AMOUNT_FIVE -> runWorldTask { player.bank.takeItem(slot, 5) }
|
||||
OP_AMOUNT_TEN -> runWorldTask { player.bank.takeItem(slot, 10) }
|
||||
OP_AMOUNT_LAST_X -> runWorldTask {
|
||||
player.bank.takeItem(
|
||||
slot,
|
||||
player.bank.lastAmountX
|
||||
)
|
||||
}
|
||||
OP_AMOUNT_X -> runWorldTask {
|
||||
BankUtils.transferX(
|
||||
player,
|
||||
slot,
|
||||
true
|
||||
)
|
||||
}
|
||||
OP_AMOUNT_ALL -> runWorldTask {
|
||||
player.bank.takeItem(
|
||||
slot,
|
||||
player.bank.getAmount(item)
|
||||
)
|
||||
}
|
||||
OP_AMOUNT_ALL_BUT_ONE -> runWorldTask {
|
||||
player.bank.takeItem(
|
||||
slot,
|
||||
player.bank.getAmount(item) - 1
|
||||
)
|
||||
}
|
||||
OP_EXAMINE -> {
|
||||
var examineText = item.definition.examine
|
||||
val id = item.definition.id
|
||||
|
|
@ -126,7 +150,6 @@ class BankInterface : InterfaceListener {
|
|||
private fun handleInventoryMenu(player: Player, component: Component, opcode: Int, buttonID: Int, slot: Int, itemID: Int): Boolean {
|
||||
val item = player.inventory.get(slot)
|
||||
?: return true
|
||||
resetSearch(player)
|
||||
|
||||
when (opcode) {
|
||||
OP_AMOUNT_ONE -> player.bank.addItem(slot, 1)
|
||||
|
|
@ -188,11 +211,4 @@ class BankInterface : InterfaceListener {
|
|||
|
||||
return false
|
||||
}
|
||||
|
||||
private fun resetSearch (player: Player)
|
||||
{
|
||||
val lastTab = getAttribute(player, "bank:lasttab", 0)
|
||||
player.bank.tabIndex = lastTab
|
||||
setVarc(player, 190, 1) //re-enable "Search" right-click option on search button.
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ public class GrandExchangeInterface extends ComponentPlugin {
|
|||
GrandExchangeOffer offer;
|
||||
GrandExchangeRecords records = GrandExchangeRecords.getInstance(player);
|
||||
if (index > -1 && (offer = records.getOffer(records.getOfferRecords()[index])) != null) {
|
||||
StockMarket.withdraw(player, offer, slot >> 1, opcode);
|
||||
StockMarket.withdraw(player, offer, slot >> 1);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ class StockMarket : InterfaceListener {
|
|||
209,211 -> if (openedOffer == null){
|
||||
SystemLogger.logGE("[WARN] Player tried to withdraw item with null openedOffer!")
|
||||
return@on false
|
||||
} else withdraw(player, openedOffer, (button - 209) shr 1, op)
|
||||
} else withdraw(player, openedOffer, (button - 209) shr 1)
|
||||
190 -> confirmOffer(player, tempOffer, openedIndex).also { return@on true }
|
||||
194 -> player.interfaceManager.openChatbox(Components.OBJDIALOG_389)
|
||||
203 -> abortOffer(player, openedOffer)
|
||||
|
|
@ -342,7 +342,7 @@ class StockMarket : InterfaceListener {
|
|||
}
|
||||
|
||||
@JvmStatic
|
||||
fun withdraw(player: Player, offer: GrandExchangeOffer, index: Int, op: Int)
|
||||
fun withdraw(player: Player, offer: GrandExchangeOffer, index: Int)
|
||||
{
|
||||
val item = offer.withdraw[index]
|
||||
if(item == null)
|
||||
|
|
@ -351,32 +351,20 @@ class StockMarket : InterfaceListener {
|
|||
return
|
||||
}
|
||||
|
||||
when (op) {
|
||||
// withdraw notes
|
||||
155 -> {
|
||||
val note = item.noteChange
|
||||
if (note == -1) {
|
||||
sendMessage(player, "This item cannot be noted")
|
||||
return
|
||||
}
|
||||
if (hasSpaceFor(player, Item(note, item.amount))) {
|
||||
addItem(player, note, item.amount)
|
||||
} else {
|
||||
playAudio(player, Sounds.GE_TRADE_ERROR_4039)
|
||||
sendMessage(player, "You do not have enough room in your inventory.")
|
||||
return
|
||||
}
|
||||
}
|
||||
// withdraw items
|
||||
196 -> {
|
||||
if (hasSpaceFor(player, item)) {
|
||||
addItem(player, item.id, item.amount)
|
||||
} else {
|
||||
playAudio(player, Sounds.GE_TRADE_ERROR_4039)
|
||||
sendMessage(player, "You do not have enough room in your inventory.")
|
||||
return
|
||||
}
|
||||
if(hasSpaceFor(player, item))
|
||||
{
|
||||
addItem(player, item.id, item.amount)
|
||||
}
|
||||
else
|
||||
{
|
||||
val note = item.noteChange
|
||||
if(note == -1 || !hasSpaceFor(player, Item(note, item.amount)))
|
||||
{
|
||||
playAudio(player, Sounds.GE_TRADE_ERROR_4039)
|
||||
sendMessage(player, "You do not have enough room in your inventory.")
|
||||
return
|
||||
}
|
||||
else addItem(player, note, item.amount)
|
||||
}
|
||||
|
||||
offer.withdraw[index] = null
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ import core.game.world.update.flag.context.Graphics
|
|||
import org.rs09.consts.Items
|
||||
import org.rs09.consts.Scenery
|
||||
import org.rs09.consts.Sounds
|
||||
import content.data.Quests
|
||||
|
||||
@Suppress("unused")
|
||||
class EctophialListener : InteractionListener {
|
||||
|
|
@ -38,7 +37,7 @@ class EctophialListener : InteractionListener {
|
|||
}
|
||||
|
||||
on(Items.ECTOPHIAL_4251, IntType.ITEM, "empty") { player, node ->
|
||||
if (!hasRequirement(player, Quests.GHOSTS_AHOY))
|
||||
if (!hasRequirement(player, "Ghosts Ahoy"))
|
||||
return@on true
|
||||
|
||||
if (player.isTeleBlocked) {
|
||||
|
|
@ -46,29 +45,28 @@ class EctophialListener : InteractionListener {
|
|||
return@on true
|
||||
}
|
||||
delayEntity(player, 10)
|
||||
closeAllInterfaces(player)
|
||||
queueScript(player, 0, QueueStrength.SOFT) { stage: Int ->
|
||||
when (stage) {
|
||||
0 -> {
|
||||
sendMessage(player, "You empty the ectoplasm onto the ground around your feet...")
|
||||
playAudio(player, 4580)
|
||||
visualize(player, emptyAnimation, emptyGraphics)
|
||||
replaceSlot(player, node.asItem().slot, Item(Items.ECTOPHIAL_4252), Item(Items.ECTOPHIAL_4251))
|
||||
return@queueScript delayScript(player, emptyAnimation.duration)
|
||||
queueScript(player, 0, QueueStrength.SOFT) { stage: Int ->
|
||||
when (stage) {
|
||||
0 -> {
|
||||
sendMessage(player, "You empty the ectoplasm onto the ground around your feet...")
|
||||
playAudio(player, 4580)
|
||||
visualize(player, emptyAnimation, emptyGraphics)
|
||||
replaceSlot(player, node.asItem().slot, Item(Items.ECTOPHIAL_4252), Item(Items.ECTOPHIAL_4251))
|
||||
return@queueScript delayScript(player, emptyAnimation.duration)
|
||||
}
|
||||
1 -> {
|
||||
teleport(player, Location.create(3658, 3517, 0), TeleportType.ECTOPHIAL)
|
||||
sendMessage(player, "...and the world changes around you.")
|
||||
return@queueScript delayScript(player, 9)
|
||||
}
|
||||
2 -> {
|
||||
face(player, Location(3659, 3519, 0))
|
||||
refillEctophial(player)
|
||||
return@queueScript stopExecuting(player)
|
||||
}
|
||||
else -> return@queueScript stopExecuting(player)
|
||||
}
|
||||
1 -> {
|
||||
teleport(player, Location.create(3658, 3517, 0), TeleportType.ECTOPHIAL)
|
||||
sendMessage(player, "...and the world changes around you.")
|
||||
return@queueScript delayScript(player, 9)
|
||||
}
|
||||
2 -> {
|
||||
face(player, Location(3659, 3519, 0))
|
||||
refillEctophial(player)
|
||||
return@queueScript stopExecuting(player)
|
||||
}
|
||||
else -> return@queueScript stopExecuting(player)
|
||||
}
|
||||
}
|
||||
return@on true
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ class EmptyOptionListener : InteractionListener {
|
|||
BONE_MEAL(Items.BONEMEAL_4255, Items.EMPTY_POT_1931, "You empty the pot of crushed bones."),
|
||||
BUCKET_OF_SAND(Items.BUCKET_OF_SAND_1783, Items.BUCKET_1925, "You empty the contents of the bucket onto the floor.", Sounds.SAND_BUCKET_2584),
|
||||
BUCKET_OF_MILK(Items.BUCKET_OF_MILK_1927, Items.BUCKET_1925, "You empty the contents of the bucket onto the floor.", Sounds.LIQUID_2401),
|
||||
BUCKET_OF_WATER(Items.BUCKET_OF_WATER_1929, Items.BUCKET_1925, "You empty the contents of the bucket on the floor.", Sounds.LIQUID_2401),
|
||||
BUCKET_OF_WATER(Items.BUCKET_OF_WATER_1929, Items.BUCKET_1925, "You empty the contents of the bucket onto the floor.", Sounds.LIQUID_2401),
|
||||
BUCKET_OF_COMPOST(Items.COMPOST_6032, Items.BUCKET_1925, "You empty the bucket of compost."),
|
||||
BUCKET_OF_SUPERCOMPOST(Items.SUPERCOMPOST_6034, Items.BUCKET_1925, "You empty the bucket of supercompost."),
|
||||
BUCKET_OF_SLIME(Items.BUCKET_OF_SLIME_4286, Items.BUCKET_1925, "You empty the contents of the bucket on the floor.", Sounds.LIQUID_2401),
|
||||
|
|
|
|||
|
|
@ -10,14 +10,12 @@ import org.rs09.consts.Sounds
|
|||
class EnchantJewelleryTabListener : InteractionListener {
|
||||
|
||||
private val LVL_1_ENCHANT = mapOf(
|
||||
Items.BLUE_DRAGONHIDE_1751 to Items.PLAIN_SATCHEL_10877,
|
||||
Items.SAPPHIRE_RING_1637 to Items.RING_OF_RECOIL_2550,
|
||||
Items.SAPPHIRE_NECKLACE_1656 to Items.GAMES_NECKLACE8_3853,
|
||||
Items.SAPPHIRE_AMULET_1694 to Items.AMULET_OF_MAGIC_1727,
|
||||
Items.SAPPHIRE_BRACELET_11072 to Items.BRACELET_OF_CLAY_11074
|
||||
)
|
||||
private val LVL_2_ENCHANT = mapOf(
|
||||
Items.GREEN_DRAGONHIDE_1753 to Items.GREEN_SATCHEL_10878,
|
||||
Items.EMERALD_RING_1639 to Items.RING_OF_DUELLING8_2552,
|
||||
Items.EMERALD_NECKLACE_1658 to Items.BINDING_NECKLACE_5521,
|
||||
Items.EMERALD_AMULET_1696 to Items.AMULET_OF_DEFENCE_1729,
|
||||
|
|
@ -25,7 +23,6 @@ class EnchantJewelleryTabListener : InteractionListener {
|
|||
)
|
||||
|
||||
private val LVL_3_ENCHANT = mapOf(
|
||||
Items.RED_DRAGONHIDE_1749 to Items.RED_SATCHEL_10879,
|
||||
Items.RUBY_RING_1641 to Items.RING_OF_FORGING_2568,
|
||||
Items.RUBY_NECKLACE_1660 to Items.DIGSITE_PENDANT_5_11194,
|
||||
Items.RUBY_AMULET_1698 to Items.AMULET_OF_STRENGTH_1725,
|
||||
|
|
@ -33,7 +30,6 @@ class EnchantJewelleryTabListener : InteractionListener {
|
|||
)
|
||||
|
||||
private val LVL_4_ENCHANT = mapOf(
|
||||
Items.DAGANNOTH_HIDE_6155 to Items.GOLD_SATCHEL_10881,
|
||||
Items.DIAMOND_RING_1643 to Items.RING_OF_LIFE_2570,
|
||||
Items.DIAMOND_NECKLACE_1662 to Items.PHOENIX_NECKLACE_11090,
|
||||
Items.DIAMOND_AMULET_1700 to Items.AMULET_OF_POWER_1731,
|
||||
|
|
@ -41,7 +37,6 @@ class EnchantJewelleryTabListener : InteractionListener {
|
|||
)
|
||||
|
||||
private val LVL_5_ENCHANT = mapOf(
|
||||
Items.SUQAH_HIDE_9080 to Items.RUNE_SATCHEL_10882,
|
||||
Items.DRAGONSTONE_RING_1645 to Items.RING_OF_WEALTH4_14646,
|
||||
Items.DRAGON_NECKLACE_1664 to Items.SKILLS_NECKLACE4_11105,
|
||||
Items.DRAGONSTONE_AMMY_1702 to Items.AMULET_OF_GLORY4_1712,
|
||||
|
|
@ -49,7 +44,6 @@ class EnchantJewelleryTabListener : InteractionListener {
|
|||
)
|
||||
|
||||
private val LVL_6_ENCHANT = mapOf(
|
||||
Items.BLACK_DRAGONHIDE_1747 to Items.BLACK_SATCHEL_10880,
|
||||
Items.ONYX_RING_6575 to Items.RING_OF_STONE_6583,
|
||||
Items.ONYX_NECKLACE_6577 to Items.BERSERKER_NECKLACE_11128,
|
||||
Items.ONYX_AMULET_6581 to Items.AMULET_OF_FURY_6585,
|
||||
|
|
@ -58,7 +52,6 @@ class EnchantJewelleryTabListener : InteractionListener {
|
|||
|
||||
override fun defineListeners() {
|
||||
on(IntType.ITEM, "break") {player, node ->
|
||||
closeAllInterfaces(player)
|
||||
delayEntity(player, 1)
|
||||
queueScript(player, strength = QueueStrength.SOFT) {
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package content.global.handlers.item
|
||||
|
||||
import content.global.skill.slayer.SlayerUtils
|
||||
import core.api.*
|
||||
import content.global.skill.slayer.Tasks
|
||||
import org.rs09.consts.Items
|
||||
|
|
@ -42,8 +41,7 @@ class EnchantedGemDialogue() : DialogueFile() {
|
|||
if(getSlayerTask(player!!) == Tasks.JAD) {
|
||||
npcl(core.game.dialogue.FacialExpression.FRIENDLY, "You're currently assigned to kill TzTok-Jad!")
|
||||
} else {
|
||||
npcl(core.game.dialogue.FacialExpression.FRIENDLY, "You're currently assigned to kill ${SlayerUtils.pluralise(
|
||||
getSlayerTaskName(player!!))}; only ${getSlayerTaskKillsRemaining(player!!)} more to go.")
|
||||
npcl(core.game.dialogue.FacialExpression.FRIENDLY, "You're currently assigned to kill ${getSlayerTaskName(player!!)}s; only ${getSlayerTaskKillsRemaining(player!!)} more to go.")
|
||||
}
|
||||
setVarp(player!!, 2502, getSlayerTaskFlags(player!!) shr 4)
|
||||
stage = 1
|
||||
|
|
|
|||
|
|
@ -11,11 +11,10 @@ import content.data.EnchantedJewellery
|
|||
import core.game.interaction.InteractionListener
|
||||
import core.game.interaction.IntType
|
||||
import core.tools.START_DIALOGUE
|
||||
import org.rs09.consts.Items
|
||||
|
||||
/**
|
||||
* Listener for enchanted jewellery options
|
||||
* @author Ceikry, downthecrop, Player Name
|
||||
* @author Ceikry & downthecrop
|
||||
*/
|
||||
class EnchantedJewelleryListener : InteractionListener {
|
||||
|
||||
|
|
@ -34,10 +33,6 @@ class EnchantedJewelleryListener : InteractionListener {
|
|||
private fun handle(player: Player, node: Node, isEquipped: Boolean) {
|
||||
player.pulseManager.clear(PulseType.STANDARD)
|
||||
val item = node.asItem()
|
||||
if (item.id == Items.RING_OF_LIFE_2570) {
|
||||
sendMessage(player, "You can't operate that.")
|
||||
return
|
||||
}
|
||||
val jewellery = EnchantedJewellery.idMap[item.id]
|
||||
if (jewellery != null) {
|
||||
if (jewellery.isLastItemIndex(jewellery.getItemIndex(item)) && !jewellery.isCrumble) {
|
||||
|
|
@ -65,4 +60,4 @@ class EnchantedJewelleryListener : InteractionListener {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -8,6 +8,7 @@ import core.game.world.map.Location
|
|||
import org.json.simple.JSONObject
|
||||
import org.rs09.consts.Items
|
||||
import core.ServerStore
|
||||
import core.ServerStore.Companion.getBoolean
|
||||
import core.ServerStore.Companion.getInt
|
||||
import core.game.interaction.IntType
|
||||
import core.game.interaction.InteractionListener
|
||||
|
|
@ -23,11 +24,7 @@ class ExplorersRingPlugin : InteractionListener {
|
|||
on(RINGS, IntType.ITEM, "run-replenish"){ player, node ->
|
||||
val charges = getStoreFile().getInt(player.username.toLowerCase() + ":run")
|
||||
if (charges >= getRingLevel(node.id)) {
|
||||
sendDialogue(player,"Your ring appears to have no more run energy recharges left for today.")
|
||||
return@on true
|
||||
}
|
||||
if (player.settings.runEnergy == 100.0) {
|
||||
sendMessage(player, "You are fully rested. You do not need to use the ring's power for the moment.")
|
||||
sendMessage(player,"You have used all the charges you can for one day.")
|
||||
return@on true
|
||||
}
|
||||
player.settings.updateRunEnergy(-50.0)
|
||||
|
|
@ -53,17 +50,17 @@ class ExplorersRingPlugin : InteractionListener {
|
|||
sendMessage(player, "You have used up all of your charges for the day.")
|
||||
return@on true
|
||||
}
|
||||
//sendDialogue(player, "Choose the item that you wish to convert to coins.")
|
||||
//addDialogueAction (player) {_,_ ->
|
||||
sendItemSelect (player, "Cast Low Level Alchemy on:") { slot, optionIndex ->
|
||||
sendDialogue(player, "Choose the item you wish to convert to coins.")
|
||||
addDialogueAction (player) {_,_ ->
|
||||
sendItemSelect (player, "Choose") { slot, optionIndex ->
|
||||
val item = player.inventory[slot]
|
||||
if (item == null)
|
||||
return@sendItemSelect
|
||||
if (!ModernListeners().alchemize(player, item, false, explorersRing = true))
|
||||
if (!ModernListeners().alchemize(player, item, false))
|
||||
return@sendItemSelect
|
||||
getStoreFile()[player.username.lowercase() + ":alchs"] = remaining - 1
|
||||
}
|
||||
//}
|
||||
}
|
||||
return@on true
|
||||
}
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue