Compare commits

..

No commits in common. "main" and "2009Scape" have entirely different histories.

33 changed files with 503 additions and 595 deletions

141
README.md
View File

@ -1,47 +1,152 @@
<p align="center">
<a href="https://gitlab.com/emoscape/emoscape">
<img src="https://emoscape.org/emologo.png" alt="Logo" width="300" height="263">
</a>
<h3 align="center">An open source MMORPG emulation server, made with love and passion</h3>
[![AGPL-3.0 License][license-shield]][license-url]
<h1 align="center"><a href="https://emoscape.org/"><strong>Play the live server »</strong></a></h1>
<br />
<p align="center">
<a href="https://gitlab.com/2009scape/2009scape">
<img src="https://i.imgur.com/RsfVfkB.png" alt="Logo" width="300" height="67">
</a>
<h3 align="center">An open source MMORPG emulation server</h3>
<h1 align="center"><a href="https://2009scape.org/"><strong>Play the live server »</strong></a></h1>
<p align="center">
<br />
<br />
<a href="https://emoscape.org/">Community Hosted Server</a>
· <a href="https://git.emoscape.org">Report Bug</a>
<a href="https://2009scape.org/">Community Hosted Server</a>
·
<a href="https://discord.gg/43YPGND">Discord Invite</a>
· <a href="https://gitlab.com/2009scape/2009scape/-/issues">Report Bug</a>
</p>
<h3>NOTE: Bug reports and support are only accepted by/offered to players of our live hosted server. We will not provide support to those running their own copies.</h3>
## Table of Contents
* [Live Server Information](#live-server-information)
* [History of this Codebase](#history-of-this-codebase)
* [Why the Fork?](#why-the-fork)
* [Our Core Values](#our-core-values)
* [Contributing](#contributing)
* [Setup for Content Developers](#content-developers-setting-up-the-project)
* [GitLab Setup](#gitlab-setup)
* [Prerequisites](#prerequisites)
* [Project Setup](#project-setup)
* [Running the project](#running-the-project)
* [License](#license)
* [Contact](#contact)
## Live Server Information
If you just want to play the game click [here](https://emoscape.org). Clients for various operating systems will be provided here
Did you know that the 2009Scape Development Team hosts the main branch of this repo that you can connect to and play? Come join a growing community of people that love to grind out skills, quest, and hangout together. A download link for the launcher can be found [here](https://2009scape.org). Connecting to the live server is also one of the easiest ways to identify bugs/typos/missing features. Identifying these issues help developers, whether already on the project, or are even brand new to the project, fix bugs and issues in an expedited rate.
## History of this Codebase
This code is simply a fork of 2009scape, which in itself has a long history. Go to the [2009Scape project GitLab](https://gitlab.com/2009scape) if you want to read more about the history of this project
The 2009Scape you see today has gone through a magnitude of changes. Originally starting its life as Arios498, this server saw a lot of people playing it daily, unfortunately, it was for profit and closed source. It was later upgraded to Arios530, targeting the build 530 of runescape with content in and around January 1st, 2009. Development came to a halt when a developer of the closed source project released the source code. The original developers of this server went on to create Kratos 530 back in 2015.
## Why the Fork
This project was started out of love for the 530 revision. A small group of developers spent thousands of hours improving on the existing source that was left to the curb. Over the past year, this project has seen many developers coming and going, fixing bugs that they find either through their own server, or bugs that they find in the live game that is currently hosted. We do not accept donations of any kind. The smiles and wonderful compliments are more than enough to keep us going! Content and bugfixes are always number one on our list, and we try our best to answer any questions that you may have, provided you have read through this readme and frequently asked questions on the discord.
This is a personal pet project of Emo (IGN Emo Boy from 2009Scape). I personally have a great deal of appreciation for the various developers and other volunteers and contributors of the 2009Scape project, and indeed this code base will continue to maintain a mirror of the 2009Scape code in the form of its 2009Scape branch. I share in many of the core values (eg running an RSPS out of passion and love for a game, not for profit).
## Our Core Values
However, while the 2009Scape project is focused on absolute authenticity of the 530 release of RS2, I am inclined to prioritize fun over dogma. While I do not anticipate adding much custom content to this game, I am not going to rule out small QoLs or cosmetic adjustments, and see where the game goes. After all, just as Jagex decided to take RS2 in a certain direction, there is no reason to think we cant have fun in advancing 2009Scape. TLDR: While the 2009Scape project is focused on recreating the game of my middle school years, letter for letter, this project will be an expression of the fun and sense of adventure we had in those days.
In the current climate of RuneScape Private Servers in general, we believe it's important to wear our core values on our sleeves and defend them with everything we have! Below are what we hold as our core, most important values:
Another way to think of it: in the open source model, imagine 2009Scape as the Linux Kernel, and this project being a “distro” with more custom features (namely stuff I think adds to the game).
* **We do NOT believe in profiting off an RSPS.** To many of us here at the 2009Scape team, what we care about most is preserving the wonderful work of the Gower brothers in the most true-to-spirit manner possible. We do NOT do this to make a profit, and in fact **we outright refuse donations.** This is a labor of love and passion for everyone involved, a love for real RS2! This is perhaps the single most central value we have. If you want to "donate" to us, do so with your time and your dedication. That is what we desire most.
* **Authenticity is central to the work**. As a remake, one of the most important things to us is being true to the Gower spirit. What the Gowers brought to us in our childhood is what we are driven to preserve for the remainder of the world.
* **Open Source is crucial to the project**. We believe open source remakes to be crucial to preserving what we loved in our childhood, and we believe for-profit and/or closed-source servers are destined to flounder out and fail.
* **Be welcoming**. One of our most important goals is to provide a community of friendly and caring people that get along and love to enjoy the game with eachother. For this reason, we do tend to be very strict when it comes to toxicity. We care about quality a whole lot more than quantity!
## Contributing
I would strongly recommend contributing code to the [2009Scape project](https://gitlab.com/2009scape).
**Note: All merge requests MUST be made using the defaut MR template. Merge requests that do not use this template will not be accepted.**
## License
**Note: All new contributions MUST be made in Kotlin unless you are updating or fixing a bug in legacy code. More information on Kotlin can be found [here](https://kotlinlang.org/).**
Like 2009Scape, this is AGPLv3. This is, in my opinion, the only proper license for an open source RSPS. The key term of the license being if you wish to use this code to host your own server, you must also offer the source code for people to inspect and use, and allow them to make modifications to it as I did with 2009Scape's code.
There are many ways everyone can contribute! From the most seasoned programmers to those who do not have the most remote clue how code works! Below are some things that can always use some love from the community.
* **Content Testers**: I'm putting this one up top because of its importance. We, the contributors and developers, aren't perfect. Sometimes, we make mistakes. This is where you come in - If you want a sneak peek at upcoming content, have a knack for breaking things, or just want to contribute to the project without making code changes, you can become a tester! If you are interested in becoming a tester, reach out in the testing channel of the discord. [Why become a tester?](#why-become-a-tester)
* **Wiki Editors**: Did you know we have a wiki? Well it's always in need of people to fill it out and stay on top of it. Editing the wiki is one of the easiest ways you can contribute to 2009Scape! If you're an active player and have the will, there's so much you could be helping out with over at the wiki. [Click here to go to the wiki](https://cdn.2009scape.org/wiki/doku.php?id=start).
* **JSON editors**: We could always use more JSON editors! Please note that JSON editing **must** be done using the [Thanos Tool](https://gitlab.com/2009scape/tools/rs09-thanos-tool/-/jobs/5153567519/artifacts/file/build/libs/zaros.jar). **This does not run on modern Java** and requires **Java 11** to run (using the usual 'java -jar zaros.jar').
* **Authenticity Auditors**: As a remake, authenticity is central to our core values! We could always use someone to go through the game and create large lists of simple tasks that can be done to bring us closer to the authentic 2009 game! The preferred way to do this is one-area-at-a-time. If you want to see an example of some audits we've done in the past, take a look [here](https://gitlab.com/2009scape/2009scape/-/issues/46).
* **Code Contributors**: As a remake, we have massive amounts of content that need to be implemented or corrected. If you know how to program or are willing to learn, this is where you could be extremely helpful! We need everything from quests, to dialogue, to mini-games, to skills that still need to be corrected or implemented. This is perhaps one of the most valuable ways someone could help out the project! If you are interested in developing content, reach out in the development channel of the Discord.
## Content Developers: Setting Up the Project.
### GitLab Setup
**Note: This allows you to commit changes to the main repo (with approval)! Also, always stay up to date with the most recent updates by pulling into your copy when 2009Scape updates!**
1. Create a GitLab account if you haven't done so already.
2. Follow our Git Basics guide [over on the wiki.](https://gitlab.com/2009scape/2009scape/-/wikis/git-basics)
**If at anytime you have an issue with GitLab please refer to the [GitLab help center](https://gitlab.com/help).**
### Prerequisites
These are mandatory. If you don't install **all** of these programs **in order** prior to
the project's setup, things won't work. At all.
*For Windows users* - Turn developer mode on first in Windows developer settings.
* [JDK 11](https://adoptium.net) or the Java SE Development Kit Version 11
* [IntelliJ IDEA Community](https://www.jetbrains.com/idea/download/)
### SSH setup
1. [Set up a key if you don't have one (ed25519)](https://docs.gitlab.com/ee/user/ssh.html#generate-an-ssh-key-pair)
2. [Add your public key to your gitlab account](https://docs.gitlab.com/ee/user/ssh.html#add-an-ssh-key-to-your-gitlab-account)
3. [Verify you can connect to git@gitlab.com](https://docs.gitlab.com/ee/user/ssh.html#verify-that-you-can-connect)
### Project Setup
1. If you haven't already, make sure to follow our [Git Basics](https://gitlab.com/2009scape/2009scape/-/wikis/git-basics) guide.
2. Run `git lfs pull` in the 2009scape folder you cloned as part of that guide. This only has to be done once, ever.
3. Follow our [IntelliJ IDEA Setup Guide](https://gitlab.com/2009scape/2009scape/-/wikis/Setup-for-IntelliJ-IDEA-IDE)
### Running the project
1. If you followed the IntelliJ setup guide, which you probably should have, just use the provided run configuration.
***Note: If you choose not to use the provided run scripts or IntelliJ, you *must* run `mvn clean` before it will build correctly.***
#### Linux / OSX
Start the game server with the included run script. Use `./run -h` for more info.
#### Windows
Start the game server with `run-server.bat`
### License
We use the AGPL 3.0 license, which can be found [here](https://www.gnu.org/licenses/agpl-3.0.en.html). Please be sure to read and understand the license. Failure to follow the guidelines outlined in the license will result in legal action. If you know or hear of anyone breaking this license, please send a report, with proof, to Red Bracket#8151, ceikry#2724, or woahscam#8535 on discord or email woahscam@hotmail.com. **We WILL NOT change the license to fit your needs.**
### Contact
**Reminder: There is no official support for setting up your own server. Do not ping/dm developers, or ask in support channels about setting up your server. Support for the live server and 2009Scape single-player is available on the [2009Scape forums](https://forum.2009scape.org/).**
[license-shield]: https://img.shields.io/badge/license-AGPL--3.0-informational
[license-url]: https://www.gnu.org/licenses/agpl-3.0.en.html
### Why become a tester?
Before content hits Live, it has to be tested. We can, but do not want to do this alone, and would love the help! But don't worry, there is something in it for you. Credits! Keep in mind that credits will only be awarded to people who thoroughly test the content and provide detailed reports on them. Like votes or HoF you must claim them in the #claim-to-fame channel on discord or matrix.
* If you test smaller things like bug fixes there is a 2 credit reward.
* If you test full quests or minigames you will be rewarded 5 credits.
* If you find a bug in the content you are testing that hasn't already been found you will earn an extra credit.
These credits can be spent in the 2009Scape Reward Shop. It's important to be clear that credits are gained by contributions to the project. We cannot and will not accept donations (of any kind), especially not in exchange for in-game credits or perks.
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.

View File

@ -48,7 +48,7 @@
"Nice Armor @name!",
"Nice Weapon @name!",
"Venezuela #1",
"EmoScape and chill @name?",
"2009scape and chill @name?",
"@name is my girlfriend",
"Buying gf",
"Bank sale pm me for info",
@ -69,7 +69,7 @@
"Yes, Im botting. And?",
"ERROR: BOTSCRIPT 404. REPORT TO BOT OWNER (Evilwaffles)",
"Flash2:wave: FUCK",
"I love EmoScape!",
"I love 2009Scape!",
"Ja Ja Ja Ja",
"This is fun!",
"Ironman or youre a scrub @name.",
@ -181,10 +181,6 @@
"@name have you met Ceikry?",
"@name have you met Woah?",
"@name have you met Bushtail?",
"@name have you met Emo?",
"I'm just a kid, and life is a nightmare",
"And its all downhill from here",
"I'm sorry I can't be perfect",
"Wanna chill at my poh?",
"Whats the best place to train attack?",
"Good Waffles > Evil Waffles",
@ -200,7 +196,7 @@
"I dont use discord @name",
"I dont use the CC @name",
"Why should i use discord?",
"EmoScape is life",
"2009Scape is life",
"Brb gotta make dinner",
"I need to go to the GE",
"@name can i have a ge tele?",
@ -298,14 +294,14 @@
"Ur nuts @name",
"Lootshare go brr",
"Partay with froggay",
"Know what else is lame? Not being able to play EmoScape right now",
"Know what else is lame? Not being able to play 2009scape right now",
"Can you even grind on osrs",
"I botted to 88 fishing",
"Do not forget to vote in running polls!",
"Always check announcments",
"We thrivin",
"Ship @name",
"Dont forget to vote EmoScape!",
"Dont forget to vote 2009scape!",
"Kermit is too legit 2 quit",
"Out here on the range we are having fun",
"I am hank steel",
@ -397,8 +393,9 @@
"Fluff",
"Bwuh",
"I'm literally just mothin' bro",
"Certified EmoScape 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!",
"Owned!",
"Pwned!",
@ -413,7 +410,7 @@
"Yall got any deez?",
"Deez nuts",
"When she give you that yoinky sploinky",
"Sir, this is a EmoScape.",
"Sir, this is a 2009Scape.",
"Oh dear! You are dead!",
"Cor blimey, mate! What are ye doing in me pockets?",
"Yeah i got funnies",
@ -434,7 +431,7 @@
"Who's lone?",
"Who *is* he?",
"Hi @name, I'm Dad!",
"Baroo!",
"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!",
@ -447,12 +444,13 @@
":D",
"Die screaming",
"Only on Tuesdays",
"We stan 2009scape",
"There is no spoon",
"Where's the cow level?",
"Join EmoScape Clan Chat!",
"Join EmoScape Cc!",
"Join 2009scape Clan Chat!",
"Join 2009scape Cc!",
"Chop chop!",
"EmoScape rox my sox!!!!!!1",
"2009Scape 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?",
@ -469,7 +467,7 @@
"With this character's death, the thread of prophecy is severed.",
"You must gather your party before venturing forth.",
"Praise Andrew Gower",
"Please help me I can't stop playing EmoScape",
"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",
"@name, we've been trying to reach you about your car's extended warranty",
@ -790,6 +788,7 @@
"@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",

View File

@ -15,11 +15,6 @@ fun kidnapPlayer(player: Player, loc: Location, type: TeleportType) {
}
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)

View File

@ -46,23 +46,23 @@ 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()),
MAZE(npc = MazeNPC()),
DRILL_DEMON(npc = SergeantDamienNPC()),
EVIL_CHICKEN(npc = EvilChickenNPC()),
// STRANGE_PLANT(npc = StrangePlantNPC()),
// SWARM(npc = SwarmNPC()),
// EVIL_BOB(npc = EvilBobNPC(), skillIds = intArrayOf(Skills.FISHING, Skills.MAGIC)),
STRANGE_PLANT(npc = StrangePlantNPC()),
SWARM(npc = SwarmNPC()),
EVIL_BOB(npc = EvilBobNPC(), skillIds = intArrayOf(Skills.FISHING, Skills.MAGIC)),
DRUNKEN_DWARF(npc = DrunkenDwarfNPC()),
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)),
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));
// ZOMBIE(ZombieRENPC(), skillIds = intArrayOf(Skills.PRAYER));
ROCK_GOLEM(RockGolemRENPC(), skillIds = intArrayOf(Skills.MINING)),
SHADE(ShadeRENPC(), skillIds = intArrayOf(Skills.PRAYER)),
ZOMBIE(ZombieRENPC(), skillIds = intArrayOf(Skills.PRAYER));
companion object {
@JvmField

View File

@ -7,23 +7,23 @@ import core.game.interaction.InterfaceListener
object RulesAndInfo {
val RULES = arrayOf(
"<col=ffffff>1. Basically just don't be an asshole</col>",
" -No spamming, harassment, or other",
" disruptive behaviors",
"<col=ffffff>2. No exploitation of bugs.</col>",
"<col=ffffff>1. Be respectful to your fellow players.</col>",
" -No harassment, etc.",
" -Keep arguments private.",
"<col=ffffff>2. Do not exploit bugs.</col>",
" -Zero tolerance. Can result in account deletion.",
" -If you discover a bug, report it to Emo/admins.",
"<col=ffffff>3. Discuss or Advertising.</col>",
" -If you discover a bug, report it on our Gitlab.",
"<col=ffffff>3. Do not discuss or advertise other servers.</col>",
" -Discussion of the live jagex games is fine.",
" -Discussion of open source projects is fine.",
" -No advertising of non-open source RSPSs.",
"<col=ffffff>4. No unfair advantages.</col>",
" -No botting, autoclickers, AHKing, etc...",
" -Again, just don't be an asshole."
" -This includes autoclickers, autohotkey, etc.",
" -Exception: 1-to-1 inputs, such as mousekeys.",
" -Includes training methods that bypass AFK limits."
)
val SEPARATOR = "<str> </str>"
val INFO = arrayOf(
"<col=6bcdfa>Visit emoscape.org for more info </col>"
"<col=6bcdfa>Join the forums! forum.2009scape.org </col>"
)
@JvmStatic

View File

@ -90,7 +90,7 @@ public class PortalChamberPlugin extends OptionHandler {
for (Locations l : Locations.values()) {
if (l.name().contains(identifier)) {
if (l == Locations.ARDOUGNE){
if (!player.getAttribute(ARDOUGNE_TELE_ATTRIBUTE, false)) {
if (player.getAttribute(ARDOUGNE_TELE_ATTRIBUTE, false)){
player.sendMessage("You do not have the requirements to direct the portal there");
return;
}
@ -138,6 +138,12 @@ public class PortalChamberPlugin extends OptionHandler {
case "enter":
String objectName = object.getName();
for (Locations l : Locations.values()) {
if (l == Locations.ARDOUGNE){
if (player.getAttribute(ARDOUGNE_TELE_ATTRIBUTE, false)){
player.sendMessage("You do not have the requirements to enter this portal.");
return false;
}
}
if (objectName.toLowerCase().contains(l.name().toLowerCase())) {
player.teleport(l.location);
if (player.getHouseManager().isInHouse(player) && node.getId() == 13635) {

View File

@ -44,30 +44,29 @@ public final class CookingRecipePlugin extends UseWithHandler {
@Override
public boolean handle(NodeUsageEvent event) {
Recipe recipe = null;
Item part = null;
// TODO: Transitioning to a Listener would save an O(n) pass through the recipes list on every use-with
recipeloop:
for (Recipe temp : Recipe.RECIPES) {
if (temp.isSingular()) {
if (temp.getBase().getId() == event.getUsedItem().getId() || temp.getBase().getId() == event.getBaseItem().getId()) {
for (Item ingredient : temp.getIngredients()) {
if (ingredient.getId() == event.getBaseItem().getId() || ingredient.getId() == event.getUsedItem().getId()) {
recipe = temp;
break recipeloop;
break;
}
}
}
} else {
Item part = null;
Item ingredient = null;
for (int k = 0; k < temp.getParts().length; k++) {
for (int i = 0; i < temp.getIngredients().length; i++) {
Item tempPart = temp.getParts()[k];
Item ingredient = temp.getIngredients()[i];
if (tempPart.getId() == event.getUsedItem().getId() && ingredient.getId() == event.getBaseItem().getId() || tempPart.getId() == event.getBaseItem().getId() && ingredient.getId() == event.getUsedItem().getId()) {
part = temp.getParts()[k];
ingredient = temp.getIngredients()[i];
if (part.getId() == event.getUsedItem().getId() && ingredient.getId() == event.getBaseItem().getId() || part.getId() == event.getBaseItem().getId() && ingredient.getId() == event.getUsedItem().getId()) {
if (k == i) {// represents that this ingredient can
// mix with the other.
recipe = temp;
part = tempPart;
break recipeloop;
break;
}
}
}
@ -77,7 +76,6 @@ public final class CookingRecipePlugin extends UseWithHandler {
if (recipe != null) {
final Player player = event.getPlayer();
final Recipe recipe_ = recipe;
final Item part_ = part;
SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, recipe.getProduct()) {
@Override
public void create(final int amount, int index) {
@ -93,7 +91,7 @@ public final class CookingRecipePlugin extends UseWithHandler {
@Override
public int getAll(int index) {
return player.getInventory().getAmount(part_ != null ? part_ : recipe_.getBase());
return player.getInventory().getAmount(recipe_.getBase());
}
};
if (player.getInventory().getAmount(recipe.getBase()) == 1) {

View File

@ -119,9 +119,6 @@ public abstract class Recipe {
}
}
if (index != -1) {
if (!player.getInventory().containItems(event.getBaseItem().getId(), event.getUsedItem().getId())) {
return;
}
if (player.getInventory().remove(event.getBaseItem()) && player.getInventory().remove(event.getUsedItem())) {
player.getInventory().add(getParts()[index + 1]);
String message = getMixMessage(event);

View File

@ -128,12 +128,7 @@ public final class FamiliarManager {
}
if (currentPet != -1) {
int last = this.petDetails.get(currentPet).size() - 1;
PetDetails details;
if (last < 0) { //missing data in save due to historical bug (see GL !2077)
details = new PetDetails(0);
} else {
details = this.petDetails.get(currentPet).get(last);
}
PetDetails details = this.petDetails.get(currentPet).get(last);
Pets pets = Pets.forId(currentPet);
familiar = new Pet(player, details, currentPet, pets.getNpcId(currentPet));
} else if (familiarData.containsKey("familiar")) {
@ -419,9 +414,6 @@ public final class FamiliarManager {
* @param details The new pet details.
*/
public void addDetails(int itemId, PetDetails details) {
if (petDetails.get(itemId) == null) {
petDetails.put(itemId, new ArrayList<>());
}
petDetails.get(itemId).add(details);
}

View File

@ -129,8 +129,8 @@ public final class Pet extends Familiar {
if (pet.isKitten(itemId)) {
owner.incrementAttribute("/save:stats_manager:cats_raised");
}
owner.getFamiliarManager().addDetails(newItemId, details);
owner.getFamiliarManager().removeDetails(getItemId());
owner.getFamiliarManager().addDetails(newItemId, details);
owner.getFamiliarManager().morphPet(new Item(newItemId), false, location, details.getHunger(), 0);
owner.getPacketDispatch().sendMessage("<col=ff0000>Your pet has grown larger.</col>");
}

View File

@ -80,7 +80,7 @@ public final class PCLanderZone extends MapZone {
for (PestControlActivityPlugin a : activities) {
if (a.getWaitingPlayers().remove(e)) {
if (logout) {
e.setLocation(a.getLeaveLocation());
e.getProperties().setTeleportLocation(a.getLeaveLocation());
}
break;
}

View File

@ -109,9 +109,15 @@ class HaroldDialogueFile : DialogueFile() {
21 -> playerl(FacialExpression.ASKING, "What?").also { stage++ }
22 -> npcl(FacialExpression.FRIENDLY, "I really fancy one of those Blurberry Specials. I never get over to the Gnome Stronghold so I haven't had one for ages!").also { stage++ }
23 -> {
if (removeItem(player!!, Items.BLURBERRY_SPECIAL_2064) || removeItem(player!!, Items.PREMADE_BLURB_SP_2028)) {
if (removeItem(player!!, Items.BLURBERRY_SPECIAL_2064)) {
sendMessage(player!!, "You give Harold a Blurberry Special.")
sendItemDialogue(player!!, Items.BLURBERRY_SPECIAL_2064, "You give Harold a Blurberry Special.").also { stage++ }
} else if (removeItem(player!!, Items.BLURBERRY_SPECIAL_9520)) { // This should not be here since 9520 is used by the gnome restaurant minigame.
sendMessage(player!!, "You give Harold a Blurberry Special.")
sendItemDialogue(player!!, Items.BLURBERRY_SPECIAL_2064, "You give Harold a Blurberry Special.").also { stage++ }
} else if (removeItem(player!!, Items.PREMADE_BLURB_SP_2028)) {
sendMessage(player!!, "You give Harold a Blurberry Special.")
sendItemDialogue(player!!, Items.PREMADE_BLURB_SP_2028, "You give Harold a Blurberry Special.").also { stage++ }
} else {
player(FacialExpression.FRIENDLY, "I'll go and get you one.").also { stage = END_DIALOGUE }
}

View File

@ -10,14 +10,9 @@ import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
import core.game.node.item.Item
@Initializable
class AchiettiesDialogue(player: Player? = null) : DialoguePlugin(player) {
companion object {
const val BRIBE_PRICE = 1_000_000
}
class AchiettiesDialogue(player: Player? = null) : DialoguePlugin(player){
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, AchiettiesDialogueFile(), npc)
@ -37,238 +32,149 @@ class AchiettiesDialogueFile : DialogueBuilderFile() {
override fun create(b: DialogueBuilder) {
b.onQuestStages(Quests.HEROES_QUEST, 0, 1)
.branch { player ->
// Return the current quest stage.
getQuestStage(player, Quests.HEROES_QUEST)
}
.let { branch ->
branch.onValue(0)
.npcl(FacialExpression.FRIENDLY, "Greetings. Welcome to the Heroes' Guild.")
.npcl("Only the greatest heroes of this land may gain entrance to this guild.")
.options()
.let { optionBuilder ->
optionBuilder.option("I'm a hero, may I apply to join?")
.playerl("I'm a hero. May I apply to join?")
.branch { player ->
if (HeroesQuest.hasRequirements(player)) 1 else 0
b.onQuestStages(Quests.HEROES_QUEST, 0,1)
.branch { player ->
return@branch getQuestStage(player, Quests.HEROES_QUEST)
}.let{ branch ->
branch.onValue(0)
.npcl(FacialExpression.FRIENDLY, "Greetings. Welcome to the Heroes' Guild.")
.npcl("Only the greatest heroes of this land may gain entrance to this guild.")
// - If the player's skill levels are lower than the quest requirements. (I think this is after 2009)
// linel("Before starting this quest, be aware that one or more of your skill levels are lower than what is required to fully complete it.")
.options()
.let { optionBuilder ->
optionBuilder.option("I'm a hero, may I apply to join?")
.playerl("I'm a hero. May I apply to join?")
.branch { player ->
return@branch if (HeroesQuest.hasRequirements(player)) {
1
} else {
0
}
}.let { branch ->
branch.onValue(0)
.npcl("You're a hero? I've never heard of YOU. You are required to possess at least 55 quest points to file an application.")
.npcl("Additionally you must have completed the Shield of Arrav, Lost City, Merlin's Crystal and Dragon Slayer quests.")
.end()
return@let branch
}.onValue(1)
.betweenStage { df, player, _, _ ->
if(getQuestStage(player, Quests.HEROES_QUEST) == 0) {
setQuestStage(player, Quests.HEROES_QUEST, 1)
}
}
.npcl("Well you seem to meet our initial requirements, so you may now begin the tasks to earn membership in the Heroes' Guild.")
.npcl("The three items required for entrance are: An Entranan Firebird feather, a Master Thieves' armband, and a cooked Lava Eel.")
.options()
.let { optionBuilder2 ->
optionBuilder2.option_playerl("Any hints on getting the thieves armband?")
.npcl("I'm sure you have the relevant contacts to find out about that.")
.end()
optionBuilder2.option_playerl("Any hints on getting the feather?")
.npcl("Not really - other than Entranan firebirds tend to live on Entrana.")
.end()
optionBuilder2.option_playerl("Any hints on getting the eel?")
.npcl("Maybe go and find someone who knows a lot about fishing?")
.end()
optionBuilder2.option_playerl("I'll start looking for all those things then.")
.npcl("Good luck with that.")
.end()
}
optionBuilder.option_playerl("Good for the foremost heroes of the land.")
.npcl("Yes. Yes it is.")
.end()
}
.let { branch ->
branch.onValue(0)
.npcl("You're a hero? I've never heard of YOU. You are required to possess at least 55 quest points to file an application.")
.npcl("Additionally you must have completed the Shield of Arrav, Lost City, Merlin's Crystal and Dragon Slayer quests.")
.end()
branch
}
.onValue(1)
.betweenStage { df, player, _, _ ->
if (getQuestStage(player, Quests.HEROES_QUEST) == 0) {
setQuestStage(player, Quests.HEROES_QUEST, 1)
}
}
.npcl("Well you seem to meet our initial requirements, so you may now begin the tasks to earn membership in the Heroes' Guild.")
.npcl("The three items required for entrance are: An Entranan Firebird feather, a Master Thieves' armband, and a cooked Lava Eel.")
branch.onValue(1)
.npcl("Greetings. Welcome to the Heroes' Guild.")
.npcl("How goes thy quest adventurer?")
.playerl("It's tough. I've not done it yet.")
.npcl("Remember, the items you need to enter are:")
.npcl("An Entranan Firebirds' feather, A Master Thieves armband, and a cooked Lava Eel.")
.options()
.let { optionBuilder2 ->
optionBuilder2.option_playerl("Any hints on getting the thieves armband?")
.npcl("I'm sure you have the relevant contacts to find out about that.")
.end()
.npcl("I'm sure you have the relevant contacts to find out about that.")
.end()
optionBuilder2.option_playerl("Any hints on getting the feather?")
.npcl("Not really - other than Entranan firebirds tend to live on Entrana.")
.end()
.npcl("Not really - other than Entranan firebirds tend to live on Entrana.")
.end()
optionBuilder2.option_playerl("Any hints on getting the eel?")
.npcl("Maybe go and find someone who knows a lot about fishing?")
.end()
.npcl("Maybe go and find someone who knows a lot about fishing?")
.end()
optionBuilder2.option_playerl("I'll start looking for all those things then.")
.npcl("Good luck with that.")
.end()
optionBuilder2.option_playerl("Or perhaps the guild needs a bit of financing?")
.npcl("Perhaps a small 'Loan' of 1 million coins?")
// Bribery branch
.options()
.let { optionBuilder3 ->
optionBuilder3.option_playerl("That sounds good")
.branch { player ->
if (inInventory(player!!, 995, AchiettiesDialogue.BRIBE_PRICE)) 1 else 0
}
.let { branch ->
branch.onValue(1)
.playerl(FacialExpression.FRIENDLY, "Here you go!")
.endWith { _, player ->
removeItem(player, Item(995, AchiettiesDialogue.BRIBE_PRICE), Container.INVENTORY)
finishQuest(player, Quests.HEROES_QUEST)
}
branch.onValue(0)
.playerl(FacialExpression.HALF_GUILTY, "Actually, I don't have that much.")
.end()
}
optionBuilder3.option_playerl("1 million coins for this dump? No way")
.end()
}
.npcl("Good luck with that.")
.end()
}
optionBuilder.option_playerl("Good for the foremost heroes of the land.")
.npcl("Yes. Yes it is.")
.end()
}
branch.onValue(1)
.npcl("Greetings. Welcome to the Heroes' Guild.")
.npcl("How goes thy quest adventurer?")
.playerl("It's tough. I've not done it yet.")
.npcl("Remember, the items you need to enter are:")
.npcl("An Entranan Firebird's feather, A Master Thieves' armband, and a cooked Lava Eel.")
.options()
.let { optionBuilder2 ->
optionBuilder2.option_playerl("Any hints on getting the thieves armband?")
}
b.onQuestStages(Quests.HEROES_QUEST, 2, 3, 4)
.npcl("Greetings. Welcome to the Heroes' Guild.")
.npcl("How goes thy quest adventurer?")
.playerl("It's tough. I've not done it yet.")
.npcl("Remember, the items you need to enter are:")
.npcl("An Entranan Firebirds' feather, A Master Thieves armband, and a cooked Lava Eel.")
.options()
.let { optionBuilder2 ->
optionBuilder2.option_playerl("Any hints on getting the thieves armband?")
.npcl("I'm sure you have the relevant contacts to find out about that.")
.end()
optionBuilder2.option_playerl("Any hints on getting the feather?")
optionBuilder2.option_playerl("Any hints on getting the feather?")
.npcl("Not really - other than Entranan firebirds tend to live on Entrana.")
.end()
optionBuilder2.option_playerl("Any hints on getting the eel?")
optionBuilder2.option_playerl("Any hints on getting the eel?")
.npcl("Maybe go and find someone who knows a lot about fishing?")
.end()
optionBuilder2.option_playerl("I'll start looking for all those things then.")
optionBuilder2.option_playerl("I'll start looking for all those things then.")
.npcl("Good luck with that.")
.end()
optionBuilder2.option_playerl("Or perhaps the guild needs a bit of financing?")
.npcl("Perhaps a small 'Loan' of 1 million coins?")
// Bribery branch
}
b.onQuestStages(Quests.HEROES_QUEST, 6)
.npcl("Greetings. Welcome to the Heroes' Guild.")
.npcl("How goes thy quest adventurer?")
.branch { player ->
return@branch if (HeroesQuest.allItemsInInventory(player)) { 1 } else { 0 }
}.let { branch ->
branch.onValue(0)
.playerl("It's tough. I've not done it yet.")
.npcl("Remember, the items you need to enter are:")
.npcl("An Entranan Firebirds' feather, A Master Thieves armband, and a cooked Lava Eel.")
.options()
.let { optionBuilder3 ->
optionBuilder3.option_playerl("That sounds good")
.branch { player ->
if (inInventory(player!!, 995, AchiettiesDialogue.BRIBE_PRICE)) 1 else 0
}
.let { branch ->
branch.onValue(1)
.playerl(FacialExpression.FRIENDLY, "Here you go!")
.endWith { _, player ->
removeItem(player, Item(995, AchiettiesDialogue.BRIBE_PRICE), Container.INVENTORY)
finishQuest(player, Quests.HEROES_QUEST)
}
branch.onValue(0)
.playerl(FacialExpression.HALF_GUILTY, "Actually, I don't have that much.")
.end()
}
optionBuilder3.option_playerl("1 million coins for this dump? No way")
.end()
.let { optionBuilder2 ->
optionBuilder2.option_playerl("Any hints on getting the thieves armband?")
.npcl("I'm sure you have the relevant contacts to find out about that.")
.end()
optionBuilder2.option_playerl("Any hints on getting the feather?")
.npcl("Not really - other than Entranan firebirds tend to live on Entrana.")
.end()
optionBuilder2.option_playerl("Any hints on getting the eel?")
.npcl("Maybe go and find someone who knows a lot about fishing?")
.end()
optionBuilder2.option_playerl("I'll start looking for all those things then.")
.npcl("Good luck with that.")
.end()
}
}
}
b.onQuestStages(Quests.HEROES_QUEST, 2, 3, 4)
.npcl("Greetings. Welcome to the Heroes' Guild.")
.npcl("How goes thy quest adventurer?")
.playerl("It's tough. I've not done it yet.")
.npcl("Remember, the items you need to enter are:")
.npcl("An Entranan Firebird's feather, A Master Thieves' armband, and a cooked Lava Eel.")
.options()
.let { optionBuilder2 ->
optionBuilder2.option_playerl("Any hints on getting the thieves armband?")
.npcl("I'm sure you have the relevant contacts to find out about that.")
.end()
optionBuilder2.option_playerl("Any hints on getting the feather?")
.npcl("Not really - other than Entranan Firebirds tend to live on Entrana.")
.end()
optionBuilder2.option_playerl("Any hints on getting the eel?")
.npcl("Maybe go and find someone who knows a lot about fishing?")
.end()
optionBuilder2.option_playerl("I'll start looking for all those things then.")
.npcl("Good luck with that.")
.end()
optionBuilder2.option_playerl("Or perhaps the guild needs a bit of financing?")
.npcl("Perhaps a small 'Loan' of 1 million coins?")
// Bribery branch
.options()
.let { optionBuilder3 ->
optionBuilder3.option_playerl("That sounds good")
.branch { player ->
if (inInventory(player!!, 995, AchiettiesDialogue.BRIBE_PRICE)) 1 else 0
}
.let { branch ->
branch.onValue(1)
.playerl(FacialExpression.FRIENDLY, "Here you go!")
.endWith { _, player ->
removeItem(player, Item(995, AchiettiesDialogue.BRIBE_PRICE), Container.INVENTORY)
branch.onValue(1)
.playerl("I have all the required items.")
.npcl("I see that you have. Well done. Now, to complete the quest, and gain entry to the Heroes' Guild in your final task all that you have to do is...")
.playerl("W-what? What do you mean? There's MORE?")
.npcl("I'm sorry, I was just having a little fun with you. Just a little Heroes' Guild humour there. What I really meant was")
.npcl("Congratulations! You have completed the Heroes' Guild entry requirements! You will find the door now open for you! Enter, Hero! And take this reward!")
.endWith { _, player ->
if (HeroesQuest.allItemsInInventory(player)) {
removeItem(player, Items.FIRE_FEATHER_1583)
removeItem(player, Items.LAVA_EEL_2149)
removeItem(player, Items.THIEVES_ARMBAND_1579)
if (getQuestStage(player, Quests.HEROES_QUEST) == 6) {
finishQuest(player, Quests.HEROES_QUEST)
}
branch.onValue(0)
.playerl(FacialExpression.HALF_GUILTY, "Actually, I don't have that much.")
.end()
}
}
optionBuilder3.option_playerl("1 million coins for this dump? No way")
.end()
}
}
b.onQuestStages(Quests.HEROES_QUEST, 6)
.npcl("Greetings. Welcome to the Heroes' Guild.")
.npcl("How goes thy quest adventurer?")
.branch { player ->
if (HeroesQuest.allItemsInInventory(player)) 1 else 0
}
.let { branch ->
branch.onValue(0)
.playerl("It's tough. I've not done it yet.")
.npcl("Remember, the items you need to enter are:")
.npcl("An Entranan Firebird's feather, A Master Thieves' armband, and a cooked Lava Eel.")
.options()
.let { optionBuilder2 ->
optionBuilder2.option_playerl("Any hints on getting the thieves armband?")
.npcl("I'm sure you have the relevant contacts to find out about that.")
.end()
optionBuilder2.option_playerl("Any hints on getting the feather?")
.npcl("Not really - other than Entranan Firebirds tend to live on Entrana.")
.end()
optionBuilder2.option_playerl("Any hints on getting the eel?")
.npcl("Maybe go and find someone who knows a lot about fishing?")
.end()
optionBuilder2.option_playerl("I'll start looking for all those things then.")
.npcl("Good luck with that.")
.end()
optionBuilder2.option_playerl("Or perhaps the guild needs a bit of financing?")
.npcl("Perhaps a small 'Loan' of 1 million coins?")
// Bribery branch
.options()
.let { optionBuilder3 ->
optionBuilder3.option_playerl("That sounds good")
.branch { player ->
if (inInventory(player!!, 995, AchiettiesDialogue.BRIBE_PRICE)) 1 else 0
}
.let { branch ->
branch.onValue(1)
.playerl(FacialExpression.FRIENDLY, "Here you go!")
.endWith { _, player ->
removeItem(player, Item(995, AchiettiesDialogue.BRIBE_PRICE), Container.INVENTORY)
finishQuest(player, Quests.HEROES_QUEST)
}
branch.onValue(0)
.playerl(FacialExpression.HALF_GUILTY, "Actually, I don't have that much.")
.end()
}
optionBuilder3.option_playerl("1 million coins for this dump? No way")
.end()
}
}
branch.onValue(1)
.playerl("I have all the required items.")
.npcl("I see that you have. Well done. Now, to complete the quest, and gain entry to the Heroes' Guild in your final task all that you have to do is...")
.playerl("W-what? What do you mean? There's MORE?")
.npcl("I'm sorry, I was just having a little fun with you. Just a little Heroes' Guild humour there. What I really meant was")
.npcl("Congratulations! You have completed the Heroes' Guild entry requirements! You will find the door now open for you! Enter, Hero! And take this reward!")
.endWith { _, player ->
if (HeroesQuest.allItemsInInventory(player)) {
removeItem(player, Items.FIRE_FEATHER_1583)
removeItem(player, Items.LAVA_EEL_2149)
removeItem(player, Items.THIEVES_ARMBAND_1579)
if (getQuestStage(player, Quests.HEROES_QUEST) == 6) {
finishQuest(player, Quests.HEROES_QUEST)
}
}
}
}
}
b.onQuestStages(Quests.HEROES_QUEST, 100)
.npcl("Greetings. Welcome to the Heroes' Guild.")
.npcl("Greetings. Welcome to the Heroes' Guild.")
}
}

View File

@ -124,7 +124,6 @@ class CivilianDialogue(player: Player? = null) : DialoguePlugin(player) {
if (removeItem(player, cat)){
player.familiarManager.removeDetails(cat)
addItem(player, Items.DEATH_RUNE_560, 100)
player.incrementAttribute("/save:stats_manager:cats_sold");
break
}
}
@ -173,7 +172,6 @@ class CatTrade : InteractionListener{
// Remove the cat
player.familiarManager.removeDetails(used.id)
addItem(player, Items.DEATH_RUNE_560, 100)
player.incrementAttribute("/save:stats_manager:cats_sold");
openDialogue(player, dialogue, with as NPC)
}

View File

@ -4,7 +4,6 @@ import content.data.Quests
import core.api.*
import org.rs09.consts.Items
import core.game.dialogue.DialogueFile
import core.game.dialogue.FacialExpression
import core.tools.END_DIALOGUE
class CommanderMontaiDialogue : DialogueFile(){
@ -13,19 +12,19 @@ class CommanderMontaiDialogue : DialogueFile(){
if (questStage == 10) {
when(stage) {
0 -> playerl("Hello.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Hello traveller, are you here to help or just to watch?").also { stage++ }
1 -> npcl("Hello traveller, are you here to help or just to watch?").also { stage++ }
2 -> playerl("I've been sent by King Bolren to retrieve the orb of protection.").also { stage++ }
3 -> npcl(FacialExpression.OLD_NORMAL, "Excellent we need all the help we can get.").also { stage++ }
4 -> npcl(FacialExpression.OLD_NORMAL, "I'm Commander Montai. The orb is in the Khazard stronghold to the north, but until we weaken their defences we can't get close.").also { stage++ }
3 -> npcl("Excellent we need all the help we can get.").also { stage++ }
4 -> npcl("I'm Commander Montai. The orb is in the Khazard stronghold to the north, but until we weaken their defences we can't get close.").also { stage++ }
5 -> playerl("What can I do?").also { stage++ }
6 -> npcl(FacialExpression.OLD_NORMAL, "Firstly we need to strengthen our own defences. We desperately need wood to make more battlements, once the battlements are gone it's all over. Six loads of normal logs should do it.").also { stage++ }
6 -> npcl("Firstly we need to strengthen our own defences. We desperately need wood to make more battlements, once the battlements are gone it's all over. Six loads of normal logs should do it.").also { stage++ }
7 -> options("Ok, I'll gather some wood.", "Sorry, I no longer want to be involved.").also { stage++ }
8 -> when (buttonID) {
1 -> playerl("Ok, I'll gather some wood.").also { stage = 10 }
2 -> playerl("Sorry, I no longer want to be involved.").also { stage = 9 }
}
9 -> npcl(FacialExpression.OLD_NORMAL, "That's a shame, we could have done with your help.").also { stage = END_DIALOGUE }
10 -> npcl(FacialExpression.OLD_NORMAL, "Please be as quick as you can, I don't know how much longer we can hold out.").also {
9 -> npcl("That's a shame, we could have done with your help.").also { stage = END_DIALOGUE }
10 -> npcl("Please be as quick as you can, I don't know how much longer we can hold out.").also {
setQuestStage(player!!, Quests.TREE_GNOME_VILLAGE, 20)
stage = END_DIALOGUE
}
@ -34,43 +33,43 @@ class CommanderMontaiDialogue : DialogueFile(){
if(inInventory(player!!, Items.LOGS_1511,6)){
when(stage) {
0 -> playerl("Hello.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Hello again, we're still desperate for wood soldier.").also { stage++ }
1 -> npcl("Hello again, we're still desperate for wood soldier.").also { stage++ }
2 -> playerl("I have some here. (You give six loads of logs to the commander.)").also{ stage++ }
3 -> {
// Remove the 6 normal logs
for(i in 1..6) { removeItem(player!!,Items.LOGS_1511) }
setQuestStage(player!!, Quests.TREE_GNOME_VILLAGE, 25)
npcl(FacialExpression.OLD_NORMAL, "That's excellent, now we can make more defensive battlements. Give me a moment to organize the troops and then come speak to me. I'll inform you of our next phase of attack.")
npcl("That's excellent, now we can make more defensive battlements. Give me a moment to organize the troops and then come speak to me. I'll inform you of our next phase of attack.")
stage = END_DIALOGUE
}
}
} else {
when(stage) {
0 -> playerl("Hello.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Hello again, we're still desperate for wood soldier. We need six loads of normal logs.").also { stage++ }
1 -> npcl("Hello again, we're still desperate for wood soldier. We need six loads of normal logs.").also { stage++ }
2 -> playerl("I'll see what I can do.").also { stage++ }
3 -> npcl(FacialExpression.OLD_NORMAL, "Thank you.").also { stage = END_DIALOGUE }
3 -> npcl("Thank you.").also { stage = END_DIALOGUE }
}
}
} else if (questStage == 25) {
when(stage) {
0 -> playerl("How are you doing Montai?").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "We're hanging in there soldier. For the next phase of our attack we need to breach their stronghold.").also { stage++ }
2 -> npcl(FacialExpression.OLD_NORMAL, "The ballista can break through the stronghold wall, and then we can advance and seize back the orb.").also { stage++ }
1 -> npcl("We're hanging in there soldier. For the next phase of our attack we need to breach their stronghold.").also { stage++ }
2 -> npcl("The ballista can break through the stronghold wall, and then we can advance and seize back the orb.").also { stage++ }
3 -> playerl("So what's the problem?").also { stage++ }
4 -> npcl(FacialExpression.OLD_NORMAL, "From this distance we can't get an accurate enough shot. We need the correct coordinates of the stronghold for a direct hit. I've sent out three tracker gnomes to gather them.").also { stage++ }
4 -> npcl("From this distance we can't get an accurate enough shot. We need the correct coordinates of the stronghold for a direct hit. I've sent out three tracker gnomes to gather them.").also { stage++ }
5 -> playerl("Have they returned?").also { stage++ }
6 -> npcl(FacialExpression.OLD_NORMAL, "I'm afraid not, and we're running out of time. I need you to go into the heart of the battlefield, find the trackers, and bring back the coordinates.").also { stage++ }
7 -> npcl(FacialExpression.OLD_NORMAL, "Do you think you can do it?").also { stage++ }
6 -> npcl("I'm afraid not, and we're running out of time. I need you to go into the heart of the battlefield, find the trackers, and bring back the coordinates.").also { stage++ }
7 -> npcl("Do you think you can do it?").also { stage++ }
8 -> options("No, I've had enough of your battle.", "I'll try my best.").also { stage++ }
9 -> when(buttonID) {
1 -> playerl("No, I've had enough of your battle.").also { stage = 10 }
2 -> playerl("I'll try my best.").also { stage = 11 }
}
10 -> npcl(FacialExpression.OLD_NORMAL, "I understand, this isn't your fight.").also { stage = END_DIALOGUE }
11 -> npcl(FacialExpression.OLD_NORMAL, "Thank you, you're braver than most.").also { stage++ }
12 -> npcl(FacialExpression.OLD_NORMAL, "I don't know how long I will be able to hold out. Once you have the coordinates come back and fire the ballista right into those monsters.").also { stage++ }
13 -> npcl(FacialExpression.OLD_NORMAL, "If you can retrieve the orb and bring safety back to my people, none of the blood spilled on this field will be in vain.").also {
10 -> npcl("I understand, this isn't your fight.").also { stage = END_DIALOGUE }
11 -> npcl("Thank you, you're braver than most.").also { stage++ }
12 -> npcl("I don't know how long I will be able to hold out. Once you have the coordinates come back and fire the ballista right into those monsters.").also { stage++ }
13 -> npcl("If you can retrieve the orb and bring safety back to my people, none of the blood spilled on this field will be in vain.").also {
setQuestStage(player!!, Quests.TREE_GNOME_VILLAGE, 30)
stage = END_DIALOGUE
}
@ -78,29 +77,29 @@ class CommanderMontaiDialogue : DialogueFile(){
} else if (questStage == 30) {
when(stage) {
0 -> playerl("Hello.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Hello warrior. We need the coordinates for a direct hit from the ballista.").also { stage++ }
2 -> npcl(FacialExpression.OLD_NORMAL, "Once you have a direct hit you will be able to enter the stronghold and retrieve the orb.").also { stage = END_DIALOGUE }
1 -> npcl("Hello warrior. We need the coordinates for a direct hit from the ballista.").also { stage++ }
2 -> npcl("Once you have a direct hit you will be able to enter the stronghold and retrieve the orb.").also { stage = END_DIALOGUE }
}
} else if (questStage == 31) {
if(inInventory(player!!,Items.ORB_OF_PROTECTION_587)){
when(stage) {
0 -> playerl("I have the orb of protection.").also { stage++ }
1 -> npcl(FacialExpression.OLD_HAPPY, "Incredible, for a human you really are something.").also { stage++ }
1 -> npcl("Incredible, for a human you really are something.").also { stage++ }
2 -> playerl("Thanks... I think!").also { stage++ }
3 -> npcl(FacialExpression.OLD_NORMAL, "I'll stay here with my troops and try and hold Khazard's men back. You return the orb to the gnome village. Go as quick as you can, the village is still unprotected.").also { stage = END_DIALOGUE }
3 -> npcl("I'll stay here with my troops and try and hold Khazard's men back. You return the orb to the gnome village. Go as quick as you can, the village is still unprotected.").also { stage = END_DIALOGUE }
}
} else {
when(stage) {
0 -> playerl("I've breached the stronghold.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "I saw, that was a beautiful sight. The Khazard troops didn't know what hit them.").also { stage++ }
2 -> npcl(FacialExpression.OLD_NORMAL, "Now is the time to retrieve the orb. It's all in your hands. I'll be praying for you.").also { stage = END_DIALOGUE }
1 -> npcl("I saw, that was a beautiful sight. The Khazard troops didn't know what hit them.").also { stage++ }
2 -> npcl("Now is the time to retrieve the orb. It's all in your hands. I'll be praying for you.").also { stage = END_DIALOGUE }
}
}
} else if (questStage != 0){
when(stage) {
0 -> playerl("Hello Montai, how are you?").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "I'm ok, this battle is going to take longer to win than I expected. The Khazard troops won't give up even without the orb.").also { stage++ }
1 -> npcl("I'm ok, this battle is going to take longer to win than I expected. The Khazard troops won't give up even without the orb.").also { stage++ }
2 -> playerl("Hang in there.").also { stage = END_DIALOGUE }
}
}

View File

@ -11,7 +11,6 @@ import org.rs09.consts.Items
import core.game.dialogue.DialogueFile
import content.region.kandarin.quest.tree.TreeGnomeVillage.Companion.mazeEntrance
import content.region.kandarin.quest.tree.TreeGnomeVillage.Companion.mazeVillage
import core.game.dialogue.FacialExpression
import core.game.world.GameWorld.Pulser
import core.tools.END_DIALOGUE
@ -46,30 +45,30 @@ class ElkoyDialogue : DialogueFile(){
inInventory(player!!, Items.ORBS_OF_PROTECTION_588) && followLocation == "exit" -> {
when(stage) {
0 -> playerl("Hello Elkoy. I have the orb.").also { stage++ }
1 -> npcl(FacialExpression.OLD_HAPPY, "Take it to King Bolren, I'm sure he'll be pleased to see you.").also { stage++ }
1 -> npcl("Take it to King Bolren, I'm sure he'll be pleased to see you.").also { stage++ }
2 -> options("Alright, I'll do that.", "Can you guide me out of the maze now?").also { stage++ }
3 -> when(buttonID) {
1 -> playerl("Alright, I'll do that.").also { stage = END_DIALOGUE }
2 -> playerl("Can you guide me out of the maze now?").also { stage = 4 }
}
4 -> npcl(FacialExpression.OLD_NORMAL, "If you like, but please take the orb to King Bolren soon.").also { stage++ }
4 -> npcl("If you like, but please take the orb to King Bolren soon.").also { stage++ }
5 -> {
travelCutscene(player!!, mazeEntrance)
stage++
}
6 -> npcl(FacialExpression.OLD_NORMAL, "Here we are. Please don't lose the orb!").also { stage = END_DIALOGUE }
6 -> npcl("Here we are. Please don't lose the orb!").also { stage = END_DIALOGUE }
}
}
inInventory(player!!, Items.ORB_OF_PROTECTION_587) -> {
when(stage) {
0 -> playerl("Hello Elkoy.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "You're back! And the orb?").also { stage++ }
1 -> npcl("You're back! And the orb?").also { stage++ }
2 -> playerl("I have it here.").also { stage++ }
3 -> {
if(locY > 3161){
npcl(FacialExpression.OLD_NORMAL, "You're our saviour. Please return it to the village and we are all saved. Would you like me to show you the way to the village?").also { stage++ }
npcl("You're our saviour. Please return it to the village and we are all saved. Would you like me to show you the way to the village?").also { stage++ }
} else {
npcl(FacialExpression.OLD_NORMAL, "Take the orb to King Bolren, I'm sure he'll be pleased to see you.").also { stage = END_DIALOGUE }
npcl("Take the orb to King Bolren, I'm sure he'll be pleased to see you.").also { stage = END_DIALOGUE }
}
}
4 -> options("Yes please.", "No thanks Elkoy.").also { stage++ }
@ -77,24 +76,24 @@ class ElkoyDialogue : DialogueFile(){
1 -> playerl("Yes please.").also { stage = 7 }
2 -> playerl("No thanks Elkoy.").also { stage = 6 }
}
6 -> npcl(FacialExpression.OLD_NORMAL, "Ok then, take care.").also { stage = END_DIALOGUE }
6 -> npcl("Ok then, take care.").also { stage = END_DIALOGUE }
7 -> travelCutscene(player!!, mazeVillage).also { stage++ }
8 -> npcl(FacialExpression.OLD_NORMAL, "Here we are. Take the orb to King Bolren, I'm sure he'll be pleased to see you.").also { stage = END_DIALOGUE }
8 -> npcl("Here we are. Take the orb to King Bolren, I'm sure he'll be pleased to see you.").also { stage = END_DIALOGUE }
}
}
inInventory(player!!, Items.ORBS_OF_PROTECTION_588) || questStage == 100 -> {
when(stage) {
0 -> playerl("Hello Elkoy.").also { stage++ }
1 -> npcl(FacialExpression.OLD_HAPPY, "You truly are a hero.").also { stage++ }
1 -> npcl("You truly are a hero.").also { stage++ }
2 -> playerl("Thanks.").also { stage++ }
3 -> npcl(FacialExpression.OLD_NORMAL, "You saved us by defeating the warlord. I'm humbled and wish you well.").also { stage++ }
4 -> npcl(FacialExpression.OLD_NORMAL, "Would you like me to show you the way to the ${followLocation}?").also { stage++ }
3 -> npcl("You saved us by defeating the warlord. I'm humbled and wish you well.").also { stage++ }
4 -> npcl("Would you like me to show you the way to the ${followLocation}?").also { stage++ }
5 -> options("Yes please.", "No thanks Elkoy.").also { stage++ }
6 -> when(buttonID) {
1 -> playerl("Yes please.").also { stage = 8 }
2 -> playerl("No thanks Elkoy.").also { stage = 7 }
}
7 -> npcl(FacialExpression.OLD_NORMAL, "Ok then, take care.").also { stage = END_DIALOGUE }
7 -> npcl("Ok then, take care.").also { stage = END_DIALOGUE }
8 -> {
if(followLocation == "village") {
travelCutscene(player!!, mazeVillage)
@ -105,33 +104,33 @@ class ElkoyDialogue : DialogueFile(){
stage++
}
}
9 -> npcl(FacialExpression.OLD_NORMAL, "Here we are. Have a safe journey.").also { stage = END_DIALOGUE }
10 -> npcl(FacialExpression.OLD_NORMAL, "Here we are. Feel free to have a look around.").also { stage = END_DIALOGUE }
9 -> npcl("Here we are. Have a safe journey.").also { stage = END_DIALOGUE }
10 -> npcl("Here we are. Feel free to have a look around.").also { stage = END_DIALOGUE }
}
}
questStage == 0 -> {
when(stage) {
0 -> playerl("Hello there.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Hello, welcome to our maze. I'm Elkoy the tree gnome.").also { stage++ }
1 -> npcl("Hello, welcome to our maze. I'm Elkoy the tree gnome.").also { stage++ }
2 -> playerl("I haven't heard of your sort.").also { stage++ }
3 -> npcl(FacialExpression.OLD_SAD, "There's not many of us left. Once you could find tree gnomes anywhere in the world, now we hide in small groups to avoid capture.").also { stage++ }
3 -> npcl("There's not many of us left. Once you could find tree gnomes anywhere in the world, now we hide in small groups to avoid capture.").also { stage++ }
4 -> playerl("Capture from whom?").also { stage++ }
5 -> npcl(FacialExpression.OLD_NORMAL, "Tree gnomes have been hunted for so called 'fun' since as long as I can remember.").also { stage++ }
6 -> npcl(FacialExpression.OLD_NORMAL, "Our main threat nowadays are General Khazard's troops. They know no mercy, but are also very dense. They'll never find their way through our maze.").also { stage++ }
7 -> npcl(FacialExpression.OLD_NORMAL, "Have fun.").also { stage = END_DIALOGUE }
5 -> npcl("Tree gnomes have been hunted for so called 'fun' since as long as I can remember.").also { stage++ }
6 -> npcl("Our main threat nowadays are General Khazard's troops. They know no mercy, but are also very dense. They'll never find their way through our maze.").also { stage++ }
7 -> npcl("Have fun.").also { stage = END_DIALOGUE }
}
}
questStage in 1..39 -> {
when (stage) {
0 -> npcl(FacialExpression.OLD_DISTRESSED, "Oh my! The orb, they have the orb. We're doomed.").also { stage++ }
0 -> npcl("Oh my! The orb, they have the orb. We're doomed.").also { stage++ }
1 -> playerl("Perhaps I'll be able to get it back for you.").also { stage++ }
2 -> npcl(FacialExpression.OLD_NORMAL, "Would you like me to show you the way to the ${followLocation}?").also { stage++ }
2 -> npcl("Would you like me to show you the way to the ${followLocation}?").also { stage++ }
3 -> options("Yes please.", "No thanks Elkoy.").also { stage++ }
4 -> when (buttonID) {
1 -> playerl("Yes please.").also { stage = 6 }
2 -> playerl("No thanks Elkoy.").also { stage = 5 }
}
5 -> npcl(FacialExpression.OLD_NORMAL, "Ok then, take care.").also { stage = END_DIALOGUE }
5 -> npcl("Ok then, take care.").also { stage = END_DIALOGUE }
6 -> {
if(followLocation == "village")
travelCutscene(player!!, mazeVillage)
@ -139,20 +138,20 @@ class ElkoyDialogue : DialogueFile(){
travelCutscene(player!!, mazeEntrance)
stage++
}
7 -> npcl(FacialExpression.OLD_NORMAL, "Here we are. I hope you get the orb back soon.").also { stage = END_DIALOGUE }
7 -> npcl("Here we are. I hope you get the orb back soon.").also { stage = END_DIALOGUE }
}
}
questStage == 40 -> {
when(stage) {
0 -> playerl("Hello Elkoy.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Did you hear? Khazard's men have pillaged the village! They slaughtered many, and took the other orbs in an attempt to lead us out of the maze. When will the misery end?").also { stage++ }
2 -> npcl(FacialExpression.OLD_NORMAL, "Would you like me to show you the way to the ${followLocation}?").also { stage++ }
1 -> npcl("Did you hear? Khazard's men have pillaged the village! They slaughtered many, and took the other orbs in an attempt to lead us out of the maze. When will the misery end?").also { stage++ }
2 -> npcl("Would you like me to show you the way to the ${followLocation}?").also { stage++ }
3 -> options("Yes please.", "No thanks Elkoy.").also { stage++ }
4 -> when(buttonID) {
1 -> playerl("Yes please.").also { stage = 6 }
2 -> playerl("No thanks Elkoy.").also { stage = 5 }
}
5 -> npcl(FacialExpression.OLD_NORMAL, "Ok then, take care.").also { stage = END_DIALOGUE }
5 -> npcl("Ok then, take care.").also { stage = END_DIALOGUE }
6 -> {
if(followLocation == "village") {
travelCutscene(player!!, mazeVillage)
@ -162,8 +161,8 @@ class ElkoyDialogue : DialogueFile(){
stage++
}
}
7 -> npcl(FacialExpression.OLD_NORMAL, "Please try to get our orbs back for us, otherwise the village is doomed!").also { stage = END_DIALOGUE }
8 -> npcl(FacialExpression.OLD_NORMAL, "Here we are. Despite what has happened here, I hope you feel welcome.").also { stage = END_DIALOGUE }
7 -> npcl("Please try to get our orbs back for us, otherwise the village is doomed!").also { stage = END_DIALOGUE }
8 -> npcl("Here we are. Despite what has happened here, I hope you feel welcome.").also { stage = END_DIALOGUE }
}
}
}

View File

@ -10,7 +10,6 @@ import org.rs09.consts.Items
import org.rs09.consts.NPCs
import core.game.dialogue.DialogueFile
import content.region.kandarin.quest.tree.TreeGnomeVillage.Companion.mazeEntrance
import core.game.dialogue.FacialExpression
import core.game.world.GameWorld
import core.tools.END_DIALOGUE
@ -21,37 +20,37 @@ class KingBolrenDialogue : DialogueFile() {
questStage < 10 -> {
when (stage) {
0 -> playerl("Hello.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Well hello stranger. My name's Bolren, I'm the king of the tree gnomes.").also { stage++ }
2 -> npcl(FacialExpression.OLD_NORMAL, "I'm surprised you made it in, maybe I made the maze too easy.").also { stage++ }
1 -> npcl("Well hello stranger. My name's Bolren, I'm the king of the tree gnomes.").also { stage++ }
2 -> npcl("I'm surprised you made it in, maybe I made the maze too easy.").also { stage++ }
3 -> playerl("Maybe.").also { stage++ }
4 -> npcl(FacialExpression.OLD_NORMAL, "I'm afraid I have more serious concerns at the moment. Very serious.").also { stage++ }
4 -> npcl("I'm afraid I have more serious concerns at the moment. Very serious.").also { stage++ }
5 -> options("I'll leave you to it then.", "Can I help at all?").also { stage++ }
6 -> when (buttonID) {
1 -> playerl("I'll leave you to it then.").also { stage = 7 }
2 -> playerl("Can I help at all?").also { stage = 8 }
}
7 -> npcl(FacialExpression.OLD_NORMAL, "Ok, take care.").also { stage = END_DIALOGUE }
8 -> npcl(FacialExpression.OLD_NORMAL, "I'm glad you asked.").also { stage++ }
9 -> npcl(FacialExpression.OLD_SAD, "The truth is my people are in grave danger. We have always been protected by the Spirit Tree. No creature of dark can harm us while its three orbs are in place.").also { stage++ }
10 -> npcl(FacialExpression.OLD_SAD, "We are not a violent race, but we fight when we must. Many gnomes have fallen battling the dark forces of Khazard to the North.").also { stage++ }
11 -> npcl(FacialExpression.OLD_SAD, "We became desperate, so we took one orb of protection to the battlefield. It was a foolish move.").also { stage++ }
12 -> npcl(FacialExpression.OLD_NORMAL, "Khazard troops seized the orb. Now we are completely defenceless.").also { stage++ }
7 -> npcl("Ok, take care.").also { stage = END_DIALOGUE }
8 -> npcl("I'm glad you asked.").also { stage++ }
9 -> npcl("The truth is my people are in grave danger. We have always been protected by the Spirit Tree. No creature of dark can harm us while its three orbs are in place.").also { stage++ }
10 -> npcl("We are not a violent race, but we fight when we must. Many gnomes have fallen battling the dark forces of Khazard to the North.").also { stage++ }
11 -> npcl("We became desperate, so we took one orb of protection to the battlefield. It was a foolish move.").also { stage++ }
12 -> npcl("Khazard troops seized the orb. Now we are completely defenceless.").also { stage++ }
13 -> playerl("How can I help?").also { stage++ }
14 -> npcl(FacialExpression.OLD_NORMAL,"You would be a huge benefit on the battlefield. If you would go there and try to retrieve the orb, my people and I will be forever grateful.").also { stage++ }
14 -> npcl("You would be a huge benefit on the battlefield. If you would go there and try to retrieve the orb, my people and I will be forever grateful.").also { stage++ }
15 -> options("I would be glad to help.", "I'm sorry but I won't be involved.").also { stage++ }
16 -> when (buttonID) {
1 -> playerl("I would be glad to help.").also { stage = 18 }
2 -> playerl("I'm sorry but I won't be involved.").also { stage = 17 }
}
17 -> npcl(FacialExpression.OLD_NORMAL, "Ok then, travel safe.").also { stage = END_DIALOGUE }
18 -> npcl(FacialExpression.OLD_NORMAL, "Thank you. The battlefield is to the north of the maze. Commander Montai will inform you of their current situation.").also { stage++ }
19 -> npcl(FacialExpression.OLD_NORMAL, "That is if he's still alive.").also { stage++ }
20 -> npcl(FacialExpression.OLD_NORMAL, "My assistant shall guide you out. Good luck friend, try your best to return the orb.").also {
17 -> npcl("Ok then, travel safe.").also { stage = END_DIALOGUE }
18 -> npcl("Thank you. The battlefield is to the north of the maze. Commander Montai will inform you of their current situation.").also { stage++ }
19 -> npcl("That is if he's still alive.").also { stage++ }
20 -> npcl("My assistant shall guide you out. Good luck friend, try your best to return the orb.").also {
stage++
}
21 -> {
teleport(player!!, mazeEntrance)
sendNPCDialogue(player!!, NPCs.ELKOY_5179, "We're out of the maze now. Please hurry, we must have the orb if we are to survive.", FacialExpression.OLD_NORMAL)
sendNPCDialogue(player!!, NPCs.ELKOY_5179, "We're out of the maze now. Please hurry, we must have the orb if we are to survive.")
setQuestStage(player!!, Quests.TREE_GNOME_VILLAGE, 10)
stage = END_DIALOGUE
}
@ -60,7 +59,7 @@ class KingBolrenDialogue : DialogueFile() {
questStage < 31 -> {
when (stage) {
0 -> playerl("Hello Bolren.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Hello traveller, we must retrieve the orb. It's being held by Khazard troops north of here.").also { stage++ }
1 -> npcl("Hello traveller, we must retrieve the orb. It's being held by Khazard troops north of here.").also { stage++ }
2 -> playerl("Ok, I'll try my best.").also { stage = END_DIALOGUE }
}
}
@ -68,32 +67,32 @@ class KingBolrenDialogue : DialogueFile() {
if(inInventory(player!!,Items.ORB_OF_PROTECTION_587)){
when(stage) {
0 -> playerl("I have the orb.").also { stage++ }
1 -> npcl(FacialExpression.OLD_DISTRESSED, "Oh my... The misery, the horror!").also { stage++ }
1 -> npcl("Oh my... The misery, the horror!").also { stage++ }
2 -> playerl("King Bolren, are you OK?").also { stage++ }
3 -> npcl(FacialExpression.OLD_DISTRESSED, "Thank you traveller, but it's too late. We're all doomed.").also { stage++ }
3 -> npcl("Thank you traveller, but it's too late. We're all doomed.").also { stage++ }
4 -> playerl("What happened?").also { stage++ }
5 -> npcl(FacialExpression.OLD_DISTRESSED, "They came in the night. I don't know how many, but enough.").also { stage++ }
5 -> npcl("They came in the night. I don't know how many, but enough.").also { stage++ }
6 -> playerl("Who?").also { stage++ }
7 -> npcl(FacialExpression.OLD_DISTRESSED, "Khazard troops. They slaughtered anyone who got in their way. Women, children, my wife.").also { stage++ }
7 -> npcl("Khazard troops. They slaughtered anyone who got in their way. Women, children, my wife.").also { stage++ }
8 -> playerl("I'm sorry.").also { stage++ }
9 -> npcl(FacialExpression.OLD_BOWS_HEAD_SAD, "They took the other orbs, now we are defenceless.").also { stage++ }
9 -> npcl("They took the other orbs, now we are defenceless.").also { stage++ }
10 -> playerl("Where did they take them?").also { stage++ }
11 -> npcl(FacialExpression.OLD_NORMAL, "They headed north of the stronghold. A warlord carries the orbs.").also { stage++ }
11 -> npcl("They headed north of the stronghold. A warlord carries the orbs.").also { stage++ }
12 -> options("I will find the warlord and bring back the orbs.", "I'm sorry but I can't help.").also { stage++ }
13 -> when(buttonID) {
1 -> playerl("I will find the warlord and bring back the orbs.").also { stage = 15 }
2 -> playerl("I'm sorry but I can't help.").also { stage = 14 }
}
14 -> npcl(FacialExpression.OLD_NORMAL, "I understand, this isn't your battle.").also { stage = END_DIALOGUE }
15 -> npcl(FacialExpression.OLD_NORMAL, "You are brave, but this task will be tough even for you. I wish you the best of luck. Once again you are our only hope.").also { stage++ }
16 -> npcl(FacialExpression.OLD_NORMAL, "I will safeguard this orb and pray for your safe return. My assistant will guide you out.").also {
14 -> npcl("I understand, this isn't your battle.").also { stage = END_DIALOGUE }
15 -> npcl("You are brave, but this task will be tough even for you. I wish you the best of luck. Once again you are our only hope.").also { stage++ }
16 -> npcl("I will safeguard this orb and pray for your safe return. My assistant will guide you out.").also {
stage++
}
17 -> {
if(removeItem(player!!,Items.ORB_OF_PROTECTION_587)){
teleport(player!!,mazeEntrance)
setQuestStage(player!!, Quests.TREE_GNOME_VILLAGE, 40)
sendNPCDialogue(player!!, NPCs.ELKOY_5179, "Good luck friend.", FacialExpression.OLD_NORMAL)
sendNPCDialogue(player!!, NPCs.ELKOY_5179, "Good luck friend.")
}
stage = END_DIALOGUE
}
@ -101,9 +100,9 @@ class KingBolrenDialogue : DialogueFile() {
} else {
when(stage) {
0 -> playerl("Hello Bolren.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Do you have the orb?").also { stage++ }
1 -> npcl("Do you have the orb?").also { stage++ }
2 -> playerl("No, I'm afraid not.").also { stage++ }
3 -> npcl(FacialExpression.OLD_NORMAL, "Please, we must have the orb if we are to survive.").also { stage = END_DIALOGUE }
3 -> npcl("Please, we must have the orb if we are to survive.").also { stage = END_DIALOGUE }
}
}
}
@ -111,12 +110,12 @@ class KingBolrenDialogue : DialogueFile() {
if(inInventory(player!!,Items.ORBS_OF_PROTECTION_588)){
when(stage) {
0 -> playerl("Bolren, I have returned.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "You made it back! Do you have the orbs?").also { stage++ }
1 -> npcl("You made it back! Do you have the orbs?").also { stage++ }
2 -> playerl("I have them here.").also { stage++ }
3 -> npcl(FacialExpression.OLD_HAPPY, "Hooray, you're amazing. I didn't think it was possible but you've saved us.").also { stage++ }
4 -> npcl(FacialExpression.OLD_NORMAL, "Once the orbs are replaced we will be safe once more. We must begin the ceremony immediately.").also { stage++ }
3 -> npcl("Hooray, you're amazing. I didn't think it was possible but you've saved us.").also { stage++ }
4 -> npcl("Once the orbs are replaced we will be safe once more. We must begin the ceremony immediately.").also { stage++ }
5 -> playerl("What does the ceremony involve?").also { stage++ }
6 -> npcl(FacialExpression.OLD_NORMAL, "The spirit tree has looked over us for centuries. Now we must pay our respects.").also { stage++ }
6 -> npcl("The spirit tree has looked over us for centuries. Now we must pay our respects.").also { stage++ }
7 -> sendDialogue(player!!,"The gnomes begin to chant. Meanwhile, King Bolren holds the orbs of protection out in front of him.").also { stage++ }
8 -> {
// Orbs fly up, gnomes chant, spirit tree animates
@ -167,20 +166,20 @@ class KingBolrenDialogue : DialogueFile() {
} else {
when(stage) {
0 -> playerl("Bolren, I have returned.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "You made it back! Do you have the orbs?").also { stage++ }
1 -> npcl("You made it back! Do you have the orbs?").also { stage++ }
2 -> playerl("No, I'm afraid not.").also { stage++ }
3 -> npcl(FacialExpression.OLD_NORMAL, "Please, we must have the orb if we are to survive.").also { stage = END_DIALOGUE }
3 -> npcl("Please, we must have the orb if we are to survive.").also { stage = END_DIALOGUE }
}
}
}
questStage == 99 -> {
when(stage){
0 -> npcl(FacialExpression.OLD_NORMAL, "Now at last my people are safe once more. We can live in peace again.").also { stage++ }
0 -> npcl("Now at last my people are safe once more. We can live in peace again.").also { stage++ }
1 -> playerl("I'm pleased I could help.").also { stage++ }
2 -> npcl(FacialExpression.OLD_NORMAL, "You are modest brave traveller.").also { stage++ }
3 -> npcl(FacialExpression.OLD_NORMAL, "Please, for your efforts take this amulet. It's made from the same sacred stone as the orbs of protection. It will help keep you safe on your journeys.").also { stage++ }
2 -> npcl("You are modest brave traveller.").also { stage++ }
3 -> npcl("Please, for your efforts take this amulet. It's made from the same sacred stone as the orbs of protection. It will help keep you safe on your journeys.").also { stage++ }
4 -> playerl("Thank you King Bolren.").also { stage++ }
5 -> npcl(FacialExpression.OLD_NORMAL, "The tree has many other powers, some of which I cannot reveal. As a friend of the gnome people, I can now allow you to use the tree's magic to teleport to other trees grown from related seeds.").also {
5 -> npcl("The tree has many other powers, some of which I cannot reveal. As a friend of the gnome people, I can now allow you to use the tree's magic to teleport to other trees grown from related seeds.").also {
finishQuest(player!!, Quests.TREE_GNOME_VILLAGE)
stage = END_DIALOGUE
}
@ -189,9 +188,9 @@ class KingBolrenDialogue : DialogueFile() {
isQuestComplete(player!!, Quests.TREE_GNOME_VILLAGE) -> {
when(stage) {
0 -> playerl("Hello again Bolren.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Well hello, it's good to see you again.").also { stage = if (hasAnItem(player!!, Items.GNOME_AMULET_589).container != null) END_DIALOGUE else 2 }
1 -> npcl("Well hello, it's good to see you again.").also { stage = if (hasAnItem(player!!, Items.GNOME_AMULET_589).container != null) END_DIALOGUE else 2 }
2 -> playerl("I've lost my amulet.").also { stage++ }
3 -> npcl(FacialExpression.OLD_NORMAL, "Oh dear. Here, take another. We are truly indebted to you.").also {
3 -> npcl("Oh dear. Here, take another. We are truly indebted to you.").also {
addItemOrDrop(player!!, Items.GNOME_AMULET_589)
stage = END_DIALOGUE
}

View File

@ -1,18 +1,17 @@
package content.region.kandarin.quest.tree
import core.game.dialogue.DialogueFile
import core.game.dialogue.FacialExpression
import core.tools.END_DIALOGUE
class LieutenantSchepburDialogue : DialogueFile(){
override fun handle(componentID: Int, buttonID: Int) {
when(stage) {
0 -> npcl(FacialExpression.OLD_NORMAL, "Move into position lads! eh? Who are you and what do you want?").also { stage++ }
0 -> npcl("Move into position lads! eh? Who are you and what do you want?").also { stage++ }
1 -> playerl("Who are you then?").also { stage++ }
2 -> npcl(FacialExpression.OLD_NORMAL, "Lieutenant Schepbur, commanding officer of the new Armoured Tortoise Regiment.").also { stage++ }
2 -> npcl("Lieutenant Schepbur, commanding officer of the new Armoured Tortoise Regiment.").also { stage++ }
3 -> playerl("There's only two tortoises here, that's hardly a regiment.").also { stage++ }
4 -> npcl(FacialExpression.OLD_NORMAL, "This is just the beginning! Gnome breeders and trainers are already working to expand the number of units. Soon we'll have hundreds of these beauties, nay thousands! And they will not only carry mages and").also { stage++ }
5 -> npcl(FacialExpression.OLD_NORMAL, "archers but other fiendish weapons of destruction of gnome devising. An army of giant tortoises will march upon this battlefield and rain the fire of our wrath upon all our enemies! Nothing will be able to stop us!").also { stage++ }
4 -> npcl("This is just the beginning! Gnome breeders and trainers are already working to expand the number of units. Soon we'll have hundreds of these beauties, nay thousands! And they will not only carry mages and").also { stage++ }
5 -> npcl("archers but other fiendish weapons of destruction of gnome devising. An army of giant tortoises will march upon this battlefield and rain the fire of our wrath upon all our enemies! Nothing will be able to stop us!").also { stage++ }
6 -> playerl("Oooookayy...... I'll leave you to it then....").also { stage = END_DIALOGUE }
}
}

View File

@ -1,14 +1,13 @@
package content.region.kandarin.quest.tree
import core.game.dialogue.DialogueFile
import core.game.dialogue.FacialExpression
import core.tools.END_DIALOGUE
class LocalGnomeDialogue : DialogueFile() {
override fun handle(componentID: Int, buttonID: Int) {
when (stage) {
0 -> playerl("Hello little man.").also { stage++ }
1 -> npcl(FacialExpression.OLD_LAUGH1, "Little man stronger than big man. Hee hee, lardi dee, lardi da.").also { stage = END_DIALOGUE }
1 -> npcl("Little man stronger than big man. Hee hee, lardi dee, lardi da.").also { stage = END_DIALOGUE }
}
}
}

View File

@ -5,7 +5,6 @@ import core.api.inInventory
import core.api.getQuestStage
import org.rs09.consts.Items
import core.game.dialogue.DialogueFile
import core.game.dialogue.FacialExpression
import core.tools.END_DIALOGUE
class RemsaiDialogue : DialogueFile(){
@ -15,35 +14,35 @@ class RemsaiDialogue : DialogueFile(){
inInventory(player!!,Items.ORBS_OF_PROTECTION_588) -> {
when(stage) {
0 -> playerl("I've returned.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "You're back, well done brave adventurer. Now the orbs are safe we can perform the ritual for the spirit tree. We can live in peace once again.").also { stage = END_DIALOGUE }
1 -> npcl("You're back, well done brave adventurer. Now the orbs are safe we can perform the ritual for the spirit tree. We can live in peace once again.").also { stage = END_DIALOGUE }
}
}
inInventory(player!!, Items.ORB_OF_PROTECTION_587) -> {
when(stage) {
0 -> playerl("Hello Remsai.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Hello, did you find the orb?").also { stage++ }
1 -> npcl("Hello, did you find the orb?").also { stage++ }
2 -> playerl("I have it here.").also { stage++ }
3 -> npcl(FacialExpression.OLD_HAPPY, "You're our saviour.").also { stage = END_DIALOGUE }
3 -> npcl("You're our saviour.").also { stage = END_DIALOGUE }
}
}
questStage < 40 -> {
when(stage) {
0 -> playerl("Hello Remsai.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Hello, did you find the orb?").also { stage++ }
1 -> npcl("Hello, did you find the orb?").also { stage++ }
2 -> playerl("No, I'm afraid not.").also { stage++ }
3 -> npcl(FacialExpression.OLD_NORMAL, "Please, we must have the orb if we are to survive.").also { stage = END_DIALOGUE }
3 -> npcl("Please, we must have the orb if we are to survive.").also { stage = END_DIALOGUE }
}
}
questStage == 40 -> {
when(stage) {
0 -> playerl("Are you ok?").also { stage++ }
1 -> npcl(FacialExpression.OLD_DISTRESSED, "Khazard's men came. Without the orb we were defenceless. They killed many and then took our last hope, the other orbs. Now surely we're all doomed. Without them the spirit tree is useless.").also { stage = END_DIALOGUE }
1 -> npcl("Khazard's men came. Without the orb we were defenceless. They killed many and then took our last hope, the other orbs. Now surely we're all doomed. Without them the spirit tree is useless.").also { stage = END_DIALOGUE }
}
}
questStage > 40 -> {
when(stage) {
0 -> playerl("I've returned.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "You're back, well done brave adventurer. Now the orbs are safe we can perform the ritual for the spirit tree. We can live in peace once again.").also { stage = END_DIALOGUE }
1 -> npcl("You're back, well done brave adventurer. Now the orbs are safe we can perform the ritual for the spirit tree. We can live in peace once again.").also { stage = END_DIALOGUE }
}
}
}

View File

@ -4,7 +4,6 @@ import content.data.Quests
import core.api.*
import org.rs09.consts.Items
import core.game.dialogue.DialogueFile
import core.game.dialogue.FacialExpression
import core.tools.END_DIALOGUE
class TrackerGnomeOneDialogue : DialogueFile(){
@ -14,32 +13,32 @@ class TrackerGnomeOneDialogue : DialogueFile(){
questStage >= 40 -> {
when (stage) {
0 -> playerl("Hello").also { stage++ }
1 -> npcl(FacialExpression.OLD_BOWS_HEAD_SAD, "When will this battle end? I feel like I've been fighting forever.").also { stage = END_DIALOGUE }
1 -> npcl("When will this battle end? I feel like I've been fighting forever.").also { stage = END_DIALOGUE }
}
}
questStage > 30 -> {
if(inInventory(player!!, Items.ORB_OF_PROTECTION_587)){
when(stage) {
0 -> playerl("How are you tracker?").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Now we have the orb I'm much better. They won't stand a chance without it.").also { stage = END_DIALOGUE }
1 -> npcl("Now we have the orb I'm much better. They won't stand a chance without it.").also { stage = END_DIALOGUE }
}
} else {
when(stage) {
0 -> playerl("Hello again.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Well done, you've broken down their defences. This battle must be ours.").also { stage = END_DIALOGUE }
1 -> npcl("Well done, you've broken down their defences. This battle must be ours.").also { stage = END_DIALOGUE }
}
}
}
questStage == 30 -> {
when (stage) {
0 -> playerl("Do you know the coordinates of the Khazard stronghold?").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "I managed to get one, although it wasn't easy.").also { stage++ }
1 -> npcl("I managed to get one, although it wasn't easy.").also { stage++ }
2 -> sendDialogue(player!!, "The gnome tells you the height coordinate.").also {
setAttribute(player!!, "/save:treegnome:tracker1", true)
stage++
}
3 -> playerl("Well done.").also { stage++ }
4 -> npcl(FacialExpression.OLD_NORMAL, "The other two tracker gnomes should have the other coordinates if they're still alive.").also { stage++ }
4 -> npcl("The other two tracker gnomes should have the other coordinates if they're still alive.").also { stage++ }
5 -> playerl("OK, take care.").also { stage = END_DIALOGUE }
}
}

View File

@ -3,7 +3,6 @@ package content.region.kandarin.quest.tree
import content.data.Quests
import core.api.*
import core.game.dialogue.DialogueFile
import core.game.dialogue.FacialExpression
import core.tools.END_DIALOGUE
class TrackerGnomeThreeDialogue : DialogueFile(){
@ -20,31 +19,31 @@ class TrackerGnomeThreeDialogue : DialogueFile(){
questStage == 30 -> {
when(stage) {
0 -> playerl("Are you OK?").also { stage++ }
1 -> npcl(FacialExpression.OLD_LAUGH1, "OK? Who's OK? Not me! Hee hee!").also { stage++ }
1 -> npcl("OK? Who's OK? Not me! Hee hee!").also { stage++ }
2 -> playerl("What's wrong?").also { stage++ }
3 -> npcl(FacialExpression.OLD_LAUGH1, "You can't see me, no one can. Monsters, demons, they're all around me!").also { stage++ }
3 -> npcl("You can't see me, no one can. Monsters, demons, they're all around me!").also { stage++ }
4 -> playerl("What do you mean?").also { stage++ }
5 -> npcl(FacialExpression.OLD_LAUGH1, "They're dancing, all of them, hee hee.").also { stage++ }
5 -> npcl("They're dancing, all of them, hee hee.").also { stage++ }
6 -> sendDialogue(player!!,"He's clearly lost the plot.").also { stage++ }
7 -> playerl("Do you have the coordinate for the Khazard stronghold?").also { stage++ }
8 -> npcl(FacialExpression.OLD_NORMAL, "Who holds the stronghold?").also { stage++ }
8 -> npcl("Who holds the stronghold?").also { stage++ }
9 -> playerl("What?").also { stage++ }
10 -> {
// Generate the x coordinate answer
if(getAttribute(player!!,"treegnome:xcoord",0) == 0){
val answer = (1..4).random()
npcl(FacialExpression.OLD_NORMAL, xcoordMap[answer])
npcl(xcoordMap[answer])
setAttribute(player!!,"/save:treegnome:xcoord",answer)
} else {
npcl(FacialExpression.OLD_NORMAL, xcoordMap[getAttribute(player!!,"treegnome:xcoord",1)])
npcl(xcoordMap[getAttribute(player!!,"treegnome:xcoord",1)])
}
stage++
}
11 -> playerl("You're mad").also { stage++ }
12 -> npcl(FacialExpression.OLD_LAUGH1, "Dance with me, and Khazard's men are beat.").also { stage++ }
12 -> npcl("Dance with me, and Khazard's men are beat.").also { stage++ }
13 -> sendDialogue(player!!,"The toll of war has affected his mind.").also { stage++ }
14 -> playerl("I'll pray for you little man.").also { stage++ }
15 -> npcl(FacialExpression.OLD_LAUGH1, "All day we pray in the hay, hee hee.").also {
15 -> npcl("All day we pray in the hay, hee hee.").also {
setAttribute(player!!, "/save:treegnome:tracker3", true)
stage = END_DIALOGUE
}
@ -53,13 +52,13 @@ class TrackerGnomeThreeDialogue : DialogueFile(){
questStage == 31 -> {
when(stage) {
0 -> playerl("Hello again.").also { stage++ }
1 -> npcl(FacialExpression.OLD_BOWS_HEAD_SAD, "Don't talk to me, you can't see me. No one can, just the demons.").also { stage = END_DIALOGUE }
1 -> npcl("Don't talk to me, you can't see me. No one can, just the demons.").also { stage = END_DIALOGUE }
}
}
questStage > 31 -> {
when(stage) {
0 -> playerl("Hello").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "I feel dizzy, where am I? Oh dear, oh dear I need some rest.").also { stage++ }
1 -> npcl("I feel dizzy, where am I? Oh dear, oh dear I need some rest.").also { stage++ }
2 -> playerl("I think you do.").also { stage = END_DIALOGUE }
}
}

View File

@ -4,7 +4,6 @@ import content.data.Quests
import core.api.*
import org.rs09.consts.Items
import core.game.dialogue.DialogueFile
import core.game.dialogue.FacialExpression
import core.tools.END_DIALOGUE
class TrackerGnomeTwoDialogue : DialogueFile(){
@ -14,36 +13,36 @@ class TrackerGnomeTwoDialogue : DialogueFile(){
questStage == 30 -> {
when (stage) {
0 -> playerl("Are you OK?").also { stage++ }
1 -> npcl(FacialExpression.OLD_DISTRESSED, "They caught me spying on the stronghold. They beat and tortured me.").also { stage++ }
2 -> npcl(FacialExpression.OLD_LAUGH1, "But I didn't crack. I told them nothing. They can't break me!").also { stage++ }
1 -> npcl("They caught me spying on the stronghold. They beat and tortured me.").also { stage++ }
2 -> npcl("But I didn't crack. I told them nothing. They can't break me!").also { stage++ }
3 -> playerl("I'm sorry little man.").also { stage++ }
4 -> npcl(FacialExpression.OLD_LAUGH1, "Don't be. I have the position of the stronghold!").also { stage++ }
4 -> npcl("Don't be. I have the position of the stronghold!").also { stage++ }
5 -> sendDialogue(player!!, "The gnome tells you the y coordinate.").also {
setAttribute(player!!, "/save:treegnome:tracker2", true)
stage++
}
6 -> playerl("Well done.").also { stage++ }
7 -> npcl(FacialExpression.OLD_NORMAL, "Now leave before they find you and all is lost.").also { stage++ }
7 -> npcl("Now leave before they find you and all is lost.").also { stage++ }
8 -> playerl("Hang in there.").also { stage++ }
9 -> npcl(FacialExpression.OLD_NORMAL, "Go!").also { stage = END_DIALOGUE }
9 -> npcl("Go!").also { stage = END_DIALOGUE }
}
}
questStage >= 40 -> {
when(stage) {
0 -> playerl("Hello").also { stage++ }
1 -> npcl(FacialExpression.OLD_DISTRESSED, "When will this battle end? I feel like I've been locked up my whole life.").also { stage = END_DIALOGUE }
1 -> npcl("When will this battle end? I feel like I've been locked up my whole life.").also { stage = END_DIALOGUE }
}
}
questStage > 30 -> {
if(inInventory(player!!,Items.ORB_OF_PROTECTION_587)){
when(stage) {
0 -> playerl("How are you tracker?").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Now we have the orb I'm much better. Soon my comrades will come and free me.").also { stage = END_DIALOGUE }
1 -> npcl("Now we have the orb I'm much better. Soon my comrades will come and free me.").also { stage = END_DIALOGUE }
}
} else {
when(stage) {
0 -> playerl("Hello again.").also { stage++ }
1 -> npcl(FacialExpression.OLD_NORMAL, "Well done, you've broken down their defences. This battle must be ours.").also { stage = END_DIALOGUE }
1 -> npcl("Well done, you've broken down their defences. This battle must be ours.").also { stage = END_DIALOGUE }
}
}
}

View File

@ -1,22 +1,22 @@
package content.region.misc.tutisland.dialogue
import content.global.handlers.iface.RulesAndInfo
import content.region.misc.tutisland.handlers.*
import core.ServerConstants
import core.api.*
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.IronmanMode
import core.game.node.entity.player.link.TeleportManager
import core.game.node.item.Item
import core.game.world.GameWorld
import core.game.world.map.Location
import core.plugin.Initializable
import core.tools.END_DIALOGUE
import core.worker.ManagementEvents
import org.rs09.consts.Items
import org.rs09.consts.NPCs
import proto.management.JoinClanRequest
import core.ServerConstants
import content.global.handlers.iface.RulesAndInfo
import core.game.world.GameWorld
import core.tools.END_DIALOGUE
import core.worker.ManagementEvents
/**
* Handles the magic tutor's dialogue
@ -44,29 +44,20 @@ class TutorialMagicTutorDialogue(player: Player? = null) : core.game.dialogue.Di
Item(557, 4),
Item(559, 2)
)
private val STARTER_BANK = arrayOf(Item(995, 2500))
// Helper function to convert a numeric XP rate to a descriptive string.
private fun xpRateText(rate: Double): String {
return when(rate) {
1.0 -> "Normal (100%)"
2.5 -> "2.5x"
5.0 -> "5x"
10.0 -> "10x"
0.1 -> "Scale up to 10x at level 99"
0.2 -> "Scale up to 5x at level 99"
else -> "${rate}x"
}
}
private val STARTER_BANK = arrayOf(Item(995, 25))
override fun newInstance(player: Player?): core.game.dialogue.DialoguePlugin {
return TutorialMagicTutorDialogue(player)
}
override fun open(vararg args: Any?): Boolean {
npc = args[0] as NPC
when(getAttribute(player, "tutorial:stage", 0)) {
when(getAttribute(player, "tutorial:stage", 0))
{
67 -> playerl(core.game.dialogue.FacialExpression.FRIENDLY, "Hello.")
69 -> npcl(core.game.dialogue.FacialExpression.FRIENDLY, "Good. This is a list of your spells. Currently you can only cast one offensive spell called Wind Strike. Let's try it out on one of those chickens.")
70 -> if(!inInventory(player, Items.AIR_RUNE_556) && !inInventory(player, Items.MIND_RUNE_558)) {
70 -> if(!inInventory(player, Items.AIR_RUNE_556) && !inInventory(player, Items.MIND_RUNE_558))
{
player.dialogueInterpreter.sendDoubleItemMessage(Items.AIR_RUNE_556, Items.MIND_RUNE_558, "You receive some spare runes.")
addItem(player, Items.AIR_RUNE_556, 15)
addItem(player, Items.MIND_RUNE_558, 15)
@ -79,7 +70,8 @@ class TutorialMagicTutorDialogue(player: Player? = null) : core.game.dialogue.Di
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when(getAttribute(player, "tutorial:stage", 0)) {
when(getAttribute(player, "tutorial:stage", 0))
{
67 -> when(stage++){
0 -> npcl(core.game.dialogue.FacialExpression.FRIENDLY, "Good day, newcomer. My name is Terrova. I'm here to tell you about Magic. Let's start by opening your spell list.")
1 -> {
@ -100,45 +92,43 @@ class TutorialMagicTutorDialogue(player: Player? = null) : core.game.dialogue.Di
TutorialStage.load(player, 70)
}
}
71 -> when(stage) {
0 -> options(
"Set Ironman Mode (current: ${player.ironmanManager.mode.name})",
"Change XP Rate (current: ${xpRateText(player.skills.experienceMultiplier)})",
"I'm ready now."
).also { stage++ }
1 -> when(buttonId) {
1 -> options("None", "Standard", "Hardcore (Permadeath!)", "Ultimate", "Nevermind.").also { stage = 10 }
2 -> options("Flat XP Rate Multiplier", "Scaled XP Rate Multiplier", "Back").also { stage = 21 }
71 -> when(stage){
0 -> options("Set Ironman Mode (current: ${player.ironmanManager.mode.name})", "Change XP Rate (current: ${player.skills.experienceMultiplier}x)", "I'm ready now.").also { stage++ }
1 -> when(buttonId){
1 -> options("None","Standard","Ultimate","Nevermind.").also { stage = 10 }
2 -> options("1.0x","2.5x","5.0x").also { stage = 20 }
3 -> npcl(core.game.dialogue.FacialExpression.FRIENDLY, "Well, you're all finished here now. I'll give you a reasonable number of starting items when you leave.").also { stage = 30 }
}
// Modified submenu branch for XP rate options
21 -> when(buttonId) {
1 -> options("1.0x", "2.5x", "5.0x", "10x").also { stage = 22 }
2 -> options("1.0x", "Scale to 10x", "Scale to 5x").also { stage = 23 }
3 -> options(
"Set Ironman Mode (current: ${player.ironmanManager.mode.name})",
"Change XP Rate (current: ${xpRateText(player.skills.experienceMultiplier)})",
"I'm ready now."
).also { stage = 1 }
else -> return false
}
10 -> {
stage = 0
if(buttonId < 5) {
val mode = IronmanMode.values()[buttonId - 1]
if(buttonId < 5)
{
val mode = when (buttonId - 1)
{
0 -> IronmanMode.NONE
1 -> IronmanMode.STANDARD
2 -> IronmanMode.ULTIMATE
else -> IronmanMode.NONE
}
if (mode != IronmanMode.NONE) stage = 11
player.dialogueInterpreter.sendDialogue("You set your ironman mode to: ${mode.name}.")
player.ironmanManager.mode = mode
if (player.skills.experienceMultiplier == 10.0 && mode != IronmanMode.HARDCORE)
player.skills.experienceMultiplier = 5.0
} else {
if (player.skills.experienceMultiplier == 10.0) player.skills.experienceMultiplier = 5.0
}
else
{
handle(interfaceId, 0)
}
}
22 -> {
val rates = arrayOf(1.0, 2.5, 5.0, 10.0)
11 -> player.dialogueInterpreter.sendPlainMessage(false, *splitLines("WARNING: You have selected an ironman mode. This is an uncompromising mode that WILL completely restrict your ability to trade. This MAY leave you unable to complete certain content, including quests.")).also { stage = 0 }
20 -> {
val rates = arrayOf(1.0,2.5,5.0)
val rate = rates[buttonId - 1]
if(rate == 10.0 && player.ironmanManager.mode != IronmanMode.HARDCORE) {
player.dialogueInterpreter.sendDialogue("10.0x is only available to Hardcore Ironmen!")
if(rate == 10.0) {
player.dialogueInterpreter.sendDialogue("10.0x is no longer available!")
player.skills.experienceMultiplier = 5.0
stage = 0
return true
}
@ -146,24 +136,14 @@ class TutorialMagicTutorDialogue(player: Player? = null) : core.game.dialogue.Di
player.skills.experienceMultiplier = rate
stage = 0
}
23 -> {
val rates = arrayOf(1.0, 0.1, 0.2)
val rate = rates[buttonId - 1]
if(rate == 0.1) {
player.dialogueInterpreter.sendDialogue("You set your XP rate to scale to be 10x at level 99.")
} else if (rate == 0.2) {
player.dialogueInterpreter.sendDialogue("You set your XP rate to scale to be 5x at level 99.")
} else {
player.dialogueInterpreter.sendDialogue("You set your XP rate to: ${rate}x.")
}
player.skills.experienceMultiplier = rate
stage = 0
}
30 -> player.dialogueInterpreter.sendOptions("Leave Tutorial Island?", "Yes, I'm ready.", "No, not yet.").also { stage++ }
31 -> when(buttonId) {
31 -> when(buttonId)
{
1 -> playerl(core.game.dialogue.FacialExpression.FRIENDLY, "I'm ready to go now, thank you.").also { stage = 40 }
2 -> playerl(core.game.dialogue.FacialExpression.FRIENDLY, "I'm not quite ready to go yet, thank you.").also { stage = END_DIALOGUE }
}
40 -> {
setAttribute(player, "/save:tutorial:complete", true)
setVarbit(player, 3756, 0)
@ -179,13 +159,14 @@ class TutorialMagicTutorDialogue(player: Player? = null) : core.game.dialogue.Di
player.inventory.add(*STARTER_PACK)
player.bank.add(*STARTER_BANK)
if(player.ironmanManager.mode == IronmanMode.HARDCORE) {
setAttribute(player, "/save:permadeath", true)
} else if(player.skills.experienceMultiplier == 10.0) {
if(player.skills.experienceMultiplier == 10.0)
{
player.skills.experienceMultiplier = 5.0
}
// Overwrites the stuck dialogue after teleporting to Lumbridge
//This overwrites the stuck dialogue after teleporting to Lumbridge for some reason
//Dialogue from 2007 or thereabouts
//Original is five lines, but if the same is done here it will break. Need to find another way of showing all this information.
interpreter.sendDialogue(
"Welcome to Lumbridge! To get more help, simply click on the",
"Lumbridge Guide or one of the Tutors - these can be found by looking",
@ -213,6 +194,7 @@ class TutorialMagicTutorDialogue(player: Player? = null) : core.game.dialogue.Di
ManagementEvents.publish(clanJoin.build())
}
}
12 -> {
player.setAttribute("close_c_", true)
end()
@ -225,4 +207,5 @@ class TutorialMagicTutorDialogue(player: Player? = null) : core.game.dialogue.Di
override fun getIds(): IntArray {
return intArrayOf(NPCs.MAGIC_INSTRUCTOR_946)
}
}

View File

@ -41,7 +41,7 @@ class KingRoaldDialogue(player: Player? = null) : DialoguePlugin(player) {
addOption("Priest in Peril", KingRoaldPIPDialogue(player.questRepository.getStage(Quests.PRIEST_IN_PERIL)))
}
if (!player.questRepository.getQuest(Quests.SHIELD_OF_ARRAV).isCompleted(player)) {
if (player.questRepository.getQuest(Quests.SHIELD_OF_ARRAV).isStarted(player) && !player.questRepository.getQuest(Quests.SHIELD_OF_ARRAV).isCompleted(player)) {
addOption("Shield of Arrav", KingRoaldArravDialogue())
}

View File

@ -6,20 +6,12 @@ import core.game.dialogue.DialogueFile
import core.tools.END_DIALOGUE
import core.tools.START_DIALOGUE
import content.data.Quests
import core.game.dialogue.FacialExpression
import core.api.Container
import core.api.inInventory
import core.api.removeItem
import core.game.dialogue.DialoguePlugin
private val CERTIFICATE = Item(769)
class KingRoaldArravDialogue() : DialogueFile() {
companion object {
const val BRIBE_PRICE = 6000
}
override fun handle(componentID: Int, buttonID: Int) {
if (player!!.inventory.containsItem(ShieldofArrav.PHOENIX_SHIELD) || player!!.inventory.containsItem(ShieldofArrav.BLACKARM_SHIELD)) {
@ -62,29 +54,7 @@ class KingRoaldArravDialogue() : DialogueFile() {
}
else {
when (stage) {
START_DIALOGUE -> player("I would like to contribute to one of", "your Political Action Committees").also{ stage++ }
1 -> npcl("Which one?").also { stage++ }
2 -> playerl("The Citizens Who Can't Be Bothered To Do Shield of Arrav").also { stage++ }
3 -> npcl(FacialExpression.HALF_THINKING, "I see... that will be 6,000 coins").also { stage++ }
4 -> options("Here you go!", "Nevermind.").also { stage++ }
5 -> when (buttonID) {
1 -> {
if (inInventory(player!!, 995, BRIBE_PRICE))
playerl(FacialExpression.FRIENDLY, "Here you go!").also { stage = 20 }
else
playerl(FacialExpression.HALF_GUILTY, "Actually, I don't have that much.").also { stage = END_DIALOGUE }
}
2 -> playerl(FacialExpression.FRIENDLY, "On second thought, never mind.").also { stage = END_DIALOGUE }
}
20 -> {
npcl("Thank you so much, dear donor. The government of Varrock now has higher priorities than the Shield of Arrav.")
if (removeItem(player!!, Item(995, BRIBE_PRICE), Container.INVENTORY)) {
player!!.questRepository.getQuest(Quests.SHIELD_OF_ARRAV).finish(player)
}
stage = END_DIALOGUE
}
}
abandonFile()
}
}
}

View File

@ -18,7 +18,7 @@ class ServerConstants {
var NOAUTH_DEFAULT_ADMIN: Boolean = true
@JvmField
var CURRENT_SAVEFILE_VERSION = 4
var CURRENT_SAVEFILE_VERSION = 3
@JvmField
var DAILY_ACCOUNT_LIMIT = 3

View File

@ -130,8 +130,8 @@ public final class BankContainer extends Container {
});
player.getInterfaceManager().openSingleTab(new Component(763));
super.refresh();
player.getInventory().refresh();
player.getInventory().getListeners().add(listener);
player.getInventory().refresh();
setVarp(player, 1249, lastAmountX);
int settings = new IfaceSettingsBuilder().enableOptions(new IntRange(0, 5)).enableExamine().enableSlotSwitch().build();
player.getPacketDispatch().sendIfaceSettings(settings, 0, 763, 0, 27);

View File

@ -81,22 +81,6 @@ class SaveVersionHooks : LoginListener {
}
}
if (player.version < 4) { //GL !2065
replaceAllItems(player, Items.BLURBERRY_SPECIAL_9520, Items.BLURBERRY_SPECIAL_2064)
replaceAllItems(player, Items.BLURBERRY_SPECIAL_9521, Items.BLURBERRY_SPECIAL_2065)
replaceAllItems(player, Items.LAMP_6796, Items.LAMP_2528)
replaceAllItems(player, Items.RUNE_SHIELDH1_10667, Items.RUNE_SHIELDH1_7336)
replaceAllItems(player, Items.RUNE_SHIELDH2_10670, Items.RUNE_SHIELDH2_7342)
replaceAllItems(player, Items.RUNE_SHIELDH3_10673, Items.RUNE_SHIELDH3_7348)
replaceAllItems(player, Items.RUNE_SHIELDH4_10676, Items.RUNE_SHIELDH4_7354)
replaceAllItems(player, Items.RUNE_SHIELDH5_10679, Items.RUNE_SHIELDH5_7360)
replaceAllItems(player, Items.ADAMANT_SHIELDH1_10666, Items.ADAMANT_SHIELDH1_7334)
replaceAllItems(player, Items.ADAMANT_SHIELDH2_10669, Items.ADAMANT_SHIELDH2_7340)
replaceAllItems(player, Items.ADAMANT_SHIELDH3_10672, Items.ADAMANT_SHIELDH3_7346)
replaceAllItems(player, Items.ADAMANT_SHIELDH4_10675, Items.ADAMANT_SHIELDH4_7352)
replaceAllItems(player, Items.ADAMANT_SHIELDH5_10678, Items.ADAMANT_SHIELDH5_7358)
}
// Finish up
player.version = ServerConstants.CURRENT_SAVEFILE_VERSION
}

View File

@ -41,7 +41,7 @@ public final class Skills {
/**
* Represents the constant modifier of experience.
*/
public double experienceMultiplier = 0.1; // Note in EmoScape this sets the default to be the scaling to 10x at 99
public double experienceMultiplier = 5.0;
/**
* The maximum experience multiplier.
@ -287,30 +287,9 @@ public final class Skills {
* @return The experience mod.
*/
private double getExperienceMod(int slot, double experience, boolean playerMod, boolean multiplyer) {
// Emo has hijacked this method to enable the scaling of the exp multiplier
//Keywords for people ctrl + Fing the project
//xprate xp rate xp multiplier skilling rate
if (experienceMultiplier == 0.1) { // exp multiplier placeholder for 10x at 100
double mult = (1 + ((this.experience[slot] * 9) / 13034431)); // 13034431 is the exp for 99, meaning this formula hits 10x at 99
if (mult < 1.0) {
return 1.0;
} else if (mult > 10.0) {
return 10.0;
} else {
return mult;
}
} else if (experienceMultiplier == 0.2) { // exp multiplier placeholder for 5x at 100
double mult = (1 + ((this.experience[slot] * 4) / 13034431)); // 13034431 is the exp for 99, meaning this formula hits 5x at 99
if (mult < 1.0) {
return 1.0;
} else if (mult > 5.0) {
return 5.0;
} else {
return mult;
}
} else {
return experienceMultiplier;
}
return experienceMultiplier;
/*if (!(entity instanceof Player)) {
return 1.0;
}

View File

@ -9,7 +9,6 @@ const val STATS_ROCKS = "rocks_mined"
const val STATS_RC = "essence_crafted"
const val STATS_FOOD_COOKED = "food_cooked"
const val STATS_CATS_RAISED = "cats_raised"
const val STATS_CATS_SOLD = "cats_sold"
const val STATS_PK_KILLS = "player_kills"
const val STATS_PK_DEATHS = "player_deaths"
const val STATS_ALKHARID_GATE = "alkharid_gate"

View File

@ -62,7 +62,7 @@ class StatsCommandSet : CommandSet(Privilege.STANDARD) {
72 -> sendLine(player,"Quest Points: ${queryPlayer.questRepository.points}",i)
73 -> sendLine(player,"Ironman Mode: ${queryPlayer.ironmanManager.mode.name.lowercase(Locale.getDefault())}",i)
74 -> sendLine(player,"Deaths: ${queryPlayer.getAttribute("$STATS_BASE:$STATS_DEATHS",0)}",i)
75 -> sendLine(player, "Cats Sold: ${queryPlayer.getAttribute("$STATS_BASE:$STATS_CATS_SOLD", 0)}", i)
75 -> sendLine(player, SPACER,i)
76 -> sendLine(player,"Logs Chopped: ${queryPlayer.getAttribute("$STATS_BASE:$STATS_LOGS",0)}",i)
77 -> sendLine(player,"Rocks Mined: ${queryPlayer.getAttribute("$STATS_BASE:$STATS_ROCKS",0)}",i)
78 -> sendLine(player,"Fish Caught: ${queryPlayer.getAttribute("$STATS_BASE:$STATS_FISH",0)}",i)

View File

@ -11,25 +11,25 @@ secret_key = "2009scape_development"
write_logs = true
msip = "127.0.0.1"
#preload the map (Increases memory usage by 2GB but makes game ticks smoother)
preload_map = true
preload_map = false
#--------Note: If both of the below are false, no database is required to run the server.--------------
#true = login requires password to be correct, passwords are hashed before stored. false = login does not care about the correctness of a password.
use_auth = true #NOTE: THIS MUST BE SET TO TRUE IN PRODUCTION!
use_auth = false #NOTE: THIS MUST BE SET TO TRUE IN PRODUCTION!
#true - account data (credits, playtime, etc) is persisted, false - account data is purely temporary
#NOTE: this does not affect actual save data, like stats, inventory, etc.
persist_accounts = true #NOTE: THIS MUST BE SET TO TRUE IN PRODUCTION!
noauth_default_admin = false #NOTE: If we are not using auth, this determines whether or not players are admins by default.
persist_accounts = false #NOTE: THIS MUST BE SET TO TRUE IN PRODUCTION!
noauth_default_admin = true #NOTE: If we are not using auth, this determines whether or not players are admins by default.
#------------------------------------------------------------------------------------------------------
#The limit on how many different accounts a player can log into per day.
daily_accounts_per_ip = 3
watchdog_enabled = true
connectivity_check_url = "https://google.com,https://emoscape.org"
connectivity_check_url = "https://google.com,https://2009scape.org"
connectivity_timeout = 500
[database]
database_name = "global"
database_username = "scape"
database_password = "TestPass"
database_username = "root"
database_password = ""
database_address = "127.0.0.1"
database_port = "3306"
@ -44,11 +44,11 @@ grafana_log_ttl_days = 7
[world]
name = "EmoScape"
name = "2009Scape"
#name used for announcements of bots selling items on the GE
name_ge = "EmoScape"
debug = false
dev = false
name_ge = "2009Scape"
debug = true
dev = true
start_gui = false
daily_restart = false
#world number
@ -56,7 +56,7 @@ world_id = "1"
country_id = "0"
members = true
#activity as displayed on the world list
activity = "EmoScape Classic."
activity = "2009Scape Classic."
pvp = false
default_xp_rate = 5.0
allow_slayer_reroll = false