Compare commits

..

8 Commits

Author SHA1 Message Date
Dark98 f98de298c8 Properly Update Client Title Logo
If The Cache Has Already Been Downloaded You Will Need To Delete It & Let The Client ReDownload It
2021-11-01 01:17:52 +00:00
Dark98 2629186cc0 Only Print Loaded Plugins When Debug Enabled 2021-10-31 02:48:29 +00:00
Dark98 156d864bfd Update NPC Plugins Layout To Put Click Actions Per NPC Plugin 2021-10-31 02:42:38 +00:00
Dark98 7a2a6d362b Revert "Update Client Title Logo"
woops this broke the cache
This reverts commit 97f1eb72e4.
2021-10-31 02:18:19 +00:00
Dark98 546669ead0 Add Plugins/Kotlin Support To Maven 2021-10-31 02:03:21 +00:00
Danial 669573c660 Make file server optional if cache already downloaded (#514) 2021-10-31 01:53:47 +00:00
Danial 1fe76d739e Couple of fixups (#513)
* Show preference state

* Fixup multiple of the same item on the ground.

* Fixup combat

* Fixup yell, decrease delay

* Tidy up yell

* use jdk8
2021-10-31 01:53:31 +00:00
Qweqker 6deaa4162a Astraeus Dialogue System Port (#512)
* - Marked As Deprecated
- Reorganized DialogueOptions.java so that option buttons are grouped with each interface
- Added temporary Dialogue Executor to make new Dialogue System function
- Remove Man, Woman, and Banker Dialogue and Dialogue Options

* - Refactored Dialogue.java into DialoguePacket.java
- Moved DialoguePacket.java into impl packets package
- Added Astraeus dialogue executor

* - Removed useless file
- Reorganized the Misc.java file

* - Ported Astraeus Dialogue System
- Rewrote Man, Woman, and Banker Dialogues
- Added line splitter in AstraeusDialogueFactory.java

* - Renamed Astraeus* classes to *Plugin
- Fixed an issue where the Dialogue Option buttons were not executed through the Kotlin file
2021-10-31 01:53:15 +00:00
109 changed files with 3324 additions and 9864 deletions
-3
View File
@@ -12,6 +12,3 @@
2006Scape Client/bin/
*.prefs
*.classpath
# Ignore any json files in the server root (should only be config files, the sample file should still be updated)
2006Scape Server/*.json
@@ -6,8 +6,8 @@ import java.math.BigInteger;
*/
public class ClientSettings {
public static String SNOW_MONTH = ".12";
public static String SNOW_MONTH = ".12";
/**
* The Servers Name
*/
@@ -18,24 +18,12 @@ public class ClientSettings {
public final static String SERVER_WEBSITE = "www.2006Scape.org";
/**
* The Servers Ip
*
* You don't have to change this, the client will automatically connect to the server
* on localhost (Assuming you're running Client and LocalGame respectively)
*
*/
public static String SERVER_IP = "server.2006Scape.org";
/**
* The Servers World
* This Determines The Port The Server Will Connect On
* World 1 Will Connect On Port 43594
* World 2 Will Connect On Port 43598
*/
public static int SERVER_WORLD = 1;
/**
* Enables/Disables FileServer CRC Checking For Cache Updates
* FileServer Must Be Running Before Starting The Client If This Is True
*/
public static boolean CHECK_CRC = true;
public static String SERVER_IP = "www.2006Scape.org";
/**
* The Npc Bits for the Server
*/
+20 -31
View File
@@ -25,7 +25,6 @@ import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Calendar;
import java.util.Date;
import java.util.zip.CRC32;
/**
* NOTICE: IF YOU CHANGE ANYTHING IN GAME.JAVA, PLEASE COPY-PASTE THE WHOLE CLASS OVER TO LOCALGAME.JAVA
@@ -3430,12 +3429,11 @@ public class Game extends RSApplet {
}
} catch (Exception _ex) {
}
if(abyte0 != null && ClientSettings.CHECK_CRC) {
aCRC32_930.reset();
aCRC32_930.update(abyte0);
int i1 = (int)aCRC32_930.getValue();
if(i1 != j)
abyte0 = null;
if (abyte0 != null) {
// aCRC32_930.reset();
// aCRC32_930.update(abyte0);
// int i1 = (int)aCRC32_930.getValue();
// if(i1 != j)
}
if (abyte0 != null) {
StreamLoader streamLoader = new StreamLoader(abyte0);
@@ -3482,20 +3480,12 @@ public class Game extends RSApplet {
} catch (Exception _ex) {
decompressors[0] = null;
}
if(abyte0 != null && ClientSettings.CHECK_CRC)
{
aCRC32_930.reset();
aCRC32_930.update(abyte0);
int i3 = (int)aCRC32_930.getValue();
if(i3 != j)
{
abyte0 = null;
j1++;
s2 = "Checksum error: " + i3;
}
}
/*
* if(abyte0 != null) { aCRC32_930.reset();
* aCRC32_930.update(abyte0); int i3 =
* (int)aCRC32_930.getValue(); if(i3 != j) { abyte0 = null;
* j1++; s2 = "Checksum error: " + i3; } }
*/
} catch (IOException ioexception) {
if (s2.equals("Unknown error")) {
s2 = "Connection error";
@@ -5031,12 +5021,12 @@ public class Game extends RSApplet {
if (inputString.equals("::gfxtgl") || inputString.equals("::tglgfx") || inputString.equals("::togglerender") || inputString.equals("::togglegfx")) {
graphicsEnabled = !graphicsEnabled;
}
if (myPrivilege >= 2) {
if (inputString.equals("::noclip"))
for (int k1 = 0; k1 < 4; k1++)
for (int i2 = 1; i2 < 103; i2++)
for (int k2 = 1; k2 < 103; k2++)
aClass11Array1230[k1].anIntArrayArray294[i2][k2] = 0;
if (myPrivilege >= 0) {
if(inputString.equals("::noclip"))
for(int k1 = 0; k1 < 4; k1++)
for(int i2 = 1; i2 < 103; i2++)
for(int k2 = 1; k2 < 103; k2++)
aClass11Array1230[k1].anIntArrayArray294[i2][k2] = 0;
if (inputString.equals("::clientdrop")) {
dropClient();
}
@@ -5070,7 +5060,6 @@ public class Game extends RSApplet {
onDemandFetcher.method563((byte) 1, 2, j1);
}
}
}
if (inputString.startsWith("::dd")) {
String[] args = inputString.split(" ");
int distance = 25;
@@ -5089,6 +5078,7 @@ public class Game extends RSApplet {
if (inputString.equals("::dataon")) {
showInfo = !showInfo;
}
}
if (inputString.startsWith("::")) {
stream.createFrame(103);
stream.writeWordBigEndian(inputString.length() - 1);
@@ -5937,7 +5927,7 @@ public class Game extends RSApplet {
loginMessage2 = "Connecting to server...";
drawLoginScreen(true);
}
socketStream = new RSSocket(this, openSocket((ClientSettings.SERVER_WORLD == 1) ? 43594 : 43596 + ClientSettings.SERVER_WORLD + portOff));
socketStream = new RSSocket(this, openSocket(43594 + portOff));
long l = TextClass.longForName(s);
int i = (int) (l >> 16 & 31L);
stream.currentOffset = 0;
@@ -12056,9 +12046,8 @@ public class Game extends RSApplet {
bigX = new int[4000];
bigY = new int[4000];
anInt1289 = -1;
aCRC32_930 = new CRC32();
}
public CRC32 aCRC32_930;
public static String server;
public int ignoreCount;
public long aLong824;
+3 -16
View File
@@ -8,25 +8,16 @@ public final class Main {
DEAR DEVELOPER!
If you want to run the client locally, the easiest way to do that is run the class "Client.java" instead!
If you REALLY want to use this class, add program arguments "-s localhost".
But seriously, Client.java is just a copy-paste of this class and does it locally. Use that instead!
*/
public static void main(String[] args) {
try {
// Process server/ip address to connect to
for (int i = 0; i < args.length; i++) {
switch(args[i]) {
case "-dev" :
case "-local":
case "-offline":
ClientSettings.SERVER_IP = "localhost";
ClientSettings.CHECK_CRC = false;
break;
case "-no-crc":
case "-no-cache-crc":
ClientSettings.CHECK_CRC = false;
break;
}
if (args[i].startsWith("-") && (i + 1) < args.length && !args[i + 1].startsWith("-")) {
switch(args[i]) {
case "-s":
@@ -54,10 +45,6 @@ public final class Main {
case "-password":
game.myPassword = args[++i];
break;
case "-w":
case "-world":
ClientSettings.SERVER_WORLD = Integer.parseInt(args[++i]);
break;
}
}
}
+2 -1
View File
@@ -4,11 +4,12 @@
import java.awt.*;
@SuppressWarnings("serial")
final class RSFrame extends Frame {
public RSFrame(RSApplet RSApplet_, int i, int j) {
rsApplet = RSApplet_;
setTitle(ClientSettings.SERVER_NAME + " World: " + ClientSettings.SERVER_WORLD);
setTitle(ClientSettings.SERVER_NAME);
setResizable(false);
setMinimumSize(new Dimension(i + 8, j + 28));
setVisible(true);
-23
View File
@@ -1,23 +0,0 @@
{
"server_name": "2006Scape",
"website_link": "https://2006Scape.org",
"server_debug": false,
"file_server": true,
"world_id": 1,
"xp_rate": 1.0,
"variable_xp_rate": false,
"variable_xp_rates": [1, 2, 5, 10],
"members_only": false,
"tutorial_island_enabled": false,
"party_room_enabled": true,
"clues_enabled": true,
"admin_can_trade": false,
"admin_can_sell": false,
"respawn_x": 3222,
"respawn_y": 3218,
"save_timer": 120,
"timeout": 60,
"item_requirements": true,
"max_players": 200,
"website_integration": false
}
+1
View File
@@ -0,0 +1 @@
{"token":""}
@@ -0,0 +1,41 @@
package plugin.buttons
import com.rs2.event.SubscribesTo
import com.rs2.event.impl.ButtonActionEvent
import com.rs2.game.dialogues.DialoguePlugin
import com.rs2.game.players.Player
import plugin.buttons.ButtonClick
@SubscribesTo(ButtonActionEvent::class)
class DialogueOptionButtons : ButtonClick() {
override fun execute(player: Player, event: ButtonActionEvent) {
when (event.button) {
// First Option (Option Interfaces 2, 3, 4, and 5)
9157, 9167, 9178, 9190 ->
player.dialogueFactory.executeOption(0, player.optionDialogue)
// Second Option (Option Interfaces 2, 3, 4, and 5)
9158, 9168, 9179, 9191 ->
player.dialogueFactory.executeOption(1, player.optionDialogue)
// Third Option (Option Interfaces 3, 4, and 5)
9169, 9180, 9192 ->
player.dialogueFactory.executeOption(2, player.optionDialogue)
// Fourth Option (Option Interfaces 4 and 5)
9181, 9193 ->
player.dialogueFactory.executeOption(3, player.optionDialogue)
// Fifth Option (Option Interface 5)
9194 ->
player.dialogueFactory.executeOption(4, player.optionDialogue)
}
}
override fun test(event: ButtonActionEvent): Boolean {
return DialoguePlugin.isDialogueButton(event.button)
}
}
@@ -0,0 +1,37 @@
package plugin.npc.banker
import com.rs2.game.dialogues.DialoguePlugin
import com.rs2.game.dialogues.DialogueFactoryPlugin
import com.rs2.game.dialogues.ExpressionPlugin
/**
* The Dialogue Class for Gnome and Human Banker NPCs
* Does NOT include dialogue for Ghost Bankers
* @author Qweqker
*/
class BankerDialogue : DialoguePlugin() {
override fun sendDialogues(factory: DialogueFactoryPlugin) {
factory
.sendNPCChat(ExpressionPlugin.HAPPY, "Good day. How may I help you?")
.sendOption("I'd like to access my bank account, please.", {
factory
.onAction {
factory.player.packetSender.openUpBank()
}
}, "I'd like to check my PIN settings.", {
factory
.onAction {
factory.player.bankPin.bankPinSettings()
}
}, "What is this place?") {
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT,"What is this place?")
.sendNPCChat(ExpressionPlugin.DEFAULT,"This is the bank of <servername>. We have many branches in many towns.")
.sendPlayerChat(ExpressionPlugin.DEFAULT,"And what do you do?")
.sendNPCChat(ExpressionPlugin.DEFAULT,"We will look after your items and money for you. Leave your valuables with us if you want to keep them safe.")
}
.execute()
}
}
@@ -0,0 +1,32 @@
package plugin.npc.banker
import com.rs2.event.EventContext
import com.rs2.event.EventSubscriber
import com.rs2.event.SubscribesTo
import com.rs2.event.impl.NpcFirstClickEvent
import com.rs2.game.content.skills.SkillHandler
import com.rs2.game.players.Player
import com.rs2.util.Misc
import plugin.npc.banker.BankerDialogue
import plugin.npc.manwoman.ManWomanDialogue
@SubscribesTo(NpcFirstClickEvent::class)
class FirstClick : EventSubscriber<NpcFirstClickEvent> {
override fun subscribe(context: EventContext, player: Player, event: NpcFirstClickEvent) {
if (player.playerRights >= 3) {
player.packetSender.sendMessage("[click= npc], [type = first], [id= ${event.npc}], [Type= ${event.npc}]")
}
when(event.npc) {
// Banker (NOT INCLUDING GHOST BANKER IN PORT PHASMATYS)
166, 494, 495, 496, 497, 498, 499, 953, 1036, 1360, 2163, 2164, 2354, 2355, 2568, 2569, 2570 -> {
if (!SkillHandler.isSkilling(player)) {
player.dialogueFactory.sendDialogue(BankerDialogue())
}
}
}
}
}
@@ -1,17 +0,0 @@
package plugin.npc.fadli
import com.rs2.event.EventContext
import com.rs2.event.EventSubscriber
import com.rs2.event.SubscribesTo
import com.rs2.event.impl.NpcSecondClickEvent
import com.rs2.game.players.Player
@SubscribesTo(NpcSecondClickEvent::class)
class SecondClick : EventSubscriber<NpcSecondClickEvent> {
override fun subscribe(context: EventContext, player: Player, event: NpcSecondClickEvent) {
if (event.npc == 958) {
player.packetSender.openUpBank()
}
}
}
@@ -1,35 +1,28 @@
package plugin.click.npc
package plugin.npc.manwoman
import com.rs2.GameConstants
import com.rs2.event.EventContext
import com.rs2.event.EventSubscriber
import com.rs2.event.SubscribesTo
import com.rs2.event.impl.NpcFirstClickEvent
import com.rs2.game.npcs.Npc
import com.rs2.game.content.skills.SkillHandler
import com.rs2.game.players.Player
import com.rs2.util.Misc
import plugin.npc.banker.BankerDialogue
import plugin.npc.manwoman.ManWomanDialogue
@SubscribesTo(NpcFirstClickEvent::class)
class NpcFirstClick : EventSubscriber<NpcFirstClickEvent> {
class FirstClick : EventSubscriber<NpcFirstClickEvent> {
override fun subscribe(context: EventContext, player: Player, event: NpcFirstClickEvent) {
if (player.playerRights >= 3) {
player.packetSender.sendMessage("[click= npc], [type = first], [id= ${event.npc}], [Type= ${event.npc}]");
player.packetSender.sendMessage("[click= npc], [type = first], [id= ${event.npc}], [Type= ${event.npc}]")
}
when(event.npc) {
1,2,3,4,5,6 -> if (Misc.random(10) <= 5) {
player.dialogueHandler.sendDialogues(3869, player.npcType)
} else {
player.dialogueHandler.sendDialogues(3872, player.npcType)
}
//else ->
// Man or Woman
1,2,3,4,5,6 -> player.dialogueFactory.sendDialogue(ManWomanDialogue(Misc.random(22)))
}
}
}
@@ -0,0 +1,163 @@
package plugin.npc.manwoman
import com.rs2.game.dialogues.DialoguePlugin
import com.rs2.game.dialogues.DialogueFactoryPlugin
import com.rs2.game.dialogues.ExpressionPlugin
/**
* The Dialogue Class for Man and Woman NPCs
* @author Qweqker
*/
class ManWomanDialogue(private val randomDialogue: Int) : DialoguePlugin() {
override fun sendDialogues(factory: DialogueFactoryPlugin) {
// Since Man and Woman NPCs provide a random dialogue every interaction, use a switch statement
// There are 23 dialogues, but a random number is rolled between 0 and 22 in the FirstClick.kt file
// as part of the calling process
when(randomDialogue) {
0 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Not too bad, but I'm a little worried about the increase of goblins these days.")
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Don't worry, I'll kill them.")
.execute()
1 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "How can I help you?")
.sendOption("Do you want to trade? ", {
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT,"Do you want to trade?")
.sendNPCChat(ExpressionPlugin.DEFAULT,"No, I have nothing I wish to get rid of. If you want to do some trading, there are plenty of shops and market stalls around though.")
}, "I'm in search of a quest.", {
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT,"I'm in search of a quest.")
.sendNPCChat(ExpressionPlugin.DEFAULT,"I'm sorry I can't help you there.")
}, "I'm in search of enemies to kill.") {
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "I'm in search of enemies to kill.")
.sendNPCChat(ExpressionPlugin.DEFAULT,"I've heard there are many fearsome creatures that dwell under the ground...")
}
.execute()
2 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.ANNOYED, "Get out of my way, I'm in a hurry!")
.execute()
3 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.HAPPY, "I'm fine, how are you?")
.sendPlayerChat(ExpressionPlugin.HAPPY, "Very well thank you.")
.execute()
4 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.HAPPY, "Hello there! Nice weather we've been having.")
.execute()
5 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.HAPPY, "I'm very well thank you.")
.execute()
6 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Who are you?")
.sendPlayerChat(ExpressionPlugin.DEFAULT, "I'm a bold adventurer.")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Ah, a very noble profession.")
.execute()
7 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.ANNOYED, "Do I know you? I'm in a hurry!")
.execute()
8 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "I think we need a new king. The one we've got isn't very good.")
.execute()
9 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Not too bad thanks.")
.execute()
10 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Are you asking for a fight?")
/* TODO: Have NPC Attack Player
.onAction {
}*/
.execute()
11 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "I'm busy right now.")
.execute()
12 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Hello.")
.execute()
13 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "None of your business.")
.execute()
14 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendPlayerChat(ExpressionPlugin.DEFAULT,"Do you wish to trade?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "No, I have nothing I wish to get rid of. If you want to do some trading, there are plenty of shops and market stalls around though.")
.execute()
15 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendPlayerChat(ExpressionPlugin.DEFAULT,"I'm in search of a quest.")
.sendNPCChat(ExpressionPlugin.DEFAULT, "I'm sorry I can't help you there.")
.execute()
16 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendPlayerChat(ExpressionPlugin.DEFAULT,"I'm in search of enemies to kill.")
.sendNPCChat(ExpressionPlugin.DEFAULT, "I've heard there are many fearsome creatures that dwell under the ground...")
.execute()
17 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.ANNOYED, "No I don't have any spare change.")
.execute()
18 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DISTRESSED, "I'm a little worried - I've heard there's lots of people going about, killing citizens at random.")
.execute()
19 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DISTRESSED, "No, I don't want to buy anything!")
.execute()
20 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "That is classified information.")
.execute()
21 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Have this flyer...")
.onAction {
factory.player.itemAssistant.addOrDropItem(956, 1)
}
.execute()
22 ->
factory
.sendPlayerChat(ExpressionPlugin.DEFAULT, "Hello, how's it going?")
.sendNPCChat(ExpressionPlugin.DEFAULT, "Yo, wassup!")
.execute()
}
}
}
+5 -11
View File
@@ -10,8 +10,8 @@
<packaging>jar</packaging>
<properties>
<kotlin.version>1.6.10</kotlin.version>
<kotlin.compiler.incremental>true</kotlin.compiler.incremental>
<kotlin.version>1.5.31</kotlin.version>
<kotlin.compiler.incremental>true</kotlin.compiler.incremental>
</properties>
<repositories>
@@ -128,19 +128,19 @@
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.19</version>
<version>1.4.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javacord/javacord-api -->
<dependency>
<groupId>org.javacord</groupId>
<artifactId>javacord-api</artifactId>
<version>3.3.2</version>
<version>3.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javacord/javacord-core -->
<dependency>
<groupId>org.javacord</groupId>
<artifactId>javacord-core</artifactId>
<version>3.3.2</version>
<version>3.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
@@ -160,12 +160,6 @@
<artifactId>google-collections</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>3.6.6.Final</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
@@ -1,110 +0,0 @@
package com.rs2;
import com.rs2.integrations.PlayersOnlineWebsite;
import com.rs2.integrations.RegisteredAccsWebsite;
import com.rs2.integrations.discord.JavaCord;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.*;
import java.util.stream.Collectors;
public class ConfigLoader {
public static void loadSettings(String config) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(config));
String out = br.lines().collect(Collectors.joining("\n"));
JSONObject obj = new JSONObject(out);
if(obj.has("server_name"))
GameConstants.SERVER_NAME = obj.getString("server_name");
if(obj.has("server_test_version"))
GameConstants.TEST_VERSION = obj.getDouble("server_test_version");
if(obj.has("website_link"))
GameConstants.WEBSITE_LINK = obj.getString("website_link");
if(obj.has("debug"))
GameConstants.SERVER_DEBUG = obj.getBoolean("debug");
if(obj.has("file_server"))
GameConstants.FILE_SERVER = obj.getBoolean("file_server");
if(obj.has("world_id"))
GameConstants.WORLD = obj.getInt("world_id");
if(obj.has("members_only"))
GameConstants.MEMBERS_ONLY = obj.getBoolean("members_only");
if(obj.has("tutorial_island_enabled"))
GameConstants.TUTORIAL_ISLAND = obj.getBoolean("tutorial_island_enabled");
if(obj.has("party_room_enabled"))
GameConstants.PARTY_ROOM_DISABLED = !obj.getBoolean("party_room_enabled");
if(obj.has("clues_enabled"))
GameConstants.CLUES_ENABLED = obj.getBoolean("clues_enabled");
if(obj.has("admin_can_trade"))
GameConstants.ADMIN_CAN_TRADE = obj.getBoolean("admin_can_trade");
if(obj.has("admin_can_drop_items"))
GameConstants.ADMIN_DROP_ITEMS = obj.getBoolean("admin_can_drop_items");
if(obj.has("admin_can_sell"))
GameConstants.ADMIN_CAN_SELL_ITEMS = obj.getBoolean("admin_can_sell");
if(obj.has("respawn_x"))
GameConstants.RESPAWN_X = obj.getInt("respawn_x");
if(obj.has("respawn_y"))
GameConstants.RESPAWN_Y = obj.getInt("respawn_y");
if(obj.has("save_timer"))
GameConstants.SAVE_TIMER = obj.getInt("save_timer");
if(obj.has("timeout"))
GameConstants.TIMEOUT = obj.getInt("timeout");
if(obj.has("item_requirements"))
GameConstants.ITEM_REQUIREMENTS = obj.getBoolean("item_requirements");
if(obj.has("variable_xp_rate"))
GameConstants.VARIABLE_XP_RATE = obj.getBoolean("variable_xp_rate");
if(obj.has("xp_rate"))
GameConstants.XP_RATE = obj.getDouble("xp_rate");
if(obj.has("max_players"))
GameConstants.MAX_PLAYERS = obj.getInt("max_players");
if (obj.has("variable_xp_rates")) {
JSONArray rates = obj.optJSONArray("variable_xp_rates");
for (int i = 0; i < rates.length(); ++i) {
GameConstants.VARIABLE_XP_RATES[i] = rates.optInt(i);
}
}
if(obj.has("website_integration"))
GameConstants.WEBSITE_INTEGRATION = obj.getBoolean("website_integration");
}
private static void initialize() {
JSONObject main = new JSONObject();
main
.put("bot-token", "")
.put("websitepass", "")
.put("erssecret", "");
try {
BufferedWriter br = new BufferedWriter(new FileWriter("data/secrets.json"));
br.write(main.toString());
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void loadSecrets() throws IOException {
if (!new File("data/secrets.json").exists()) {
initialize();
System.out.println("Please open \"data/secrets.json\" file and enter your discord token bot there!");
System.out.println("Please open \"data/secrets.json\" file and enter your Website Password there!");
} else {
BufferedReader br = new BufferedReader(new FileReader("data/secrets.json"));
String out = br.lines().collect(Collectors.joining("\n"));
JSONObject obj = new JSONObject(out);
/*
* Sets External Services Vars
*/
if(obj.has("bot-token"))
JavaCord.token = obj.getString("bot-token");
if(obj.has("websitepass"))
PlayersOnlineWebsite.password = obj.getString("websitepass");
RegisteredAccsWebsite.password = obj.getString("websitepass");
if(obj.has("erssecret"))
GameEngine.ersSecret = obj.getString("erssecret");
}
}
}
@@ -2,58 +2,43 @@ package com.rs2;
public class GameConstants {
/**
* The Variables Below Can Be Also Changed On Server Startup By Using The ConfigLoader
*
* SERVER_NAME Sets The Name The Server Will Use
* WEBSITE_LINK Defines The Server Website Links
* WORLD Sets The Servers World ID
* MAX_PLAYERS Sets The Maximum Amount Of Players Allow To Be Logged In At Once
* TIMEOUT Sets The Amount Of Time Before A Player Timeouts From A Bad Connection
* SAVE_TIMER Sets In Seconds How Often The Server Shouls Auto-Save All Characters
* RESPAWN_X Sets The X Coordinate That You Will Respawn At After Death
* RESPAWN_Y Sets The Y Coordinate That You Will Respawn At After Death
* FILE_SERVER Sets Whether The FileServer Should Run With The Server
* SERVER_DEBUG Sets Whether The Server Should Start In Debug Mode
* MEMBERS_ONLY Sets Whether The World Is Members Only
* TUTORIAL_ISLAND Enables/Disables Tutorial Island For Players On First Login
* PARTY_ROOM_DISABLED Enables/Disables The Party Room Should Be Disabled
* CLUES_ENABLED Enables/Disables Clue Scrolls
* ITEM_REQUIREMENTS Enables/Disables Item Requirements for All Players
* ADMIN_CAN_TRADE Defines Whether Admins Can Trade
* ADMIN_DROP_ITEMS Defines Whether Admins Can Drop Items
* ADMIN_CAN_SELL_ITEMS Defines Whether Admins Can Sell Items
* VARIABLE_XP_RATE Allows Players To Choose An XP Rate Set In VARIABLE_XP_RATES
* VARIABLE_XP_RATES Defines The XP Rates That Should Be Available To Players When VARIABLE_XP_RATES is true(Array Must Contain Four Entries)
* XP_RATE Sets The XP Rate Multiplier For All Players/Skills If VARIABLE_XP_RATES is false
* WEBSITE_INTEGRATION Enables/Disables Website Features(Total Accounts Registered & Players Online)
*/
public static String SERVER_NAME = "2006Scape", WEBSITE_LINK = "https://2006Scape.org";
public static int WORLD = 1, MAX_PLAYERS = 200, TIMEOUT = 60, SAVE_TIMER = 120,
RESPAWN_X = 3222, RESPAWN_Y = 3218;
public static boolean FILE_SERVER = true, SERVER_DEBUG = false, MEMBERS_ONLY = false, TUTORIAL_ISLAND = false,
PARTY_ROOM_DISABLED = false, CLUES_ENABLED = true, ITEM_REQUIREMENTS = true,
ADMIN_CAN_TRADE = false, ADMIN_DROP_ITEMS = false, ADMIN_CAN_SELL_ITEMS = false, VARIABLE_XP_RATE = false,
WEBSITE_INTEGRATION = false;
public static int[] VARIABLE_XP_RATES = new int[] {1, 2, 5, 10};
public static double TEST_VERSION = 2.3, XP_RATE = 1.0;
public final static boolean SERVER_DEBUG = false;
/**
* The Variables Below Should Only Be Changed If You Understand What You Are Doing
*/
public final static int ITEM_LIMIT = 15000, MAXITEM_AMOUNT = Integer.MAX_VALUE,
IPS_ALLOWED = 250, CONNECTION_DELAY = 100;
public final static String SERVER_NAME = "2006Scape", SERVER_VERSION = "Server Stage v " + GameConstants.TEST_VERSION + ".";
public final static boolean sendServerPackets = false, SOUND = true, GUILDS = true;
public final static String WEBSITE_LINK = "https://2006Scape.org";
public final static boolean WEBSITE_TOTAL_CHARACTERS_INTEGRATION = false;
public final static double TEST_VERSION = 2.3;
public final static int ITEM_LIMIT = 15000, MAXITEM_AMOUNT = Integer.MAX_VALUE, CLIENT_VERSION = 999999,
WORLD = 1, IPS_ALLOWED = 250, CONNECTION_DELAY = 100,
MESSAGE_DELAY = 6000, MAX_PLAYERS = 200, REQ_AMOUNT = 150;
public final static boolean SOUND = true,
GUILDS = true,
PARTY_ROOM_DISABLED = false,
PRINT_OBJECT_ID = false, EXPERIMENTS = false;
public static int[] SIDEBARS = { 2423, 3917, 638, 3213, 1644, 5608, 1151,
18128, 5065, 5715, 2449, 904, 147, 962 };
public static boolean TUTORIAL_ISLAND = false,
MEMBERS_ONLY = false, sendServerPackets = false,
CLUES_ENABLED = true;
public final static int[] FUN_WEAPONS = { 2460, 2461, 2462, 2463, 2464,
2465, 2466, 2467, 2468, 2469, 2470, 2471, 2471, 2473, 2474, 2475,
2476, 2477 }; // fun weapons for dueling
public static boolean ADMIN_CAN_TRADE = false; // can admins trade?
public final static boolean ADMIN_DROP_ITEMS = false;
public final static boolean ADMIN_CAN_SELL_ITEMS = false;
public final static int RESPAWN_X = 3222; // when dead respawn here
public final static int RESPAWN_Y = 3218;
public final static int DUELING_RESPAWN_X = 3362;
@@ -61,6 +46,16 @@ public class GameConstants {
public final static int NO_TELEPORT_WILD_LEVEL = 20;
public final static boolean ITEM_REQUIREMENTS = true;
public final static int CASTLE_WARS_X = 2439;
public final static int CASTLE_WARS_Y = 3087;
public static double XP_RATE = 1;
public final static int SAVE_TIMER = 120; // save every x seconds
public final static int NPC_RANDOM_WALK_DISTANCE = 5;
public final static int NPC_FOLLOW_DISTANCE = 10;
@@ -74,6 +69,8 @@ public class GameConstants {
"skorge", "tortured soul", "undead chicken", "undead cow", "undead one", "undead troll", "zombie", "zombie rat", "zogre"
};
public final static int TIMEOUT = 60;
public final static int CYCLE_TIME = 600;
public final static int BUFFER_SIZE = 10000;
@@ -35,6 +35,7 @@ import com.rs2.game.players.PlayerSave;
import com.rs2.game.shops.ShopHandler;
import com.rs2.integrations.PlayersOnlineWebsite;
import com.rs2.integrations.RegisteredAccsWebsite;
import com.rs2.integrations.SettingsLoader;
import com.rs2.integrations.discord.DiscordActivity;
import com.rs2.integrations.discord.JavaCord;
import com.rs2.net.ConnectionHandler;
@@ -48,11 +49,10 @@ import com.rs2.world.ObjectHandler;
import com.rs2.world.ObjectManager;
import com.rs2.world.clip.ObjectDefinition;
import com.rs2.world.clip.RegionFactory;
import org.apollo.jagcached.FileServer;
/**
* Server.java
*
*
* @author Sanity
* @author Graham
* @author Blake
@@ -60,10 +60,10 @@ import org.apollo.jagcached.FileServer;
* @author Integration Julian.
*/
public class GameEngine {
private static long minutesCounter;
private static void startMinutesCounter() {
try {
minuteFile = new BufferedReader(new FileReader(
@@ -102,12 +102,13 @@ public class GameEngine {
public static void schedule(Tick tick) {
getScheduler().schedule(tick);
}
public static String ersSecret;
public static int[] cannonsX = new int[50];
public static int[] cannonsY = new int[50];
public static String[] cannonsO = new String[50];
public static int[] cannonsX = new int [50];
public static int[] cannonsY = new int [50];
public static String[] cannonsO = new String [50];
public static boolean sleeping;
public static boolean updateServer = false;
public static long lastMassSave = System.currentTimeMillis();
@@ -126,41 +127,28 @@ public class GameEngine {
public static ObjectManager objectManager = new ObjectManager();
public static FightCaves fightCaves = new FightCaves();
private static PestControl pestControl = new PestControl();
public static Trawler trawler = new Trawler();
public static Trawler trawler = new Trawler();
private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private final static Lock lock = new ReentrantLock();
/**
* Port and Cycle rate.
*/
static {
serverlistenerPort = 43594;
shutdownServer = false;
}
public static void main(java.lang.String[] args)
throws NullPointerException, IOException {
for (int i = 0; i < args.length; i++) {
if (args[i].startsWith("-") && (i + 1) < args.length && !args[i + 1].startsWith("-")) {
switch (args[i]) {
case "-c":
case "-config":
try {
System.out.println("Loading External Config..");
ConfigLoader.loadSettings(args[++i]);
System.out.println("Loaded Config File " + args[i]);
} catch (IOException e) {
System.out.println("Config File Not Found");
}
break;
}
}
}
serverlistenerPort = (GameConstants.WORLD == 1) ? 43594 : 43596 + GameConstants.WORLD;
System.out.println("Starting game engine..");
if (GameConstants.SERVER_DEBUG) {
System.out.println("@@@@ DEBUG MODE IS ENABLED @@@@");
}
if (!new File("data").exists()) {
System.out.println("************************************");
if (!new File("data").exists())
{
System.out.println("************************************");
System.out.println("************************************");
System.out.println("************************************");
System.out.println("WARNING: I could not find the /data folder. You are LIKELY running this in the wrong directory!");
@@ -175,24 +163,12 @@ public class GameEngine {
/**
* Starting Up Server
*/
System.out.println("Launching " + GameConstants.SERVER_NAME + " World: " + GameConstants.WORLD + "...");
/**
* Starts The File Server If Enabled In GameConstants
*/
if (GameConstants.FILE_SERVER) {
FileServer fs = new FileServer();
try {
fs.start();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Launching " + GameConstants.SERVER_NAME + "...");
/**
* Start Integration Services
**/
ConfigLoader.loadSecrets();
**/
SettingsLoader.loadSettings();
JavaCord.init();
/**
@@ -237,11 +213,11 @@ public class GameEngine {
/**
* Main Server Tick
*
*
* This scheduler will tick once every 600ms. If the previous tick takes
* 300ms to execute, this scheduler will wait 300ms only before the next
* tick.
*
*
* scheduleAtFixedRate() does not invoke concurrent Runnables.
*/
scheduler.scheduleAtFixedRate(new Runnable() {
@@ -264,11 +240,11 @@ public class GameEngine {
objectHandler.process();
MageTrainingArena.process();
CycleEventHandler.getSingleton().process();
if (GameConstants.WEBSITE_INTEGRATION) {
PlayersOnlineWebsite.addUpdatePlayersOnlineTask();
RegisteredAccsWebsite.addUpdateRegisteredUsersTask();
PlayersOnlineWebsite.addUpdatePlayersOnlineTask();
if(GameConstants.WEBSITE_TOTAL_CHARACTERS_INTEGRATION) {
RegisteredAccsWebsite.addUpdateRegisteredUsersTask();
}
if (DiscordActivity.playerCount) {
if(DiscordActivity.playerCount) {
DiscordActivity.updateActivity();
}
if (System.currentTimeMillis() - lastMassSave > 300000) {
@@ -301,13 +277,13 @@ public class GameEngine {
}
}
}, 0, GameConstants.CYCLE_TIME, TimeUnit.MILLISECONDS);
/*
* I'd recommend disabling this until I can be bothered to implement it
* properly.
*/
// CommandConsole.getInstance();
try {
while (!scheduler.awaitTermination(60, TimeUnit.SECONDS)) {
// TODO
@@ -316,7 +292,7 @@ public class GameEngine {
} catch (InterruptedException e) {
e.printStackTrace();
}
acceptor = null;
connectionHandler = null;
sac = null;
@@ -325,4 +301,6 @@ public class GameEngine {
public static boolean playerExecuted = false;
private static BufferedReader minuteFile;
}
}
@@ -508,7 +508,8 @@ public class NpcCombat {
NpcHandler.npcs[i].projectileId = 448;
} else if (r3 == 1) {
NpcHandler.npcs[i].attackType = 1;
NpcHandler.npcs[i].projectileId = 451;
NpcHandler.npcs[i].endGfx = 451;
NpcHandler.npcs[i].projectileId = -1;
} else if (r3 == 2) {
NpcHandler.npcs[i].attackType = 0;
NpcHandler.npcs[i].projectileId = -1;
@@ -0,0 +1,14 @@
package com.rs2.game.dialogues;
import java.util.function.Consumer;
/**
* The chain-able interface that allows implementing dialogue factories the ability to chain
* together.
*
* @author Vult-R
*/
public interface ChainablePlugin extends Consumer<DialogueFactoryPlugin> {
}
@@ -4,7 +4,12 @@ package com.rs2.game.dialogues;
* ChatEmotes.java
* @author Andrew (Mr Extremez)
*/
/**
* Contains a List of Chat Head Emotes NPCs and Players can use during Dialogues
* @Deprecated Consider using {@link ExpressionPlugin} instead to add Chat Head Animations to Dialogues.
*
*/
@Deprecated
public enum ChatEmotes {
HAPPY_JOYFUL(588),
@@ -1,20 +0,0 @@
package com.rs2.game.dialogues;
import com.rs2.game.players.Player;
import com.rs2.net.packets.PacketType;
/**
* Dialogue
**/
public class Dialogue implements PacketType {
@Override
public void processPacket(Player c, int packetType, int packetSize) {
if (c.nextChat > 0) {
c.getDialogueHandler().sendDialogues(c.nextChat, c.talkingNpc);
} else {
c.getDialogueHandler().sendDialogues(0, -1);
}
}
}
@@ -0,0 +1,741 @@
package com.rs2.game.dialogues;
import com.rs2.GameConstants;
import com.rs2.game.npcs.NpcHandler;
import com.rs2.game.players.Player;
import com.rs2.util.LoggerUtils;
import com.rs2.util.Misc;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Represents a factory class that contains important functions for building dialogues.
*
* @author Vult-R <https://github.com/Vult-R>
*
* Ported by Qweqker
*/
public final class DialogueFactoryPlugin {
/**
* The single logger for this class.
*/
private static final Logger logger = LoggerUtils.getLogger(DialogueFactoryPlugin.class);
/**
* The queue of dialogues in this factory.
*/
private final Queue<ChainablePlugin> chain = new ArrayDeque<>();
/**
* The approximate maximum characters that can be fit onto a dialogue line in the interface
*
* Defined for use in the dialogue line splitting code
*/
private static final int MAXIMUM_CHARACTERS_PER_LINE = 52;
/**
* The maximum length for any dialogue
*
* Because each line can fit approximately 52 characters, we'll set the maximum
* to 260 characters to accommodate for five lines of dialogue. It can be adjusted later if needed.
*/
private static final int MAXIMUM_LENGTH = 260;
/**
* The player who owns this factory.
*/
private final Player player;
/**
* The flag that denotes dialogue is active.
*/
private boolean active;
/**
* The next action in the dialogue chain.
*/
private Optional<Runnable> nextAction = Optional.empty();
/**
* Creates a new {@link DialogueFactoryPlugin}.
*
* @param player The player who owns this factory.
*/
public DialogueFactoryPlugin(Player player) {
this.player = player;
}
/**
* Sends a player a dialogue.
*
* @param dialogue The dialogue to sent.
*/
public final DialogueFactoryPlugin sendDialogue(DialoguePlugin dialogue) {
clear(); // Clear dialogue queue before starting new one. Hacky, but it works for this base
player.setDialogue(Optional.of(dialogue));
dialogue.sendDialogues(this);
return this;
}
/**
* Sets an {@code action} so this action can be executed after dialogues are done.
*
* @param action The action to set.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin onAction(Runnable action) {
setNextAction(Optional.of(action));
return this;
}
/**
* Accepts the next dialogue in the chain.
*
* @return The instance of this factory.
*/
public DialogueFactoryPlugin onNext() {
if (getChain().peek() != null) {
ChainablePlugin chain = getChain().poll();
chain.accept(this);
} else {
player.getPacketSender().sendClearScreen();
}
return this;
}
/**
* Executes an {@code option} for a {@code player}.
*
* @param type The type of option.
*
* @param option The option to execute.
*/
public final void executeOption(int type, Optional<OptionDialoguePlugin> option) {
option.ifPresent($it -> $it.getActions().get(type).run());
execute();
}
/**
* Clears the current dialogue {@code chain}.
*
* @return The instance of this factory.
*/
public void clear() {
chain.clear();
nextAction = Optional.empty();
player.setDialogue(Optional.empty());
player.setOptionDialogue(Optional.empty());
setActive(false);
}
/**
* Appends a {@code chain} to this factory.
*
* @return The instance of this factory.
*/
private final DialogueFactoryPlugin append(ChainablePlugin chain) {
this.chain.add(chain);
return this;
}
/**
* Retrieves the next dialogue in the chain and executes it.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin execute() {
// check to see if there are anymore dialogues.
if (getChain().peek() != null) {
// there is so, grab the next dialogue.
ChainablePlugin entry = getChain().poll();
// is this an option dialogue?
if (entry instanceof OptionDialoguePlugin) {
OptionDialoguePlugin option = (OptionDialoguePlugin) entry;
player.setOptionDialogue(Optional.of(option));
}
setActive(true);
// whatever dialogue it is, accept it.
entry.accept(this);
} else {
// there are no dialogues in this chain.
// is there an action?
if (getNextAction().isPresent()) {
// there is so, execute it.
getNextAction().ifPresent($it -> $it.run());
// we just used this action so empty it so it can't be used again.
setNextAction(Optional.empty());
return this;
}
setActive(false);
// there are no more dialogues, so clear the screen.
player.getPacketSender().sendClearScreen();
}
return this;
}
/**
* Retrieves the next dialogue in the chain and executes it.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin executeNoClose() {
// check to see if there are anymore dialogues.
if (getChain().peek() != null) {
// there is so, grab the next dialogue.
ChainablePlugin entry = getChain().poll();
// is this an option dialogue?
if (entry instanceof OptionDialoguePlugin) {
OptionDialoguePlugin option = (OptionDialoguePlugin) entry;
player.setOptionDialogue(Optional.of(option));
}
setActive(true);
// whatever dialogue it is, accept it.
entry.accept(this);
} else {
// there are no dialogues in this chain.
// is there an action?
if (getNextAction().isPresent()) {
// there is so, execute it.
getNextAction().ifPresent($it -> $it.run());
// we just used this action so empty it so it can't be used again.
setNextAction(Optional.empty());
return this;
}
setActive(false);
}
return this;
}
/**
* Replaces keywords with their translated values in an existing dialogue text.
*
* @param line The line to check for a keyword.
*/
private final String appendKeywords(String line) {
// If the line contains #username, replace with a formatted player name.
if (line.contains("<username>")) {
line = line.replaceAll("<username>", Misc.formatPlayerName((player.playerName)));
}
if (line.contains("<servername>")) {
line = line.replaceAll("<servername>", GameConstants.SERVER_NAME);
}
return line;
}
/**
* Appends a {@link PlayerDialoguePlugin} to the current dialogue chain.
*
* @param lines The dialogue of the player talking.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendPlayerChat(String... lines) {
return append(new PlayerDialoguePlugin(lines));
}
/**
* Appends a {@link PlayerDialoguePlugin} to the current dialogue chain.
*
* @param lines The dialogue of the player talking.
*
* @param expression The expression of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendPlayerChat(ExpressionPlugin expression, String... lines) {
return append(new PlayerDialoguePlugin(expression, lines));
}
/**
* Sends a dialogue with a player talking.
*
* @param dialogue The player dialogue.
*
* @return The instance of this factory.
*/
final DialogueFactoryPlugin sendPlayerChat(PlayerDialoguePlugin dialogue) {
ExpressionPlugin expression = dialogue.getExpression();
String[] lines = dialogue.getLines();
validateLength(lines);
lines = splitLines(lines);
switch (lines.length) {
case 1:
player.getPacketSender().sendDialogueAnimation(969, expression.getId());
player.getPacketSender().sendString(Misc.formatPlayerName(player.playerName), 970);
player.getPacketSender().sendString(appendKeywords(lines[0]), 971);
player.getPacketSender().sendPlayerDialogueHead(969);
player.getPacketSender().sendChatInterface(968);
break;
case 2:
player.getPacketSender().sendDialogueAnimation(974, expression.getId());
player.getPacketSender().sendString(Misc.formatPlayerName(player.playerName), 975);
player.getPacketSender().sendString(appendKeywords(lines[0]), 976);
player.getPacketSender().sendString(appendKeywords(lines[1]), 977);
player.getPacketSender().sendPlayerDialogueHead(974);
player.getPacketSender().sendChatInterface(973);
break;
case 3:
player.getPacketSender().sendDialogueAnimation(980, expression.getId());
player.getPacketSender().sendString(Misc.formatPlayerName(player.playerName), 981);
player.getPacketSender().sendString(appendKeywords(lines[0]), 982);
player.getPacketSender().sendString(appendKeywords(lines[1]), 983);
player.getPacketSender().sendString(appendKeywords(lines[2]), 984);
player.getPacketSender().sendPlayerDialogueHead(980);
player.getPacketSender().sendChatInterface(979);
break;
case 4:
player.getPacketSender().sendDialogueAnimation(987, expression.getId());
player.getPacketSender().sendString(Misc.formatPlayerName(player.playerName), 988);
player.getPacketSender().sendString(appendKeywords(lines[0]), 989);
player.getPacketSender().sendString(appendKeywords(lines[1]), 990);
player.getPacketSender().sendString(appendKeywords(lines[2]), 991);
player.getPacketSender().sendString(appendKeywords(lines[3]), 992);
player.getPacketSender().sendPlayerDialogueHead(987);
player.getPacketSender().sendChatInterface(986);
break;
default:
logger.log(Level.SEVERE, String.format("Invalid player dialogue line length: %s", lines.length));
break;
}
return this;
}
/**
* Appends an npc dialogue.
*
* @param lines The text of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendNPCChat(String... lines) {
return append(new NPCDialogue(lines));
}
/**
* Appends an {@link NPCDialogue} to the current dialogue chain.
*
* @param expression The expression of this npc.
*
* @param lines The text of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendNPCChat(ExpressionPlugin expression, String... lines) {
return append(new NPCDialogue(expression, lines));
}
/**
* Appends an {@link NPCDialogue} to the current dialogue chain.
*
* @param id The id of this npc.
*
* @param lines The text of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendNPCChat(int id, String... lines) {
return append(new NPCDialogue(id, ExpressionPlugin.DEFAULT, lines));
}
/**
* Appends an {@link NPCDialogue} to the current dialogue chain.
*
* @param id The id of this npc.
*
* @param expression The expression of this npc.
*
* @param lines The text of this dialogue.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendNPCChat(int id, ExpressionPlugin expression, String... lines) {
return append(new NPCDialogue(id, expression, lines));
}
/**
* Sends a dialogue with a npc talking.
*
* @param dialogue The dialogue.
*
* @return The instance of this factory.
*/
final DialogueFactoryPlugin sendNPCChat(NPCDialogue dialogue) {
ExpressionPlugin expression = dialogue.getExpression();
String[] lines = dialogue.getLines();
validateLength(lines);
lines = splitLines(lines);
final String npcName = NpcHandler.getNpcListName(player.npcType).replaceAll("_", " ");
if (npcName == null) {
return this;
}
switch (lines.length) {
case 1:
player.getPacketSender().sendDialogueAnimation(4883, expression.getId());
player.getPacketSender().sendString(npcName, 4884);
player.getPacketSender().sendString(appendKeywords(lines[0]), 4885);
player.getPacketSender().sendNPCDialogueHead(player.npcType, 4883);
player.getPacketSender().sendChatInterface(4882);
break;
case 2:
player.getPacketSender().sendDialogueAnimation(4888, expression.getId());
player.getPacketSender().sendString(npcName, 4889);
player.getPacketSender().sendString(appendKeywords(lines[0]), 4890);
player.getPacketSender().sendString(appendKeywords(lines[1]), 4891);
player.getPacketSender().sendNPCDialogueHead(player.npcType, 4888);
player.getPacketSender().sendChatInterface(4887);
break;
case 3:
player.getPacketSender().sendDialogueAnimation(4894, expression.getId());
player.getPacketSender().sendString(npcName, 4895);
player.getPacketSender().sendString(appendKeywords(lines[0]), 4896);
player.getPacketSender().sendString(appendKeywords(lines[1]), 4897);
player.getPacketSender().sendString(appendKeywords(lines[2]), 4898);
player.getPacketSender().sendNPCDialogueHead(player.npcType, 4894);
player.getPacketSender().sendChatInterface(4893);
break;
case 4:
player.getPacketSender().sendDialogueAnimation(4901, expression.getId());
player.getPacketSender().sendString(npcName, 4902);
player.getPacketSender().sendString(appendKeywords(lines[0]), 4903);
player.getPacketSender().sendString(appendKeywords(lines[1]), 4904);
player.getPacketSender().sendString(appendKeywords(lines[2]), 4905);
player.getPacketSender().sendString(appendKeywords(lines[3]), 4906);
player.getPacketSender().sendNPCDialogueHead(player.npcType, 4901);
player.getPacketSender().sendChatInterface(4900);
break;
default:
logger.log(Level.SEVERE,
String.format("Invalid npc dialogue line length: %s", lines.length));
break;
}
return this;
}
/**
* Appends the {@link OptionDialoguePlugin} onto the current dialogue chain.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*/
public final DialogueFactoryPlugin sendOption(String option1, Runnable action1, String option2,
Runnable action2) {
return append(new OptionDialoguePlugin(option1, action1, option2, action2));
}
/**
* Appends the {@link OptionDialoguePlugin} onto the current dialogue chain.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*/
public final DialogueFactoryPlugin sendOption(String option1, Runnable action1, String option2,
Runnable action2, String option3, Runnable action3) {
return append(new OptionDialoguePlugin(option1, action1, option2, action2, option3, action3));
}
/**
* Appends the {@link OptionDialoguePlugin} onto the current dialogue chain.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*
* @param option4 The text for the four option.
*
* @param action4 The action for the four action.
*/
public final DialogueFactoryPlugin sendOption(String option1, Runnable action1, String option2,
Runnable action2, String option3, Runnable action3, String option4, Runnable action4) {
return append(
new OptionDialoguePlugin(option1, action1, option2, action2, option3, action3, option4, action4));
}
/**
* Appends the {@link OptionDialoguePlugin} onto the current dialogue chain.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*
* @param option4 The text for the four option.
*
* @param action4 The action for the four action.
*
* @param option5 The text for the fifth option.
*
* @param action5 The action for the fifth action.
*/
public final DialogueFactoryPlugin sendOption(String option1, Runnable action1, String option2,
Runnable action2, String option3, Runnable action3, String option4, Runnable action4,
String option5, Runnable action5) {
return append(new OptionDialoguePlugin(option1, action1, option2, action2, option3, action3, option4,
action4, option5, action5));
}
/**
* Sends a dialogue with options.
*
* @param dialogue The dialogue.
*
* @return The instance of this factory.
*/
final DialogueFactoryPlugin sendOption(OptionDialoguePlugin dialogue) {
String[] options = dialogue.getLines();
validateLength(options);
switch (options.length) {
case 2:
player.getPacketSender().sendString("Select an Option", 2460);
player.getPacketSender().sendString(options[0], 2461);
player.getPacketSender().sendString(options[1], 2462);
player.getPacketSender().sendChatInterface(2459);
return this;
case 3:
player.getPacketSender().sendString("Select an Option", 2470);
player.getPacketSender().sendString(options[0], 2471);
player.getPacketSender().sendString(options[1], 2472);
player.getPacketSender().sendString(options[2], 2473);
player.getPacketSender().sendChatInterface(2469);
return this;
case 4:
player.getPacketSender().sendString("Select an Option", 2481);
player.getPacketSender().sendString(options[0], 2482);
player.getPacketSender().sendString(options[1], 2483);
player.getPacketSender().sendString(options[2], 2484);
player.getPacketSender().sendString(options[3], 2485);
player.getPacketSender().sendChatInterface(2480);
return this;
case 5:
player.getPacketSender().sendString("Select an Option", 2493);
player.getPacketSender().sendString(options[0], 2494);
player.getPacketSender().sendString(options[1], 2495);
player.getPacketSender().sendString(options[2], 2496);
player.getPacketSender().sendString(options[3], 2497);
player.getPacketSender().sendString(options[4], 2498);
player.getPacketSender().sendChatInterface(2492);
return this;
}
return this;
}
/**
* Appends a {@link StatementDialoguePlugin} to the current dialogue chain.
*
* @param lines The text for this statement.
*
* @return The instance of this factory.
*/
public final DialogueFactoryPlugin sendStatement(String... lines) {
append(new StatementDialoguePlugin(lines));
return this;
}
/**
* Sends a player a statement dialogue.
*
* @param dialogue The statement dialogue.
*/
final DialogueFactoryPlugin sendStatement(StatementDialoguePlugin dialogue) {
String[] lines = dialogue.getLines();
validateLength(lines);
lines = splitLines(lines);
switch (lines.length) {
case 1:
player.getPacketSender().sendString(dialogue.getLines()[0], 357);
player.getPacketSender().sendString("Click here to continue", 358);
player.getPacketSender().sendChatInterface(356);
break;
case 2:
player.getPacketSender().sendString(dialogue.getLines()[0], 360);
player.getPacketSender().sendString(dialogue.getLines()[1], 361);
player.getPacketSender().sendString("Click here to continue", 362);
player.getPacketSender().sendChatInterface(359);
break;
case 3:
player.getPacketSender().sendString(dialogue.getLines()[0], 364);
player.getPacketSender().sendString(dialogue.getLines()[1], 365);
player.getPacketSender().sendString(dialogue.getLines()[2], 366);
player.getPacketSender().sendString("Click here to continue", 367);
player.getPacketSender().sendChatInterface(363);
break;
case 4:
player.getPacketSender().sendString(dialogue.getLines()[0], 369);
player.getPacketSender().sendString(dialogue.getLines()[1], 370);
player.getPacketSender().sendString(dialogue.getLines()[2], 371);
player.getPacketSender().sendString(dialogue.getLines()[3], 372);
player.getPacketSender().sendString("Click here to continue", 373);
player.getPacketSender().sendChatInterface(368);
break;
case 5:
player.getPacketSender().sendString(dialogue.getLines()[0], 375);
player.getPacketSender().sendString(dialogue.getLines()[1], 376);
player.getPacketSender().sendString(dialogue.getLines()[2], 377);
player.getPacketSender().sendString(dialogue.getLines()[3], 378);
player.getPacketSender().sendString(dialogue.getLines()[4], 379);
player.getPacketSender().sendString("Click here to continue", 380);
player.getPacketSender().sendChatInterface(374);
default:
logger.log(Level.SEVERE, String.format("Invalid statement dialogue line length: %s",
dialogue.getLines().length));
break;
}
return this;
}
/**
* The method that validates the length of {@code text}.
*
* @param text the text that will be validated.
* @throws IllegalStateException if any lines of the text exceed a certain length.
*/
private final void validateLength(String... text) {
if (Arrays.stream(text).filter(Objects::nonNull).anyMatch(s -> s.length() > MAXIMUM_LENGTH)) {
throw new IllegalStateException(
"Dialogue length too long, maximum length is: " + MAXIMUM_LENGTH);
}
}
/**
* The method that splits the length of {@code text}.
*
* @param text the text that will be split.
* @throws IllegalStateException if the calculated number of lines exceeds 4.
* @return text if the line is detected to already be split.
* @return splittext the text formatted into lines that fit into the dialogue interface
*/
private final String[] splitLines(String... text) {
if(text.length > 1){
logger.log(Level.INFO, "Detected more than 1 Dialogue line. Assuming Dialogues have been split already.");
return text;
}
int characters = text[0].length();
String[] words = text[0].split(" ");
double lines = Math.ceil(characters / MAXIMUM_CHARACTERS_PER_LINE) + 1;
if(lines > 4){
throw new IllegalStateException(
"Calculated Line Split Exceeds 4 Lines.");
}
ArrayList<String> splitText = new ArrayList<>();
int index = 0;
// Begin Splitting Lines
for(int i = 0; i < lines; i++) {
int length = 0;
StringBuilder line = new StringBuilder();
while (length <= MAXIMUM_CHARACTERS_PER_LINE && !(index == words.length)) {
String currentWord = "";
try {
currentWord = words[index];
if (length + (currentWord.length() + 1) <= MAXIMUM_CHARACTERS_PER_LINE) {
currentWord += " ";
} else {
currentWord += "";
}
} catch (Exception e) {
logger.log(Level.INFO, e.toString());
}
length += currentWord.length();
if (length <= MAXIMUM_CHARACTERS_PER_LINE) {
line.append(currentWord);
index++;
}
}
splitText.add(line.toString());
}
return splitText.toArray(new String[0]);
}
// Delombok'd Code Below
public Queue<ChainablePlugin> getChain() {
return this.chain;
}
public Player getPlayer() {
return this.player;
}
public boolean isActive() {
return this.active;
}
public Optional<Runnable> getNextAction() {
return this.nextAction;
}
public void setActive(boolean active) {
this.active = active;
}
public void setNextAction(Optional<Runnable> nextAction) {
this.nextAction = nextAction;
}
}
@@ -8,7 +8,6 @@ import com.rs2.game.content.quests.QuestAssistant;
import com.rs2.game.content.quests.QuestRewards;
import com.rs2.game.content.randomevents.FreakyForester;
import com.rs2.game.content.randomevents.RandomEventHandler;
import com.rs2.game.content.skills.SkillHandler;
import com.rs2.game.content.skills.farming.Farmers;
import com.rs2.game.content.skills.slayer.Slayer;
import com.rs2.game.content.traveling.CarpetTravel;
@@ -22,6 +21,12 @@ import com.rs2.game.players.PlayerAssistant;
import com.rs2.game.shops.Shops.Shop;
import com.rs2.util.Misc;
/**
* Handles Dialogues between NPCs and Players
* @Deprecated Consider using {@link DialogueFactoryPlugin} instead to implement dialogues.
*
*/
@Deprecated
public class DialogueHandler {
private final Player player;
@@ -3942,32 +3947,9 @@ public class DialogueHandler {
"Tzhaar-Mej-Tal");
player.nextChat = 0;
break;
/** Bank Settings **/
case 1013:
if (SkillHandler.isSkilling(player)) {
return;
}
sendNpcChat1("Good day. How may I help you?", player.talkingNpc, "Banker");
player.nextChat = 1014;
break;
case 1014:// bank open done, this place done, settings done, to do
// delete pin
sendOption("I'd like to access my bank account, please.", "I'd like to check my my P I N settings.", "What is this place?");
player.dialogueAction = 251;
break;
/** What is this place? **/
case 1015:
sendPlayerChat("What is this place?");
player.nextChat = 1016;
break;
case 1016:
sendNpcChat2("This is the bank of " + GameConstants.SERVER_NAME + ".", "We have many branches in many towns.", player.talkingNpc, "Banker");
player.nextChat = 0;
break;
/**
* Note on P I N. In order to check your "Pin Settings. You must have
* enter your Bank Pin first
* BANK P I N Setting
* Note on P I N. In order to check your P I N Settings. You must enter your Bank Pin first
**/
/** I don't know option for Bank Pin **/
case 1017:
@@ -6137,14 +6119,10 @@ public class DialogueHandler {
break;
case 3116:
if(GameConstants.VARIABLE_XP_RATE) {
player.getDialogueHandler().sendDialogues(10001, -1);
} else {
player.getPacketSender().showInterface(3559);
player.canChangeAppearance = true;
player.closeTutorialInterface = true;
player.nextChat = 0;
}
player.getPacketSender().showInterface(3559);
player.canChangeAppearance = true;
player.closeTutorialInterface = true;
player.nextChat = 0;
break;
case 3117:
@@ -7472,28 +7450,8 @@ public class DialogueHandler {
case 3868:
player.getDialogueHandler().sendNpcChat(player.talkingNpc, ChatEmotes.HAPPY_JOYFUL, "Enjoy your stay here. May it be spiritually uplifting!");
player.getDialogueHandler().endDialogue();
break;
case 3869:
player.getDialogueHandler().sendPlayerChat(ChatEmotes.DEFAULT, "Hello, how's it going?");
player.nextChat = 3870;
break;
case 3870:
player.getDialogueHandler().sendNpcChat(player.talkingNpc, ChatEmotes.HAPPY_JOYFUL, "I'm fine how are you?");
player.nextChat = 3871;
break;
case 3871:
player.getDialogueHandler().sendPlayerChat(ChatEmotes.DEFAULT, "Very well thank you.");
player.getDialogueHandler().endDialogue();
break;
case 3872:
player.getDialogueHandler().sendPlayerChat(ChatEmotes.DEFAULT, "Hello, how's it going?");
player.nextChat = 3873;
break;
case 3873:
player.getDialogueHandler().sendNpcChat(player.talkingNpc, ChatEmotes.HAPPY_JOYFUL, "Hello there! Nice weather we've been having.");
player.getDialogueHandler().endDialogue();
break;
//holiday events (easter)
//holiday events (easter)
case 6000:
player.getDialogueHandler().sendNpcChat(player.talkingNpc, ChatEmotes.DISTRESSED, "Oh dear... What am I going to do?");
player.nextChat = 6001;
@@ -7598,34 +7556,6 @@ public class DialogueHandler {
);
player.dialogueAction = 10000;
break;
case 10001:
sendNpcChat(2244, ChatEmotes.HAPPY_JOYFUL, "Please select the XP rate you'd like.", "this can be increased, but not decreased later on.");
player.nextChat = 10002;
break;
case 10002:
sendOption("x" + GameConstants.VARIABLE_XP_RATES[0], "x" + GameConstants.VARIABLE_XP_RATES[1], "x" + GameConstants.VARIABLE_XP_RATES[2], "x" + GameConstants.VARIABLE_XP_RATES[3]);
player.dialogueAction = 10002;
break;
case 10003:
sendNpcChat(2244, ChatEmotes.HAPPY_JOYFUL, "Are you sure x" + player.getXPRate() + " is the XP rate you'd like?");
player.nextChat = 10004;
break;
case 10004:
sendOption("Yes", "No");
player.dialogueAction = 10004;
break;
case 10005:
sendOption("x" + GameConstants.VARIABLE_XP_RATES[1], "x" + GameConstants.VARIABLE_XP_RATES[2], "x" + GameConstants.VARIABLE_XP_RATES[3]);
player.dialogueAction = 10005;
break;
case 10006:
sendOption("x" + GameConstants.VARIABLE_XP_RATES[2], "x" + GameConstants.VARIABLE_XP_RATES[3]);
player.dialogueAction = 10006;
break;
case 10007:
sendOption("x" + GameConstants.VARIABLE_XP_RATES[3], "Don't Change");
player.dialogueAction = 10007;
break;
}
}
public void chatboxText(String text, String text1, String text2,
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,37 @@
package com.rs2.game.dialogues;
import com.google.common.collect.ImmutableList;
/**
* Represents an abstract dialogue, in which extending classes will be able to construct and send
* dialogues to a player.
*
* @author Vult-R
*/
public abstract class DialoguePlugin {
/**
* The action buttons responsible for dialogues.
*/
public static final ImmutableList<Integer> DIALOGUE_BUTTONS = ImmutableList.of(9157, 9167, 9178, 9190,
9158, 9168, 9179, 9191, 9169, 9180, 9192, 9181, 9193, 9194);
/**
* Sends a player a dialogue.
*
* @param factory The factory for this dialogue.
*/
public abstract void sendDialogues(DialogueFactoryPlugin factory);
/**
* Checks if the button triggered is an optional dialogue button.
*
* @param button The index of the button being checked.
*
* @return The result of the operation.
*/
public static final boolean isDialogueButton(int button) {
return DIALOGUE_BUTTONS.stream().anyMatch(search -> search == button);
}
}
@@ -0,0 +1,74 @@
package com.rs2.game.dialogues;
/*
* Copyright (c) 2010-2011 Graham Edgecombe Copyright (c) 2011-2016 Major <major.emrs@gmail.com> and
* other apollo contributors
*
* Permission to use, copy, modify, and/or distribute this software for any purpose with or without
* fee is hereby granted, provided that the above copyright notice and this permission notice appear
* in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/**
* Represents the expressions of entities for dialogue.
*
* @author Vult-R
*/
public enum ExpressionPlugin {
HAPPY(588),
ANXIOUS(589),
CALM_TALK(590),
DEFAULT(591),
EVIL(592),
BAD(593),
WICKED(594),
ANNOYED(595),
DISTRESSED(596),
AFFLICTED(597),
DRUNK_LEFT(600),
DRUNK_RIGHT(601),
NOT_INTERESTED(602),
SLEEPY(603),
PLAIN_EVIL(604),
LAUGH(605),
SNIGGER(606),
HAVE_FUN(607),
GUFFAW(608),
EVIL_LAUGH_SHORT(609),
SLIGHTLY_SAD(610),
SAD(599),
VERY_SAD(611),
ON_ONE_HAND(612),
ALMOST_CRYING(598),
NEARLY_CRYING(613),
ANGRY(614),
FURIOUS(615),
ENRAGED(616),
MAD(617);
/**
* The id for this expression.
*/
private final int id;
/**
* Creates a new {@link ExpressionPlugin}.
*
* @param expression The id for this expression.
*/
private ExpressionPlugin(int expression) {
this.id = expression;
}
// Delombok'd Code Below
public int getId() {
return this.id;
}
}
@@ -0,0 +1,122 @@
package com.rs2.game.dialogues;
/**
* The {@link ChainablePlugin} implementation that represents dialogue in which an NPC is talking.
*
* @author Vult-R
*/
public final class NPCDialogue implements ChainablePlugin {
/**
* The id of this npc.
*/
private int id = -1;
/**
* The expression of this NPC.
*/
private final ExpressionPlugin expression;
/**
* The text for this dialogue.
*/
private final String[] lines;
/**
* Creates a new {@link NPCDialogue}
*
* @param lines The text for this dialogue.
*/
public NPCDialogue(String... lines) {
this(ExpressionPlugin.DEFAULT, lines);
}
/**
* Creates a new {@link NPCDialogue}
*
* @param expression The expression of this npc.
*
* @param lines The text for this dialogue.
*/
public NPCDialogue(ExpressionPlugin expression, String... lines) {
this.expression = expression;
this.lines = lines;
}
/**
* Creates a new {@link NPCDialogue}
*
* @param id The id of this npc.
*
* @param lines The text for this dialogue.
*/
public NPCDialogue(int id, String... lines) {
this(id, ExpressionPlugin.DEFAULT, lines);
}
/**
* Creates a new {@link NPCDialogue}
*
* @param id The id of this npc.
*
* @param expression The expression of this npc.
*
* @param lines The text for this dialogue.
*/
public NPCDialogue(int id, ExpressionPlugin expression, String... lines) {
this.id = id;
this.expression = expression;
this.lines = lines;
}
@Override
public void accept(DialogueFactoryPlugin factory) {
factory.sendNPCChat(this);
}
public int getId() {
return this.id;
}
public ExpressionPlugin getExpression() {
return this.expression;
}
// Delombok'd Code Below
public String[] getLines() {
return this.lines;
}
public void setId(int id) {
this.id = id;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof NPCDialogue)) return false;
final NPCDialogue other = (NPCDialogue) o;
if (this.getId() != other.getId()) return false;
final Object this$expression = this.getExpression();
final Object other$expression = other.getExpression();
if (this$expression == null ? other$expression != null : !this$expression.equals(other$expression))
return false;
if (!java.util.Arrays.deepEquals(this.getLines(), other.getLines())) return false;
return true;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + this.getId();
final Object $expression = this.getExpression();
result = result * PRIME + ($expression == null ? 43 : $expression.hashCode());
result = result * PRIME + java.util.Arrays.deepHashCode(this.getLines());
return result;
}
public String toString() {
return "AstraeusNPCDialogue(id=" + this.getId() + ", expression=" + this.getExpression() + ", lines=" + java.util.Arrays.deepToString(this.getLines()) + ")";
}
}
@@ -0,0 +1,163 @@
package com.rs2.game.dialogues;
import java.util.ArrayList;
import java.util.List;
/**
* The {@link ChainablePlugin} implementation that represents a dialogue in which options are given to the
* player.
*
* @author Vult-R
*/
public final class OptionDialoguePlugin implements ChainablePlugin {
/**
* The text for this dialogue.
*/
private final String[] lines;
/**
* The list of actions for this dialogue.
*/
private final List<Runnable> actions = new ArrayList<>();
/**
* Creates a new {@link OptionDialoguePlugin}.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*/
public OptionDialoguePlugin(String option1, Runnable action1, String option2, Runnable action2) {
lines = new String[] {option1, option2};
actions.add(action1);
actions.add(action2);
}
/**
* Creates a new {@link OptionDialoguePlugin}.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*/
public OptionDialoguePlugin(String option1, Runnable action1, String option2, Runnable action2,
String option3, Runnable action3) {
lines = new String[] {option1, option2, option3};
actions.add(action1);
actions.add(action2);
actions.add(action3);
}
/**
* Creates a new {@link OptionDialoguePlugin}.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*
* @param option4 The text for the four option.
*
* @param action4 The action for the four action.
*/
public OptionDialoguePlugin(String option1, Runnable action1, String option2, Runnable action2,
String option3, Runnable action3, String option4, Runnable action4) {
lines = new String[] {option1, option2, option3, option4};
actions.add(action1);
actions.add(action2);
actions.add(action3);
actions.add(action4);
}
/**
* Creates a new {@link OptionDialoguePlugin}.
*
* @param option1 The text for the first option.
*
* @param action1 The action for the first action.
*
* @param option2 The text for the second option.
*
* @param action2 The action for the second action.
*
* @param option3 The text for the third option.
*
* @param action3 The action for the third action.
*
* @param option4 The text for the four option.
*
* @param action4 The action for the four action.
*
* @param option5 The text for the fifth option.
*
* @param action5 The action for the fifth action.
*/
public OptionDialoguePlugin(String option1, Runnable action1, String option2, Runnable action2,
String option3, Runnable action3, String option4, Runnable action4, String option5,
Runnable action5) {
lines = new String[] {option1, option2, option3, option4, option5};
actions.add(action1);
actions.add(action2);
actions.add(action3);
actions.add(action4);
actions.add(action5);
}
@Override
public void accept(DialogueFactoryPlugin factory) {
factory.sendOption(this);
}
// Delombok'd code below
public String[] getLines() {
return this.lines;
}
public List<Runnable> getActions() {
return this.actions;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof OptionDialoguePlugin)) return false;
final OptionDialoguePlugin other = (OptionDialoguePlugin) o;
if (!java.util.Arrays.deepEquals(this.getLines(), other.getLines())) return false;
final Object this$actions = this.getActions();
final Object other$actions = other.getActions();
if (this$actions == null ? other$actions != null : !this$actions.equals(other$actions)) return false;
return true;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + java.util.Arrays.deepHashCode(this.getLines());
final Object $actions = this.getActions();
result = result * PRIME + ($actions == null ? 43 : $actions.hashCode());
return result;
}
public String toString() {
return "AstraeusOptionDialogue(lines=" + java.util.Arrays.deepToString(this.getLines()) + ", actions=" + this.getActions() + ")";
}
}
@@ -0,0 +1,84 @@
package com.rs2.game.dialogues;
/**
* A {@link ChainablePlugin} implementation that represents a player talking.
*
* @author Vult-R
*/
public class PlayerDialoguePlugin implements ChainablePlugin {
/**
* The expression of this player.
*/
private final ExpressionPlugin expression;
/**
* The text for this dialogue.
*/
private final String[] lines;
/**
* Creates a new {@link PlayerDialoguePlugin} with a default expression of {@code DEFAULT}.
*
* @param lines The text for this dialogue.
*/
public PlayerDialoguePlugin(String... lines) {
this(ExpressionPlugin.DEFAULT, lines);
}
/**
* Creates a new {@link PlayerDialoguePlugin}.
*
* @param expression The expression for this dialogue.
*
* @param lines The text for this dialogue.
*/
public PlayerDialoguePlugin(ExpressionPlugin expression, String... lines) {
this.expression = expression;
this.lines = lines;
}
@Override
public void accept(DialogueFactoryPlugin factory) {
factory.sendPlayerChat(this);
}
public ExpressionPlugin getExpression() {
return this.expression;
}
// Delombok'd Code Below
public String[] getLines() {
return this.lines;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof PlayerDialoguePlugin)) return false;
final PlayerDialoguePlugin other = (PlayerDialoguePlugin) o;
if (!other.canEqual((Object) this)) return false;
final Object this$expression = this.getExpression();
final Object other$expression = other.getExpression();
if (this$expression == null ? other$expression != null : !this$expression.equals(other$expression))
return false;
if (!java.util.Arrays.deepEquals(this.getLines(), other.getLines())) return false;
return true;
}
protected boolean canEqual(final Object other) {
return other instanceof PlayerDialoguePlugin;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
final Object $expression = this.getExpression();
result = result * PRIME + ($expression == null ? 43 : $expression.hashCode());
result = result * PRIME + java.util.Arrays.deepHashCode(this.getLines());
return result;
}
public String toString() {
return "PlayerDialoguePlugin(expression=" + this.getExpression() + ", lines=" + java.util.Arrays.deepToString(this.getLines()) + ")";
}
}
@@ -0,0 +1,60 @@
package com.rs2.game.dialogues;
/**
* The {@link ChainablePlugin} implementation that represents a dialogue with a single statement; which
* has no models on the dialogue.
*
* @author Vult-R
*/
public class StatementDialoguePlugin implements ChainablePlugin {
/**
* The text for this dialogue.
*/
private final String[] lines;
/**
* Creates a new {@link StatementDialoguePlugin}.
*
* @param lines The text for this dialogue.
*/
public StatementDialoguePlugin(String... lines) {
this.lines = lines;
}
@Override
public void accept(DialogueFactoryPlugin factory) {
factory.sendStatement(this);
}
// Delombok'd code below
public String[] getLines() {
return this.lines;
}
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof StatementDialoguePlugin)) return false;
final StatementDialoguePlugin other = (StatementDialoguePlugin) o;
if (!other.canEqual((Object) this)) return false;
if (!java.util.Arrays.deepEquals(this.getLines(), other.getLines())) return false;
return true;
}
protected boolean canEqual(final Object other) {
return other instanceof StatementDialoguePlugin;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + java.util.Arrays.deepHashCode(this.getLines());
return result;
}
public String toString() {
return "AstraeusStatementDialogue(lines=" + java.util.Arrays.deepToString(this.getLines()) + ")";
}
}
@@ -229,8 +229,6 @@ public class Climbing {
} else if (client.objectX == 2603 && client.objectY == 3078) {
client.getPlayerAssistant().feature("using this staircase");
client.resetWalkingQueue();
} else if (client.objectX == 3058 && client.objectY == 3376) {
client.resetWalkingQueue();
} else if (client.absX != 3186) {
client.getPlayerAssistant().movePlayer(client.absX,
client.absY + 6393, 0);
@@ -1,19 +1,9 @@
package com.rs2.game.players;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import com.everythingrs.hiscores.Hiscores;
import com.rs2.event.*;
import com.rs2.plugin.PluginService;
import org.apache.mina.common.IoSession;
import com.rs2.GameConstants;
import com.rs2.GameEngine;
import com.rs2.event.*;
import com.rs2.game.content.BankPin;
import com.rs2.game.content.EmoteHandler;
import com.rs2.game.content.combat.CombatAssistant;
@@ -35,28 +25,11 @@ import com.rs2.game.content.minigames.magetrainingarena.MageTrainingArena;
import com.rs2.game.content.music.PlayList;
import com.rs2.game.content.music.sound.SoundList;
import com.rs2.game.content.skills.SkillInterfaces;
import com.rs2.game.content.skills.agility.Agility;
import com.rs2.game.content.skills.agility.ApeAtollAgility;
import com.rs2.game.content.skills.agility.BarbarianAgility;
import com.rs2.game.content.skills.agility.GnomeAgility;
import com.rs2.game.content.skills.agility.PyramidAgility;
import com.rs2.game.content.skills.agility.WerewolfAgility;
import com.rs2.game.content.skills.agility.WildernessAgility;
import com.rs2.game.content.skills.agility.*;
import com.rs2.game.content.skills.cooking.Potatoes;
import com.rs2.game.content.skills.core.Mining;
import com.rs2.game.content.skills.crafting.GlassBlowing;
import com.rs2.game.content.skills.farming.Allotments;
import com.rs2.game.content.skills.farming.Bushes;
import com.rs2.game.content.skills.farming.Compost;
import com.rs2.game.content.skills.farming.Flowers;
import com.rs2.game.content.skills.farming.FruitTree;
import com.rs2.game.content.skills.farming.Herbs;
import com.rs2.game.content.skills.farming.Hops;
import com.rs2.game.content.skills.farming.Seedling;
import com.rs2.game.content.skills.farming.SpecialPlantOne;
import com.rs2.game.content.skills.farming.SpecialPlantTwo;
import com.rs2.game.content.skills.farming.ToolLeprechaun;
import com.rs2.game.content.skills.farming.WoodTrees;
import com.rs2.game.content.skills.farming.*;
import com.rs2.game.content.skills.fletching.LogCuttingInterface;
import com.rs2.game.content.skills.runecrafting.Runecrafting;
import com.rs2.game.content.skills.slayer.Slayer;
@@ -64,18 +37,17 @@ import com.rs2.game.content.skills.smithing.Smithing;
import com.rs2.game.content.skills.smithing.SmithingInterface;
import com.rs2.game.content.traveling.DesertCactus;
import com.rs2.game.content.traveling.DesertHeat;
import com.rs2.game.dialogues.DialoguePlugin;
import com.rs2.game.dialogues.DialogueFactoryPlugin;
import com.rs2.game.dialogues.OptionDialoguePlugin;
import com.rs2.game.dialogues.DialogueHandler;
import com.rs2.game.globalworldobjects.DoubleGates;
import com.rs2.game.globalworldobjects.GateHandler;
import com.rs2.game.globalworldobjects.SingleGates;
import com.rs2.game.items.GameItem;
import com.rs2.game.items.Inventory;
import com.rs2.game.items.ItemData;
import com.rs2.game.items.ItemAssistant;
import com.rs2.game.items.ItemConstants;
import com.rs2.game.items.*;
import com.rs2.game.items.impl.Greegree.MonkeyData;
import com.rs2.game.items.impl.PotionMixing;
import com.rs2.game.items.impl.Teles;
import com.rs2.game.items.impl.Greegree.MonkeyData;
import com.rs2.game.npcs.Npc;
import com.rs2.game.npcs.NpcActions;
import com.rs2.game.npcs.NpcHandler;
@@ -88,19 +60,21 @@ import com.rs2.net.PacketSender;
import com.rs2.net.StaticPacketBuilder;
import com.rs2.net.packets.PacketHandler;
import com.rs2.net.packets.impl.ChallengePlayer;
import com.rs2.plugin.PluginService;
import com.rs2.util.ISAACRandomGen;
import com.rs2.util.Misc;
import com.rs2.util.Stream;
import com.rs2.world.Boundary;
import com.rs2.world.ObjectManager;
import org.apache.mina.common.IoSession;
import java.util.*;
public abstract class Player {
public byte buffer[] = null;
public String lastConnectedFrom;
public static int xpRate = 1;
public String discordCode;
private Compost compost = new Compost(this);
private Compost compost = new Compost(this);
private Allotments allotment = new Allotments(this);
private Flowers flower = new Flowers(this);
private Herbs herb = new Herbs(this);
@@ -144,6 +118,14 @@ public abstract class Player {
private final Slayer slayer = new Slayer(this);
private final PacketSender packetSender = new PacketSender(this);
private final DialogueHandler dialogues = new DialogueHandler(this);
private final DialogueFactoryPlugin dialogueFactory = new DialogueFactoryPlugin(this);
private Optional<DialoguePlugin> dialogue = Optional.empty();
private Optional<OptionDialoguePlugin> optionDialogue = Optional.empty();
private final GnomeAgility gnomeStrongHold = new GnomeAgility(this);
private final WildernessAgility wildernessAgility = new WildernessAgility(this);
private final BarbarianAgility barbarianAgility = new BarbarianAgility(this);
@@ -168,14 +150,6 @@ public abstract class Player {
private DoubleGates doubleGates = new DoubleGates();
public int lastMainFrameInterface = -1; //Possibly used in future to prevent packet exploits
public int getXPRate() { return xpRate; }
public void setXPRate(int xpRate) { this.xpRate = xpRate; }
public String getDiscordCode() { return discordCode; }
public void setDiscordCode(String code) { this.discordCode = code; }
public boolean isPreaching() {
return preaching;
}
@@ -183,9 +157,9 @@ public abstract class Player {
public void setPreaching(boolean preaching) {
this.preaching = preaching;
}
public boolean preaching;
public Compost getCompost() {
return compost;
}
@@ -233,12 +207,12 @@ public abstract class Player {
public ToolLeprechaun getFarmingTools() {
return toolLeprechaun;
}
public LogCuttingInterface getFletching() {
return fletching;
}
public SingleGates getSingleGates() {
return singleGates;
}
@@ -414,7 +388,7 @@ public abstract class Player {
public MageTrainingArena getMageTrainingArena() {
return mageArena;
}
public Trading getTrading() {
return trading;
}
@@ -454,13 +428,13 @@ public abstract class Player {
public Inventory getInventory() {
return inventory;
}
private Inventory inventory = new Inventory(this);
private int tempInteger;
public boolean tempBoolean;
public void setTempInteger(int tempInteger) {
this.tempInteger = tempInteger;
}
@@ -470,17 +444,17 @@ public abstract class Player {
}
public int totalShopItems;
public boolean stopPlayer(boolean stop) {
return (stop ? stopPlayerPacket == true : stopPlayerPacket == false);
}
public long objectDelay;
public long getObjectDelay() {
return (objectDelay);
}
public long setObjectDelay(long delay) {
return (objectDelay = delay);
}
@@ -505,6 +479,26 @@ public abstract class Player {
private Map<Integer, TinterfaceText> interfaceText = new HashMap<Integer, TinterfaceText>();
public DialogueFactoryPlugin getDialogueFactory() {
return this.dialogueFactory;
}
public Optional<DialoguePlugin> getDialogue() {
return this.dialogue;
}
public Optional<OptionDialoguePlugin> getOptionDialogue() {
return this.optionDialogue;
}
public void setDialogue(Optional<DialoguePlugin> dialogue) {
this.dialogue = dialogue;
}
public void setOptionDialogue(Optional<OptionDialoguePlugin> optionDialogue) {
this.optionDialogue = optionDialogue;
}
public class TinterfaceText {
public int id;
public String currentState;
@@ -991,7 +985,7 @@ public abstract class Player {
if (System.currentTimeMillis() - singleCombatDelay2 > 3300) {
underAttackBy2 = 0;
}
if (System.currentTimeMillis() - restoreStatsDelay > 60000) {
restoreStatsDelay = System.currentTimeMillis();
for (int skill = 0; skill < playerLevel.length; skill++) {
@@ -1408,20 +1402,20 @@ public abstract class Player {
restoreStatsDelay, logoutDelay, buryDelay, foodDelay, potDelay,
doorDelay, doubleDoorDelay, buySlayerTimer, lastIncrease,
boneDelay, leverDelay = 0, searchObjectDelay = 0, clickDelay = 0;
public boolean hideYell;
private Npc specialTarget = null;
public void setSpecialTarget(Npc target) {
this.specialTarget = target;
}
public Npc getSpecialTarget() {
return specialTarget;
}
public int miningAxe = -1, woodcuttingAxe = -1;
public boolean initialized, musicOn = true, luthas,
@@ -1705,7 +1699,7 @@ public abstract class Player {
4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 2097152,
8388608, 16777216, 67108864, 134217728 };
/**
* Combat variables
*/
@@ -1723,7 +1717,7 @@ public abstract class Player {
/**
* End
*/
public int clickNpcType, clickObjectType, objectId, objectX,
objectY, npcIndex, npcClickIndex, npcType;
public int pItemX, pItemY, pItemId;
@@ -2140,11 +2134,11 @@ public abstract class Player {
walkingQueueY[wQueueWritePtr] = y;
wQueueWritePtr = next;
}
public boolean checkRangeDistance() {
return (usingRangeWeapon || usingBow);
}
public int gatherRangeDistance(int distance) {
//dart (non long range)
if (usingRangeWeapon && RangeData.usingDart(this) && fightMode != 3) {
@@ -2158,7 +2152,7 @@ public abstract class Player {
//dart, knife, throwing axe (long range)
} else if (usingRangeWeapon && fightMode == 3) {
distance = RangeData.usingDart(this) ? 5 : 6;
//short bow
//short bow
} else if (usingBow && !RangeData.usingLongbow(this)) {
distance = fightMode == 3 ? 7 : 9;
}
@@ -2517,74 +2511,74 @@ public abstract class Player {
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.CAPE] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.CAPE]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.AMULET] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.AMULET]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.WEAPON] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.WEAPON]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.CHEST] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.CHEST]);
} else {
playerProps.writeWord(0x100 + playerAppearance[2]);
}
if (playerEquipment[ItemConstants.SHIELD] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.SHIELD]);
} else {
playerProps.writeByte(0);
}
if (!ItemData.isFullBody(playerEquipment[ItemConstants.CHEST])) {
playerProps.writeWord(0x100 + playerAppearance[3]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.LEGS] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.LEGS]);
} else {
playerProps.writeWord(0x100 + playerAppearance[5]);
}
if (!ItemData.isFullHelm(playerEquipment[ItemConstants.HAT])
&& !ItemData.isFullMask(playerEquipment[ItemConstants.HAT])) {
playerProps.writeWord(0x100 + playerAppearance[1]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.HANDS] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.HANDS]);
} else {
playerProps.writeWord(0x100 + playerAppearance[4]);
}
if (playerEquipment[ItemConstants.FEET] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.FEET]);
} else {
playerProps.writeWord(0x100 + playerAppearance[6]);
}
if (playerAppearance[0] != 1 && !ItemData.isFullMask(playerEquipment[ItemConstants.HAT])) {
playerProps.writeWord(0x100 + playerAppearance[7]);
} else {
playerProps.writeByte(0);
}
} else {//send npc data
playerProps.writeWord(-1);//Tells client that were being a npc
playerProps.writeWord(npcId2);//send NpcID
@@ -17,6 +17,7 @@ import com.rs2.game.content.music.sound.SoundList;
import com.rs2.game.content.randomevents.RandomEventHandler;
import com.rs2.game.content.skills.SkillData;
import com.rs2.game.content.skills.SkillHandler;
import com.rs2.game.content.skills.smithing.Superheat;
import com.rs2.game.items.GameItem;
import com.rs2.game.items.ItemAssistant;
import com.rs2.game.items.ItemConstants;
@@ -94,7 +95,7 @@ public class PlayerAssistant {
public void loginScreen() {
player.getPacketSender().showInterface(15244);
player.getPacketSender().sendString("Welcome to " + GameConstants.SERVER_NAME + " World: " + GameConstants.WORLD + "\\n", 15257);
player.getPacketSender().sendString("Welcome to " + GameConstants.SERVER_NAME + "\\n", 15257);
int currentDay = player.getLastLogin() - player.lastLoginDate;
if (player.playerLevel[GameConstants.HERBLORE] < 3) {
@@ -1832,7 +1833,7 @@ public class PlayerAssistant {
player.getItemAssistant().clearBank();
player.getPlayerAssistant().addStarter();
player.getPlayerAssistant().movePlayer(3233, 3229, 0);
player.getPacketSender().sendMessage("Welcome to @blu@" + GameConstants.SERVER_NAME + " World: " + GameConstants.WORLD + "@bla@ - we are currently in Server Stage v@blu@" + GameConstants.TEST_VERSION + "@bla@.");
player.getPacketSender().sendMessage("Welcome to @blu@" + GameConstants.SERVER_NAME + "@bla@ - we are currently in Server Stage v@blu@" + GameConstants.TEST_VERSION + "@bla@.");
player.getPacketSender().sendMessage("@red@Did you know?@bla@ We're open source and pull requests are welcome!");
player.getPacketSender().sendMessage("Source code: github.com/2006-Scape/2006Scape");
player.getPacketSender().sendMessage("Discord: https://discord.gg/hZ6VfWG");
@@ -2032,11 +2033,7 @@ public class PlayerAssistant {
if (player.tutorialProgress < 36 && player.playerLevel[skill] == 3 && GameConstants.TUTORIAL_ISLAND) {
return false;
}
if (GameConstants.VARIABLE_XP_RATE){
amount *= player.getXPRate();
} else {
amount *= GameConstants.XP_RATE;
}
amount *= GameConstants.XP_RATE;
int oldLevel = getLevelForXP(player.playerXP[skill]);
player.playerXP[skill] += amount;
if (oldLevel < getLevelForXP(player.playerXP[skill])) {
@@ -92,8 +92,6 @@ public class PlayerSave {
case "character-rights":
player.playerRights = Integer.parseInt(token2);
break;
case "xp-rate":
player.xpRate = Integer.parseInt(token2);
case "last-ip":
player.lastConnectedFrom = token2;
break;
@@ -433,9 +431,6 @@ public class PlayerSave {
case "unlocked-bones-to-peaches":
player.unlockedBonesToPeaches = Boolean.parseBoolean(token2);
break;
case "discord-user-id":
player.discordCode = token2;
break;
}
break;
case 3:
@@ -598,8 +593,6 @@ public class PlayerSave {
characterfile.newLine();
characterfile.write("character-rights = " + player.playerRights);
characterfile.newLine();
characterfile.write("xp-rate = " + player.xpRate);
characterfile.newLine();
characterfile.write("last-ip = " + player.connectedFrom);
characterfile.newLine();
characterfile.write("isBot = " + player.isBot);
@@ -826,8 +819,6 @@ public class PlayerSave {
}
characterfile.write("void = " + voidStatus.trim());
characterfile.newLine();
characterfile.write("discord-user-id = " + player.discordCode);
characterfile.newLine();
characterfile.newLine();
/* EQUIPMENT */
@@ -8,12 +8,12 @@ import com.rs2.game.players.PlayerHandler;
public class PlayersOnlineWebsite {
public static String password;
static String password;
private static boolean hasntwared = true;
private static void setWebsitePlayersOnline(int amount) throws IOException {
URL url;
url = new URL(GameConstants.WEBSITE_LINK + "/playersonline.php?pass=" + password + "&amount=" + amount + "&world=" + GameConstants.WORLD);
url = new URL(GameConstants.WEBSITE_LINK + "/playersonline.php?pass=" + password + "&amount=" + amount);
url.openStream().close();
}
@@ -7,12 +7,12 @@ import java.net.URL;
import com.rs2.GameConstants;
public class RegisteredAccsWebsite {
public static String password;
static String password;
private static boolean hasntwarned = true;
private static void setAccountsRegistered(int amount) throws IOException {
URL url;
url = new URL(GameConstants.WEBSITE_LINK + "/accountsregistered.php?pass=" + password + "&amount=" + amount + "&world=" + GameConstants.WORLD);
url = new URL(GameConstants.WEBSITE_LINK + "/accountsregistered.php?pass=" + password + "&amount=" + amount);
url.openStream().close();
}
@@ -0,0 +1,45 @@
package com.rs2.integrations;
import org.json.JSONObject;
import com.rs2.GameEngine;
import com.rs2.integrations.discord.JavaCord;
import java.io.*;
import java.util.stream.Collectors;
public class SettingsLoader {
private static void initialize() {
JSONObject main = new JSONObject();
main
.put("bot-token", "")
.put("websitepass", "")
.put("erssecret", "");
try {
BufferedWriter br = new BufferedWriter(new FileWriter("data/secrets.json"));
br.write(main.toString());
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void loadSettings() throws IOException {
if (!new File("data/secrets.json").exists()) {
initialize();
System.out.println("Please open \"data/secrets.json\" file and enter your discord token bot there!");
System.out.println("Please open \"data/secrets.json\" file and enter your Website Password there!");
} else {
BufferedReader br = new BufferedReader(new FileReader("data/secrets.json"));
String out = br.lines().collect(Collectors.joining("\n"));
JSONObject obj = new JSONObject(out);
JavaCord.token = obj.getString("bot-token");
PlayersOnlineWebsite.password = obj.getString("websitepass");
RegisteredAccsWebsite.password = obj.getString("websitepass");
GameEngine.ersSecret = obj.getString("erssecret");
}
}
}
@@ -1,13 +1,12 @@
package com.rs2.integrations.discord;
import com.rs2.GameConstants;
import com.rs2.integrations.discord.commands.*;
import com.rs2.integrations.discord.commands.admin.*;
import org.javacord.api.DiscordApi;
import org.javacord.api.DiscordApiBuilder;
import org.javacord.api.entity.channel.TextChannel;
import org.javacord.api.entity.message.MessageBuilder;
import org.javacord.api.util.logging.ExceptionLogger;
import com.rs2.integrations.discord.commands.*;
import java.io.IOException;
@@ -18,7 +17,6 @@ import java.io.IOException;
public class JavaCord {
public static String serverName = GameConstants.SERVER_NAME;
public static String commandPrefix = "::w" + GameConstants.WORLD;
public static String token;
public static DiscordApi api = null;
@@ -36,19 +34,19 @@ public class JavaCord {
api.addListener(new Players());
api.addListener(new Vote());
api.addListener(new Website());
//Admin Commands
api.addListener(new AdminCommands());
api.addListener(new GameKick());
api.addListener(new MoveHome());
api.addListener(new Update());
api.addListener(new Pin());
api.addListener(new Purge());
//api.addListener(new Link());
//api.addListener(new WelcomeMessage());
if(!DiscordActivity.playerCount) {
api.updateActivity(GameConstants.WEBSITE_LINK);
}
api.addMessageCreateListener(event -> {
if (event.getMessageContent().startsWith("::movehome")) {
if (event.getMessageAuthor().isServerAdmin()) {
System.out.println("perms");
event.getChannel().sendMessage("perms");
} else {
event.getChannel().sendMessage("You do not have permission to preform this command");
}
}
});
} catch (Exception e) {
@@ -1,16 +0,0 @@
package com.rs2.integrations.discord;
import com.rs2.GameConstants;
import org.javacord.api.event.server.member.ServerMemberJoinEvent;
import org.javacord.api.listener.server.member.ServerMemberJoinListener;
public class WelcomeMessage implements ServerMemberJoinListener {
@Override
public void onServerMemberJoin(ServerMemberJoinEvent event) {
String welcomeMessageChannel = "655143683083206667";
if (GameConstants.WORLD == 1) {
event.getApi().getTextChannelById(welcomeMessageChannel).get().
sendMessage("Hello " + event.getUser().getMentionTag() + " And Welcome To " + JavaCord.serverName + ".");
}
}
}
@@ -1,6 +1,5 @@
package com.rs2.integrations.discord.commands;
import com.rs2.integrations.discord.JavaCord;
import org.javacord.api.entity.message.Message;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
@@ -9,18 +8,18 @@ public class Commands implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " commands")) {
if (message.getContent().equalsIgnoreCase("::commands")) {
event.getChannel().sendMessage("```fix"
+ System.lineSeparator() +
"::forum/::forums"
+ System.lineSeparator() +
JavaCord.commandPrefix + " gamekick(if account id linked)"
+ System.lineSeparator() +
JavaCord.commandPrefix + " hiscores/" + JavaCord.commandPrefix + " highscores"
"::hiscores/::highscores"
+ System.lineSeparator() +
"::issues/::bugs"
+ System.lineSeparator() +
JavaCord.commandPrefix + " online"
"::online"
+ System.lineSeparator() +
"::players"
+ System.lineSeparator() +
"::vote"
+ System.lineSeparator() +
@@ -11,9 +11,7 @@ public class Forum implements MessageCreateListener {
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase("::forum") || message.getContent().equalsIgnoreCase("::forums")) {
if (GameConstants.WORLD == 1) {
event.getChannel().sendMessage(GameConstants.WEBSITE_LINK + "/forums/index.php");
}
event.getChannel().sendMessage(GameConstants.WEBSITE_LINK + "/forums/index.php");
}
}
}
@@ -1,6 +1,5 @@
package com.rs2.integrations.discord.commands;
import com.rs2.integrations.discord.JavaCord;
import org.javacord.api.entity.message.Message;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
@@ -11,7 +10,7 @@ public class Hiscores implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " hiscores") || message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " highscores")) {
if (message.getContent().equalsIgnoreCase("::hiscores") || message.getContent().equalsIgnoreCase("::highscores")) {
event.getChannel().sendMessage(GameConstants.WEBSITE_LINK + "/hiscores.html");
}
}
@@ -1,6 +1,5 @@
package com.rs2.integrations.discord.commands;
import com.rs2.GameConstants;
import org.javacord.api.entity.message.Message;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
@@ -10,9 +9,7 @@ public class Issues implements MessageCreateListener {
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase("::issues") || message.getContent().equalsIgnoreCase("::bugs")) {
if (GameConstants.WORLD == 1) {
event.getChannel().sendMessage("https://github.com/2006-Scape/2006Scape/issues");
}
event.getChannel().sendMessage("https://github.com/2006-Scape/2006Scape/issues");
}
}
}
@@ -1,6 +1,5 @@
package com.rs2.integrations.discord.commands;
import com.rs2.GameConstants;
import org.javacord.api.entity.message.Message;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
@@ -11,8 +10,8 @@ public class Online implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " online")) {
event.getChannel().sendMessage(":tada: " + JavaCord.serverName + " World:" + GameConstants.WORLD + " is Online! :tada:");
if (message.getContent().equalsIgnoreCase("::online")) {
event.getChannel().sendMessage(":tada: " + JavaCord.serverName + " is Online! :tada:");
}
}
}
@@ -1,16 +1,16 @@
package com.rs2.integrations.discord.commands;
import com.rs2.game.players.PlayerHandler;
import com.rs2.integrations.discord.JavaCord;
import org.javacord.api.entity.message.Message;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
import com.rs2.game.players.PlayerHandler;
public class Players implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " players")) {
if (message.getContent().equalsIgnoreCase("::players")) {
if (PlayerHandler.getPlayerCount() != 1) {
event.getChannel().sendMessage("There are currently " + PlayerHandler.getPlayerCount() + " players online (" + PlayerHandler.getNonPlayerCount() + " staff online).");
} else {
@@ -11,9 +11,7 @@ public class Vote implements MessageCreateListener {
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase("::vote")) {
if (GameConstants.WORLD == 1) {
event.getChannel().sendMessage("Visit " + GameConstants.WEBSITE_LINK + "/vote.html then type \"::claimvote\" in-game to receive your reward!");
}
}
}
}
@@ -11,9 +11,7 @@ public class Website implements MessageCreateListener {
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase("::website") || message.getContent().equalsIgnoreCase("::site")) {
if (GameConstants.WORLD == 1) {
event.getChannel().sendMessage(GameConstants.WEBSITE_LINK);
}
event.getChannel().sendMessage(GameConstants.WEBSITE_LINK);
}
}
}
@@ -1,31 +0,0 @@
package com.rs2.integrations.discord.commands.admin;
import com.rs2.integrations.discord.JavaCord;
import org.javacord.api.entity.message.Message;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
public class AdminCommands implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " admincommands")) {
if (event.getMessageAuthor().isServerAdmin()) {
event.getChannel().sendMessage("```fix"
+ System.lineSeparator() +
"::pin/::unpin(Pins/Un-Pins The Replied Mesage)"
+ System.lineSeparator() +
"::purge(Purges The Specified Amount Of Messages From Discord Channel)"
+ System.lineSeparator() +
JavaCord.commandPrefix + " gamekick(Kicks The Specified Player From The GameServer)"
+ System.lineSeparator() +
JavaCord.commandPrefix + " movehome(Moves The Specified Player To Lumbridge)"
+ System.lineSeparator() +
JavaCord.commandPrefix + " update(Triggers A GameServer Update In The Specified Amount Of Seconds)"
+ "```");
} else {
event.getChannel().sendMessage("You do not have permission to perform this command");
}
}
}
}
@@ -1,34 +0,0 @@
package com.rs2.integrations.discord.commands.admin;
import com.rs2.game.players.Client;
import com.rs2.game.players.Player;
import com.rs2.game.players.PlayerHandler;
import com.rs2.integrations.discord.JavaCord;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
import java.util.Objects;
public class GameKick implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
if (event.getMessageContent().startsWith(JavaCord.commandPrefix + " gamekick")) {
String playerToKick = event.getMessageContent().replace( JavaCord.commandPrefix + " gamekick ", "");
for (Player player2 : PlayerHandler.players) {
if (player2 != null) {
if (player2.playerName.equalsIgnoreCase(playerToKick)) {
Client c2 = (Client) player2;
if (event.getMessageAuthor().isServerAdmin() || Objects.equals(event.getMessageAuthor().getIdAsString(), c2.discordCode)) {
event.getChannel().sendMessage(playerToKick + " was kicked by " + event.getMessageAuthor().getDisplayName() + ".");
c2.disconnected = true;
c2.logout(true);
} else {
event.getChannel().sendMessage("You do not have permission to perform this command");
}
break;
}
}
}
}
}
}
@@ -1,31 +0,0 @@
package com.rs2.integrations.discord.commands.admin;
import com.rs2.GameConstants;
import com.rs2.game.players.Client;
import com.rs2.game.players.PlayerHandler;
import com.rs2.integrations.discord.JavaCord;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
public class MoveHome implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
if (event.getMessageContent().startsWith(JavaCord.commandPrefix + " movehome")) {
if (event.getMessageAuthor().isServerAdmin()) {
String teleToMe = event.getMessageContent().replace( JavaCord.commandPrefix + " movehome ", "");
for (int i = 0; i < PlayerHandler.players.length; i++) {
if (PlayerHandler.players[i] != null) {
if (PlayerHandler.players[i].playerName.equalsIgnoreCase(teleToMe)) {
Client p = (Client) PlayerHandler.players[i];
event.getChannel().sendMessage(p.playerName + " has been moved to Lumbridge.");
p.getPlayerAssistant().movePlayer(GameConstants.RESPAWN_X, GameConstants.RESPAWN_Y, 0);
}
}
}
} else {
event.getChannel().sendMessage("You do not have permission to perform this command");
}
}
}
}
@@ -1,39 +0,0 @@
package com.rs2.integrations.discord.commands.admin;
import com.rs2.GameConstants;
import org.javacord.api.entity.message.Message;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
public class Pin implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().startsWith("::pin")) {
if (event.getMessageAuthor().isServerAdmin()) {
if(GameConstants.WORLD == 1) {
if (message.getReferencedMessage().isPresent()) {
Message messageToPin = message.getReferencedMessage().get();
messageToPin.pin();
}
}
} else {
event.getChannel().sendMessage("You do not have permission to perform this command");
}
}
if (message.getContent().startsWith("::unpin")) {
if (event.getMessageAuthor().isServerAdmin()) {
if(GameConstants.WORLD == 1) {
if (message.getReferencedMessage().isPresent()) {
Message messageToUnpin = message.getReferencedMessage().get();
messageToUnpin.unpin();
event.getChannel().sendMessage("Un-Pinned Message: " + messageToUnpin.getLink());
}
}
} else {
event.getChannel().sendMessage("You do not have permission to perform this command");
}
}
}
}
@@ -1,40 +0,0 @@
package com.rs2.integrations.discord.commands.admin;
import com.rs2.GameConstants;
import org.javacord.api.entity.message.Message;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
public class Purge implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
Message message = event.getMessage();
if (message.getContent().startsWith("::purge")) {
if (event.getMessageAuthor().isServerAdmin()) {
if(GameConstants.WORLD == 1) {
int messagesToPurge = Integer.parseInt(event.getMessageContent().replace("::purge ", ""));
if (messagesToPurge > 50) {
event.getChannel().sendMessage("Can't purge more than 50 messages at once.");
return;
}
try {
event.getChannel().sendMessage("Purging " + messagesToPurge + " Messages.");
message.getMessagesBefore(messagesToPurge).get().deleteAll();
Message Purge = message.getMessagesAfter(1).get().getNewestMessage().get();
Purge.edit("Purged " + messagesToPurge + " Messages.");
TimeUnit.SECONDS.sleep(5);
message.delete();
Purge.delete();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
} else {
event.getChannel().sendMessage("You do not have permission to perform this command");
}
}
}
}
@@ -1,24 +0,0 @@
package com.rs2.integrations.discord.commands.admin;
import com.rs2.game.players.PlayerHandler;
import com.rs2.integrations.discord.JavaCord;
import org.javacord.api.event.message.MessageCreateEvent;
import org.javacord.api.listener.message.MessageCreateListener;
public class Update implements MessageCreateListener {
@Override
public void onMessageCreate(MessageCreateEvent event) {
String seconds = event.getMessageContent().replace(JavaCord.commandPrefix + " update ", "");
if (event.getMessageContent().startsWith(JavaCord.commandPrefix + " update")) {
if (event.getMessageAuthor().isServerAdmin()) {
PlayerHandler.updateSeconds = Integer.parseInt(seconds);
PlayerHandler.updateAnnounced = false;
PlayerHandler.updateRunning = true;
PlayerHandler.updateStartTime = System.currentTimeMillis();
event.getChannel().sendMessage("Server update will begin in " + seconds + " seconds.");
} else {
event.getChannel().sendMessage("You do not have permission to perform this command");
}
}
}
}
@@ -116,7 +116,7 @@ public class PacketSender {
if (player.tutorialProgress > 35) {
player.getPlayerAssistant().sendSidebars();
Weight.updateWeight(player);
player.getPacketSender().sendMessage("Welcome to @blu@" + GameConstants.SERVER_NAME + " World: " + GameConstants.WORLD + "@bla@ - we are currently in Server Stage v@blu@" + GameConstants.TEST_VERSION + "@bla@.");
player.getPacketSender().sendMessage("Welcome to @blu@" + GameConstants.SERVER_NAME + "@bla@ - we are currently in Server Stage v@blu@" + GameConstants.TEST_VERSION + "@bla@.");
player.getPacketSender().sendMessage("@red@Did you know?@bla@ We're open source! Pull requests are welcome");
player.getPacketSender().sendMessage("Source code at github.com/2006-Scape/2006Scape");
player.getPacketSender().sendMessage("Join our Discord: https://discord.gg/hZ6VfWG");
@@ -1,7 +1,7 @@
package com.rs2.net.packets;
import com.rs2.GameConstants;
import com.rs2.game.dialogues.Dialogue;
import com.rs2.net.packets.impl.DialoguePacket;
import com.rs2.game.players.Player;
import com.rs2.net.packets.impl.AttackPlayer;
import com.rs2.net.packets.impl.Bank10;
@@ -73,7 +73,7 @@ public class PacketHandler {
packetId[150] = u;
packetId[120] = new ClickTab();
packetId[14] = new ItemOnPlayer();
packetId[40] = new Dialogue();
packetId[40] = new DialoguePacket();
ClickObject co = new ClickObject();
packetId[132] = co;
packetId[252] = co;
@@ -8,6 +8,7 @@ import com.rs2.Connection;
import com.rs2.GameConstants;
import com.rs2.GameEngine;
import com.rs2.game.bots.BotHandler;
import com.rs2.game.content.combat.magic.SpellTeleport;
import com.rs2.game.npcs.NpcHandler;
import com.rs2.game.players.*;
import com.rs2.game.players.antimacro.AntiSpam;
@@ -44,39 +45,6 @@ public class Commands implements PacketType {
public static void playerCommands(Player player, String playerCommand, String[] arguments) {
switch (playerCommand.toLowerCase()) {
case "link":
player.setDiscordCode(arguments[0]);
player.getPacketSender().sendMessage("Your Account has now been linked with Discord User ID:");
player.getPacketSender().sendMessage(player.getDiscordCode());
break;
case "myxprate":
case "checkxprate":
if(GameConstants.VARIABLE_XP_RATE) {
player.getPacketSender().sendMessage("Your current XP rate is x" + player.getXPRate());
break;
}
case "xprate":
if(GameConstants.VARIABLE_XP_RATE) {
if (player.getXPRate() == GameConstants.VARIABLE_XP_RATES[0]) {
player.getDialogueHandler().sendDialogues(10005, 2244);
return;
} else if (player.getXPRate() == GameConstants.VARIABLE_XP_RATES[1]) {
player.getDialogueHandler().sendDialogues(10006, 2244);
return;
} else if (player.getXPRate() == GameConstants.VARIABLE_XP_RATES[2]) {
player.getDialogueHandler().sendDialogues(10007, 2244);
return;
} else if (player.getXPRate() == GameConstants.VARIABLE_XP_RATES[3]) {
player.getPacketSender().sendMessage("You already have the highest XP rate.");
return;
} else {
player.getDialogueHandler().sendDialogues(10001, 2244);
return;
}
} else {
player.getPacketSender().sendMessage("You can't use this command in this world.");
}
break;
case "toggleyell":
case "tglyell":
case "hideyell":
@@ -289,6 +257,9 @@ public class Commands implements PacketType {
"::loc, ::pos, ::coord",
"Get your current world position",
"",
"::stuck",
"Return to Lumbridge when stuck",
"",
"::randomtoggle",
"Enable/Disable random events",
"",
@@ -309,8 +280,6 @@ public class Commands implements PacketType {
"",
"::snow",
"Add some snow in your mainscreen(works only in december)",
(GameConstants.VARIABLE_XP_RATE ? "\\n" + "::xprate\\n" + "Opens dialogue for the player to set/increase their XP rate." : ""),
(GameConstants.VARIABLE_XP_RATE ? "\\n" + "::checkxprate(::myxprate)\\n" + "Displays the players currently set XP rate." : ""),
};
// Clear all lines
@@ -325,6 +294,17 @@ public class Commands implements PacketType {
}
player.getPacketSender().showInterface(8134);
break;
case "stuck":
if (player.getCombatAssistant().inCombat()) {
player.getPacketSender().sendMessage("You cannot do that while in combat.");
return;
}
player.getPlayerAssistant().movePlayer(SpellTeleport.LUMBRIDGE.getDestX(), SpellTeleport.LUMBRIDGE.getDestY(), 0);
player.getPacketSender().sendMessage("How did you manage that one...");
player.getPacketSender().sendMessage("If it's bug related, please report on Github/Discord!");
player.gfx100(80);
player.startAnimation(404);
break;
case "randomtoggle":
case "togglerandom":
case "random":
@@ -0,0 +1,28 @@
package com.rs2.net.packets.impl;
import com.rs2.game.players.Player;
import com.rs2.net.packets.PacketType;
/**
* Dialogue Packet
**/
public class DialoguePacket implements PacketType {
@Override
public void processPacket(Player player, int packetType, int packetSize) {
/*
TODO: Remove the below dialogue handler code when everything has been converted over
to the new system. Expect to see flickering in some Astraeus Dialogues as the old
dialogue handler activates before it.
*/
if (player.nextChat > 0) {
player.getDialogueHandler().sendDialogues(player.nextChat, player.talkingNpc);
} else {
player.getDialogueHandler().sendDialogues(0, -1);
}
// New Dialogue System
player.getDialogueFactory().execute();
}
}
@@ -5,27 +5,33 @@ import java.util.ArrayList;
public class Misc {
/*
* String Functions
*/
public static final char playerNameXlateTable[] = { '_', 'a', 'b', 'c',
'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',
'3', '4', '5', '6', '7', '8', '9', '[', ']', '/', '-', ' '
};
public static char xlateTable[] = { ' ', 'e', 't', 'a', 'o', 'i', 'h', 'n',
's', 'r', 'd', 'l', 'u', 'm', 'w', 'c', 'y', 'f', 'g', 'p', 'b',
'v', 'k', 'x', 'j', 'q', 'z', '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', ' ', '!', '?', '.', ',', ':', ';', '(', ')', '-',
'&', '*', '\\', '\'', '@', '#', '+', '=', '\243', '$', '%', '"',
'[', ']'
};
public static String formatPlayerName(String str) {
str = ucFirst(str);
str.replace("_", " ");
return str;
}
public static int random(final float range) {
return (int) (java.lang.Math.random() * (range + 1));
}
// return a random number from 0 range - 1
public static int randomMinusOne(int range) {
return (int) Math.random() * range;
}
public static double distance(int x1, int y1, int x2, int y2 ) {
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
}
public static boolean goodDistance(int objectX, int objectY, int playerX, int playerY, int distance) {
return objectX - playerX <= distance && objectX - playerX >= -distance && objectY - playerY <= distance && objectY - playerY >= -distance;
public static String format(int num) {
return NumberFormat.getInstance().format(num);
}
public static String longToReportPlayerName(long l) {
@@ -39,14 +45,6 @@ public class Misc {
return new String(ac, 12 - i, i);
}
public static int random3(int range) {
return (int) (java.lang.Math.random() * range);
}
public static int randomNumber(int range) {
return (int) (Math.random() * range);
}
public static String longToPlayerName(long l) {
int i = 0;
char ac[] = new char[12];
@@ -60,11 +58,6 @@ public class Misc {
return new String(ac, 12 - i, i);
}
public static final char playerNameXlateTable[] = { '_', 'a', 'b', 'c',
'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',
'3', '4', '5', '6', '7', '8', '9', '[', ']', '/', '-', ' ' };
public static String longToPlayerName2(long l) {
int i = 0;
char ac[] = new char[99];
@@ -76,10 +69,6 @@ public class Misc {
return new String(ac, 12 - i, i);
}
public static String format(int num) {
return NumberFormat.getInstance().format(num);
}
public static String ucFirst(String str) {
str = str.toLowerCase();
if (str.length() > 1) {
@@ -124,63 +113,6 @@ public class Misc {
}
return temp.toUpperCase().trim();
}
public static int hexToInt(byte data[], int offset, int len) {
int temp = 0;
int i = 1000;
for (int cntr = 0; cntr < len; cntr++) {
int num = (data[offset + cntr] & 0xFF) * i;
temp += num;
if (i > 1) {
i = i / 1000;
}
}
return temp;
}
public static int random2(int range) {
return (int) (java.lang.Math.random() * range + 1);
}
// return a random number from 0 range (including range)
public static int random(int range) {
return (int) (java.lang.Math.random() * (++range));
}
// return a random number between & including the min/max values
public static int random(int min, int max) {
++max;
return (int) Math.floor(Math.random() * (max - min)) + min;
}
public static int randomArrayItem(int[] arr) {
return arr[(int) Math.floor(Math.random() * arr.length)];
}
public static int randomArrayListItem(ArrayList<Integer> arr) {
int index = (int) Math.floor(Math.random() * arr.size());
return arr.get(index);
}
public static long playerNameToInt64(String s) {
long l = 0L;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
l *= 37L;
if (c >= 'A' && c <= 'Z') {
l += 1 + c - 65;
} else if (c >= 'a' && c <= 'z') {
l += 1 + c - 97;
} else if (c >= '0' && c <= '9') {
l += 27 + c - 48;
}
}
while (l % 37L == 0L && l != 0L) {
l /= 37L;
}
return l;
}
private static char decodeBuf[] = new char[4096];
public static String textUnpack(byte packedData[], int size) {
@@ -258,12 +190,126 @@ public class Misc {
}
}
public static char xlateTable[] = { ' ', 'e', 't', 'a', 'o', 'i', 'h', 'n',
's', 'r', 'd', 'l', 'u', 'm', 'w', 'c', 'y', 'f', 'g', 'p', 'b',
'v', 'k', 'x', 'j', 'q', 'z', '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', ' ', '!', '?', '.', ',', ':', ';', '(', ')', '-',
'&', '*', '\\', '\'', '@', '#', '+', '=', '\243', '$', '%', '"',
'[', ']' };
public static String capitalize(String s) {
for (int i = 0; i < s.length(); i++) {
if (i == 0) {
s = String.format("%s%s", Character.toUpperCase(s.charAt(0)),
s.substring(1));
}
if (!Character.isLetterOrDigit(s.charAt(i))) {
if (i + 1 < s.length()) {
s = String.format("%s%s%s", s.subSequence(0, i + 1), Character.toUpperCase(s.charAt(i + 1)), s.substring(i + 2));
}
}
}
return s;
}
/*
* Number Functions
*/
public static int hexToInt(byte data[], int offset, int len) {
int temp = 0;
int i = 1000;
for (int cntr = 0; cntr < len; cntr++) {
int num = (data[offset + cntr] & 0xFF) * i;
temp += num;
if (i > 1) {
i = i / 1000;
}
}
return temp;
}
public static long playerNameToInt64(String s) {
long l = 0L;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
l *= 37L;
if (c >= 'A' && c <= 'Z') {
l += 1 + c - 65;
} else if (c >= 'a' && c <= 'z') {
l += 1 + c - 97;
} else if (c >= '0' && c <= '9') {
l += 27 + c - 48;
}
}
while (l % 37L == 0L && l != 0L) {
l /= 37L;
}
return l;
}
/*
* Random Number Generator Functions
*/
// return a random number from 0 range (including range)
public static int random(int range) {
return (int) (java.lang.Math.random() * (++range));
}
// return a random number between & including the min/max values
public static int random(int min, int max) {
++max;
return (int) Math.floor(Math.random() * (max - min)) + min;
}
public static int random(final float range) {
return (int) (java.lang.Math.random() * (range + 1));
}
public static int random2(int range) {
return (int) (java.lang.Math.random() * range + 1);
}
public static int random3(int range) {
return (int) (java.lang.Math.random() * range);
}
public static int randomNumber(int range) {
return (int) (Math.random() * range);
}
// return a random number from 0 range - 1
public static int randomMinusOne(int range) {
return (int) Math.random() * range;
}
public static int randomArrayItem(int[] arr) {
return arr[(int) Math.floor(Math.random() * arr.length)];
}
public static int randomArrayListItem(ArrayList<Integer> arr) {
int index = (int) Math.floor(Math.random() * arr.size());
return arr.get(index);
}
/*
* Positioning Functions
*/
public static byte directionDeltaX[] = new byte[] { 0, 1, 1, 1, 0, -1, -1, -1 };
public static byte directionDeltaY[] = new byte[] { 1, 1, 0, -1, -1, -1, 0, 1 };
public static byte xlateDirectionToClient[] = new byte[] { 1, 2, 4, 7, 6, 5, 3, 0 };
public static double distance(int x1, int y1, int x2, int y2 ) {
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
}
public static boolean goodDistance(int objectX, int objectY, int playerX, int playerY, int distance) {
return objectX - playerX <= distance && objectX - playerX >= -distance && objectY - playerY <= distance && objectY - playerY >= -distance;
}
public static int[] delta(int x1, int y1, int x2, int y2) {
return new int[] {x2 - x1, y2 - y1};
@@ -296,24 +342,4 @@ public class Misc {
* changeY == directionDeltaY[j]) return j; } return -1;
*/
}
public static byte directionDeltaX[] = new byte[] { 0, 1, 1, 1, 0, -1, -1, -1 };
public static byte directionDeltaY[] = new byte[] { 1, 1, 0, -1, -1, -1, 0, 1 };
public static byte xlateDirectionToClient[] = new byte[] { 1, 2, 4, 7, 6,
5, 3, 0 };
public static String capitalize(String s) {
for (int i = 0; i < s.length(); i++) {
if (i == 0) {
s = String.format("%s%s", Character.toUpperCase(s.charAt(0)),
s.substring(1));
}
if (!Character.isLetterOrDigit(s.charAt(i))) {
if (i + 1 < s.length()) {
s = String.format("%s%s%s", s.subSequence(0, i + 1), Character.toUpperCase(s.charAt(i + 1)), s.substring(i + 2));
}
}
}
return s;
}
}
+4
View File
@@ -0,0 +1,4 @@
/bin/
*.iml
/target/
file_server-1.0-jar-with-dependencies.jar
Binary file not shown.
Binary file not shown.
Binary file not shown.
+118
View File
@@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>2006Scape</artifactId>
<groupId>com.rs2</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>file_server</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<repositories>
<repository>
<id>libs-local</id>
<name>libs</name>
<url>file://${project.basedir}/libs</url>
</repository>
</repositories>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.mina/mina-core -->
<dependency>
<groupId>org.apache.mina</groupId>
<artifactId>mina-core</artifactId>
<version>1.1.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.netty/netty -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>3.6.6.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.5.8</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.17</version>
</dependency>
<dependency>
<groupId>javac</groupId>
<artifactId>javac</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/javac++.jar</systemPath>
</dependency>
<dependency>
<groupId>org.xmlpull.v1</groupId>
<artifactId>xpp3</artifactId>
<version>1.1.4c</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/xpp3-1.1.4c.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>org.apollo.jagcached.FileServer</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
+6
View File
@@ -0,0 +1,6 @@
echo This is meant to be run by the live server admin! You probably don\'t want to do this!
for i in {0..50}
do
cp target/file_server-1.0-jar-with-dependencies.jar ./fserver.jar
java -jar fserver.jar
done
@@ -14,7 +14,7 @@ public final class Constants {
/**
* The directory of the file system.
*/
public static final String FILE_SYSTEM_DIR = "./data/cache/";
public static final String FILE_SYSTEM_DIR = "./cache/";
/**
* Default private constructor to prevent instantiation.
@@ -69,15 +69,14 @@ public final class FileServer {
* @throws Exception if an error occurs.
*/
public void start() throws Exception {
if (!new File(Constants.FILE_SYSTEM_DIR).exists())
if (!new File("cache").exists())
{
System.out.println("Working Directory = " + System.getProperty("user.dir"));
System.out.println("************************************");
System.out.println("************************************");
System.out.println("************************************");
System.out.println("WARNING: I could not find the data/cache folder. You are LIKELY running this in the wrong directory!");
System.out.println("In IntelliJ, fix it by clicking \"GameEngine\" > Edit Configurations at the top of your screen");
System.out.println("Then changing the \"Working Directory\" to be in \"2006Scape/2006Scape Server\", instead of just \"2006Scape\"");
System.out.println("WARNING: I could not find the /cache folder. You are LIKELY running this in the wrong directory!");
System.out.println("In IntelliJ, fix it by clicking \"FileServer\" > Edit Configurations at the top of your screen");
System.out.println("Then changing the \"Working Directory\" to be in \"2006Scape/2006Scape file_server\", instead of just \"2006Scape\"");
System.out.println("************************************");
System.out.println("************************************");
System.out.println("************************************");

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