From e1a8d854087317ed7f9eafb43a125ffe54f1e26f Mon Sep 17 00:00:00 2001 From: Josh Shippam Date: Fri, 31 Dec 2021 03:47:48 +0000 Subject: [PATCH] Second World Setup (#518) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Start Setting Up Second World Added World Number To Login Message Added World Number To Login Interface Made World 2 Listen On Different Port Made Client Connect To 43597 For World 2 * Small Cleanup For World 2 Support Calculate Port For World Based On World Number Use Existing World int For World In Server * Woops Wrong Ports * Set Server Port After Loading Config * Add xpRate Var & Include With XPRate Calculations * Add -w/-world arg to client * Add XP Rate Multiplier For Non-Bot Worlds * More Multi World Stuff Update Integrations(Discord Bot/Website Stuff) For Multiple Worlds Added More XP Rate Dialogue Stuff * Add Kick Command To Discord Bot & Fix Type In ConfigLoader * Create/Use commandPrefix Var For Discord Bot * Small Fixup For World 2 Renamed BOT_WORLD to VARIABLE_XP_RATE Fixed Dialogue/Message grammar Added a check for VARIABLE_XP_RATES to ::xprate command * More Discord Commands(GameKick, MoveHome & Update) *GameKick kicks A player if their client froze but acc stayed logged in *MoveHome removes the need for ::stuck which removes potential for abuse *Update schedules A server update * Minor fixup * 43597 → 43598 * Fix XP Rate Multiplier & add ::xprate to cooamnds list if enabled * Use Either VARIABLE_SKILL_RATE OR XP_RATE Not Both TODO(Convert Player.xpRate Into An Array For Easier Rate Changes) * Create/Use PLAYER_XP_RATES For Easier Rate Changes * Fixed Abusive Client Command Privileges & Added myxprate/checkxprate * Allow Loading VARIABLE_XP_RATES & PLAYER_XP_RATES From Config * Properly Update Client Title Logo If The Cache Has Already Been Downloaded You Will Need To Delete It & Let The Client ReDownload It * Fix Cache CRC Checks For The Client(Allows Cache To Actually Check For Updates) * Add -no-crc & -dev Arguments To Client * Fix Naming For Some Vars * Make CHECK_CRC Description More Descriptive * Fix More Var Descriptions * Cleanup Unused GameConstants Vars & Add More Vars To ConfigLoader Co-authored-by: Danial --- .../src/main/java/ClientSettings.java | 20 ++++- 2006Scape Client/src/main/java/Game.java | 51 +++++++----- 2006Scape Client/src/main/java/Main.java | 17 +++- 2006Scape Server/ServerConfig.Sample.json | 7 +- .../data/cache/main_file_cache.dat | Bin 19833119 -> 19833119 bytes .../data/cache/main_file_cache.idx0 | Bin 54 -> 54 bytes 2006Scape Server/data/discord.json | 1 - .../src/main/java/com/rs2/ConfigLoader.java | 17 +++- .../src/main/java/com/rs2/GameConstants.java | 29 +++---- .../src/main/java/com/rs2/GameEngine.java | 5 +- .../rs2/game/dialogues/DialogueHandler.java | 40 ++++++++- .../rs2/game/dialogues/DialogueOptions.java | 74 ++++++++++++++++- .../java/com/rs2/game/players/Player.java | 77 ++++++++++-------- .../com/rs2/game/players/PlayerAssistant.java | 11 ++- .../java/com/rs2/game/players/PlayerSave.java | 4 + .../integrations/PlayersOnlineWebsite.java | 2 +- .../integrations/RegisteredAccsWebsite.java | 2 +- .../rs2/integrations/discord/JavaCord.java | 19 ++--- .../discord/commands/Commands.java | 17 ++-- .../integrations/discord/commands/Forum.java | 3 +- .../discord/commands/Hiscores.java | 3 +- .../integrations/discord/commands/Issues.java | 3 +- .../integrations/discord/commands/Online.java | 5 +- .../discord/commands/Players.java | 6 +- .../integrations/discord/commands/Vote.java | 3 +- .../discord/commands/Website.java | 3 +- .../discord/commands/admin/GameKick.java | 32 ++++++++ .../discord/commands/admin/MoveHome.java | 31 +++++++ .../discord/commands/admin/Update.java | 24 ++++++ .../main/java/com/rs2/net/PacketSender.java | 2 +- .../com/rs2/net/packets/impl/Commands.java | 45 ++++++---- docker-compose.yml | 2 +- 32 files changed, 406 insertions(+), 149 deletions(-) delete mode 100644 2006Scape Server/data/discord.json create mode 100644 2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/GameKick.java create mode 100644 2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/MoveHome.java create mode 100644 2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/Update.java diff --git a/2006Scape Client/src/main/java/ClientSettings.java b/2006Scape Client/src/main/java/ClientSettings.java index 13e1b682..34fade5b 100644 --- a/2006Scape Client/src/main/java/ClientSettings.java +++ b/2006Scape Client/src/main/java/ClientSettings.java @@ -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,12 +18,24 @@ 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 = "www.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; + /** * The Npc Bits for the Server */ diff --git a/2006Scape Client/src/main/java/Game.java b/2006Scape Client/src/main/java/Game.java index b4ec8421..83fb46e0 100644 --- a/2006Scape Client/src/main/java/Game.java +++ b/2006Scape Client/src/main/java/Game.java @@ -25,6 +25,7 @@ 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 @@ -3429,11 +3430,12 @@ public class Game extends RSApplet { } } catch (Exception _ex) { } - if (abyte0 != null) { - // aCRC32_930.reset(); - // aCRC32_930.update(abyte0); - // int i1 = (int)aCRC32_930.getValue(); - // if(i1 != j) + 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) { StreamLoader streamLoader = new StreamLoader(abyte0); @@ -3480,12 +3482,20 @@ public class Game extends RSApplet { } catch (Exception _ex) { decompressors[0] = null; } - /* - * 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; } } - */ + + 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; + } + } + } catch (IOException ioexception) { if (s2.equals("Unknown error")) { s2 = "Connection error"; @@ -5021,12 +5031,12 @@ public class Game extends RSApplet { if (inputString.equals("::gfxtgl") || inputString.equals("::tglgfx") || inputString.equals("::togglerender") || inputString.equals("::togglegfx")) { graphicsEnabled = !graphicsEnabled; } - 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 (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 (inputString.equals("::clientdrop")) { dropClient(); } @@ -5060,6 +5070,7 @@ public class Game extends RSApplet { onDemandFetcher.method563((byte) 1, 2, j1); } } + } if (inputString.startsWith("::dd")) { String[] args = inputString.split(" "); int distance = 25; @@ -5078,7 +5089,6 @@ public class Game extends RSApplet { if (inputString.equals("::dataon")) { showInfo = !showInfo; } - } if (inputString.startsWith("::")) { stream.createFrame(103); stream.writeWordBigEndian(inputString.length() - 1); @@ -5927,7 +5937,7 @@ public class Game extends RSApplet { loginMessage2 = "Connecting to server..."; drawLoginScreen(true); } - socketStream = new RSSocket(this, openSocket(43594 + portOff)); + socketStream = new RSSocket(this, openSocket((ClientSettings.SERVER_WORLD == 1) ? 43594 : 43596 + ClientSettings.SERVER_WORLD + portOff)); long l = TextClass.longForName(s); int i = (int) (l >> 16 & 31L); stream.currentOffset = 0; @@ -12046,8 +12056,9 @@ 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; diff --git a/2006Scape Client/src/main/java/Main.java b/2006Scape Client/src/main/java/Main.java index bde63f3f..4c599152 100644 --- a/2006Scape Client/src/main/java/Main.java +++ b/2006Scape Client/src/main/java/Main.java @@ -8,10 +8,7 @@ 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) { @@ -25,6 +22,16 @@ public final class Main { case "-ip": ClientSettings.SERVER_IP = args[++i]; break; + case "-no-crc": + case "-no-cache-crc": + ClientSettings.CHECK_CRC = false; + break; + case "-dev" : + case "-local": + case "-offline": + ClientSettings.SERVER_IP = "localhost"; + ClientSettings.CHECK_CRC = false; + break; } } } @@ -45,6 +52,10 @@ public final class Main { case "-password": game.myPassword = args[++i]; break; + case "-w": + case "-world": + ClientSettings.SERVER_WORLD = Integer.parseInt(args[++i]); + break; } } } diff --git a/2006Scape Server/ServerConfig.Sample.json b/2006Scape Server/ServerConfig.Sample.json index 019ddbb7..9ac53e36 100644 --- a/2006Scape Server/ServerConfig.Sample.json +++ b/2006Scape Server/ServerConfig.Sample.json @@ -4,6 +4,9 @@ "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, @@ -15,6 +18,6 @@ "save_timer": 120, "timeout": 60, "item_requirements": true, - "xp_rate": 1.0, - "max_players": 200 + "max_players": 200, + "website_total_characters_integration": false } \ No newline at end of file diff --git a/2006Scape Server/data/cache/main_file_cache.dat b/2006Scape Server/data/cache/main_file_cache.dat index fab8e811829c0f9cfc0ffc3a952e9a7c0c27a087..8fd42b89ab449aca2655fc3b4c2def45508c058e 100644 GIT binary patch delta 31301 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 z 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 delta 15 RcmXpr<79w 3300) { underAttackBy2 = 0; } - + if (System.currentTimeMillis() - restoreStatsDelay > 60000) { restoreStatsDelay = System.currentTimeMillis(); for (int skill = 0; skill < playerLevel.length; skill++) { @@ -1398,20 +1403,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, @@ -1695,7 +1700,7 @@ public abstract class Player { 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 2097152, 8388608, 16777216, 67108864, 134217728 }; - + /** * Combat variables */ @@ -1713,7 +1718,7 @@ public abstract class Player { /** * End */ - + public int clickNpcType, clickObjectType, objectId, objectX, objectY, npcIndex, npcClickIndex, npcType; public int pItemX, pItemY, pItemId; @@ -2130,11 +2135,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) { @@ -2148,7 +2153,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; } @@ -2507,74 +2512,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 diff --git a/2006Scape Server/src/main/java/com/rs2/game/players/PlayerAssistant.java b/2006Scape Server/src/main/java/com/rs2/game/players/PlayerAssistant.java index c2f89f4b..5d5caf91 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/players/PlayerAssistant.java +++ b/2006Scape Server/src/main/java/com/rs2/game/players/PlayerAssistant.java @@ -17,7 +17,6 @@ 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; @@ -95,7 +94,7 @@ public class PlayerAssistant { public void loginScreen() { player.getPacketSender().showInterface(15244); - player.getPacketSender().sendString("Welcome to " + GameConstants.SERVER_NAME + "\\n", 15257); + player.getPacketSender().sendString("Welcome to " + GameConstants.SERVER_NAME + " World: " + GameConstants.WORLD + "\\n", 15257); int currentDay = player.getLastLogin() - player.lastLoginDate; if (player.playerLevel[GameConstants.HERBLORE] < 3) { @@ -1833,7 +1832,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 + "@bla@ - we are currently in Server Stage v@blu@" + GameConstants.TEST_VERSION + "@bla@."); + 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("@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"); @@ -2033,7 +2032,11 @@ public class PlayerAssistant { if (player.tutorialProgress < 36 && player.playerLevel[skill] == 3 && GameConstants.TUTORIAL_ISLAND) { return false; } - amount *= GameConstants.XP_RATE; + if (GameConstants.VARIABLE_XP_RATE){ + amount *= player.getXPRate(); + } else { + amount *= GameConstants.XP_RATE; + } int oldLevel = getLevelForXP(player.playerXP[skill]); player.playerXP[skill] += amount; if (oldLevel < getLevelForXP(player.playerXP[skill])) { diff --git a/2006Scape Server/src/main/java/com/rs2/game/players/PlayerSave.java b/2006Scape Server/src/main/java/com/rs2/game/players/PlayerSave.java index 96a38cc0..9e9c5130 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/players/PlayerSave.java +++ b/2006Scape Server/src/main/java/com/rs2/game/players/PlayerSave.java @@ -92,6 +92,8 @@ 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; @@ -593,6 +595,8 @@ 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); diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/PlayersOnlineWebsite.java b/2006Scape Server/src/main/java/com/rs2/integrations/PlayersOnlineWebsite.java index 5e34806d..2e1fd0f5 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/PlayersOnlineWebsite.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/PlayersOnlineWebsite.java @@ -13,7 +13,7 @@ public class PlayersOnlineWebsite { private static void setWebsitePlayersOnline(int amount) throws IOException { URL url; - url = new URL(GameConstants.WEBSITE_LINK + "/playersonline.php?pass=" + password + "&amount=" + amount); + url = new URL(GameConstants.WEBSITE_LINK + "/playersonline.php?pass=" + password + "&amount=" + amount + "&world=" + GameConstants.WORLD); url.openStream().close(); } diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/RegisteredAccsWebsite.java b/2006Scape Server/src/main/java/com/rs2/integrations/RegisteredAccsWebsite.java index 14efc934..79eadf71 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/RegisteredAccsWebsite.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/RegisteredAccsWebsite.java @@ -12,7 +12,7 @@ public class RegisteredAccsWebsite { private static void setAccountsRegistered(int amount) throws IOException { URL url; - url = new URL(GameConstants.WEBSITE_LINK + "/accountsregistered.php?pass=" + password + "&amount=" + amount); + url = new URL(GameConstants.WEBSITE_LINK + "/accountsregistered.php?pass=" + password + "&amount=" + amount + "&world=" + GameConstants.WORLD); url.openStream().close(); } diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/JavaCord.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/JavaCord.java index f964317a..1b5c8ec1 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/discord/JavaCord.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/JavaCord.java @@ -1,12 +1,15 @@ package com.rs2.integrations.discord; import com.rs2.GameConstants; +import com.rs2.integrations.discord.commands.*; +import com.rs2.integrations.discord.commands.admin.GameKick; +import com.rs2.integrations.discord.commands.admin.MoveHome; +import com.rs2.integrations.discord.commands.admin.Update; 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; @@ -17,6 +20,7 @@ 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; @@ -34,19 +38,14 @@ public class JavaCord { api.addListener(new Players()); api.addListener(new Vote()); api.addListener(new Website()); + //Admin Commands + api.addListener(new GameKick()); + api.addListener(new MoveHome()); + api.addListener(new Update()); 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) { diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Commands.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Commands.java index 8c7a9615..7ad8a966 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Commands.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Commands.java @@ -1,5 +1,6 @@ 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; @@ -8,22 +9,20 @@ public class Commands implements MessageCreateListener { @Override public void onMessageCreate(MessageCreateEvent event) { Message message = event.getMessage(); - if (message.getContent().equalsIgnoreCase("::commands")) { + if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " commands")) { event.getChannel().sendMessage("```fix" + System.lineSeparator() + - "::forum/::forums" + JavaCord.commandPrefix + " forum/" + JavaCord.commandPrefix + " forums" + System.lineSeparator() + - "::hiscores/::highscores" + JavaCord.commandPrefix + " hiscores/" + JavaCord.commandPrefix + " highscores" + System.lineSeparator() + - "::issues/::bugs" + JavaCord.commandPrefix + " issues/" + JavaCord.commandPrefix + " bugs" + System.lineSeparator() + - "::online" + JavaCord.commandPrefix + " online" + System.lineSeparator() + - "::players" + JavaCord.commandPrefix + " vote" + System.lineSeparator() + - "::vote" - + System.lineSeparator() + - "::website/::site" + JavaCord.commandPrefix + " website/" + JavaCord.commandPrefix + " site" + "```"); } } diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Forum.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Forum.java index b746b3c1..d5a6991c 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Forum.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Forum.java @@ -1,5 +1,6 @@ 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; @@ -10,7 +11,7 @@ public class Forum implements MessageCreateListener { @Override public void onMessageCreate(MessageCreateEvent event) { Message message = event.getMessage(); - if (message.getContent().equalsIgnoreCase("::forum") || message.getContent().equalsIgnoreCase("::forums")) { + if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " forum") || message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " forums")) { event.getChannel().sendMessage(GameConstants.WEBSITE_LINK + "/forums/index.php"); } } diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Hiscores.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Hiscores.java index c3ccd26e..fc72e2bb 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Hiscores.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Hiscores.java @@ -1,5 +1,6 @@ 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; @@ -10,7 +11,7 @@ public class Hiscores implements MessageCreateListener { @Override public void onMessageCreate(MessageCreateEvent event) { Message message = event.getMessage(); - if (message.getContent().equalsIgnoreCase("::hiscores") || message.getContent().equalsIgnoreCase("::highscores")) { + if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " hiscores") || message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " highscores")) { event.getChannel().sendMessage(GameConstants.WEBSITE_LINK + "/hiscores.html"); } } diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Issues.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Issues.java index 83760dc6..43e2668d 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Issues.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Issues.java @@ -1,5 +1,6 @@ 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; @@ -8,7 +9,7 @@ public class Issues implements MessageCreateListener { @Override public void onMessageCreate(MessageCreateEvent event) { Message message = event.getMessage(); - if (message.getContent().equalsIgnoreCase("::issues") || message.getContent().equalsIgnoreCase("::bugs")) { + if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " issues") || message.getContent().equalsIgnoreCase(JavaCord.commandPrefix+ " bugs")) { event.getChannel().sendMessage("https://github.com/2006-Scape/2006Scape/issues"); } } diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Online.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Online.java index e040e743..cf0376b5 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Online.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Online.java @@ -1,5 +1,6 @@ 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,8 +11,8 @@ public class Online implements MessageCreateListener { @Override public void onMessageCreate(MessageCreateEvent event) { Message message = event.getMessage(); - if (message.getContent().equalsIgnoreCase("::online")) { - event.getChannel().sendMessage(":tada: " + JavaCord.serverName + " is Online! :tada:"); + if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " online")) { + event.getChannel().sendMessage(":tada: " + JavaCord.serverName + " World:" + GameConstants.WORLD + " is Online! :tada:"); } } } \ No newline at end of file diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Players.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Players.java index 3d3fa556..83d95c7e 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Players.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Players.java @@ -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("::players")) { + if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " players")) { if (PlayerHandler.getPlayerCount() != 1) { event.getChannel().sendMessage("There are currently " + PlayerHandler.getPlayerCount() + " players online (" + PlayerHandler.getNonPlayerCount() + " staff online)."); } else { diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Vote.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Vote.java index 5c73a72f..88587bc8 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Vote.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Vote.java @@ -1,5 +1,6 @@ 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; @@ -10,7 +11,7 @@ public class Vote implements MessageCreateListener { @Override public void onMessageCreate(MessageCreateEvent event) { Message message = event.getMessage(); - if (message.getContent().equalsIgnoreCase("::vote")) { + if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " vote")) { event.getChannel().sendMessage("Visit " + GameConstants.WEBSITE_LINK + "/vote.html then type \"::claimvote\" in-game to receive your reward!"); } } diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Website.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Website.java index b391eb3b..73ded7eb 100644 --- a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Website.java +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/Website.java @@ -1,5 +1,6 @@ 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; @@ -10,7 +11,7 @@ public class Website implements MessageCreateListener { @Override public void onMessageCreate(MessageCreateEvent event) { Message message = event.getMessage(); - if (message.getContent().equalsIgnoreCase("::website") || message.getContent().equalsIgnoreCase("::site")) { + if (message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " website") || message.getContent().equalsIgnoreCase(JavaCord.commandPrefix + " site")) { event.getChannel().sendMessage(GameConstants.WEBSITE_LINK); } } diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/GameKick.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/GameKick.java new file mode 100644 index 00000000..42b45fe3 --- /dev/null +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/GameKick.java @@ -0,0 +1,32 @@ +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; + +public class GameKick implements MessageCreateListener { + @Override + public void onMessageCreate(MessageCreateEvent event) { + if (event.getMessageContent().startsWith(JavaCord.commandPrefix + " gamekick")) { + if (event.getMessageAuthor().isServerAdmin()) { + 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; + event.getChannel().sendMessage( playerToKick+ " was kicked by " + event.getMessageAuthor().getDisplayName() + "."); + c2.disconnected = true; + c2.logout(true); + break; + } + } + } + } else { + event.getChannel().sendMessage("You do not have permission to perform this command"); + } + } + } +} \ No newline at end of file diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/MoveHome.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/MoveHome.java new file mode 100644 index 00000000..1dfba022 --- /dev/null +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/MoveHome.java @@ -0,0 +1,31 @@ +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"); + } + } + } +} \ No newline at end of file diff --git a/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/Update.java b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/Update.java new file mode 100644 index 00000000..f60bfd11 --- /dev/null +++ b/2006Scape Server/src/main/java/com/rs2/integrations/discord/commands/admin/Update.java @@ -0,0 +1,24 @@ +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) { + if(event.getMessageAuthor().isServerAdmin()) { + String seconds = event.getMessageContent().replace(JavaCord.commandPrefix + " update ", ""); + if (event.getMessageContent().startsWith(JavaCord.commandPrefix + " update")) { + 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"); + } + } +} \ No newline at end of file diff --git a/2006Scape Server/src/main/java/com/rs2/net/PacketSender.java b/2006Scape Server/src/main/java/com/rs2/net/PacketSender.java index 8d3e1821..8ef6e169 100644 --- a/2006Scape Server/src/main/java/com/rs2/net/PacketSender.java +++ b/2006Scape Server/src/main/java/com/rs2/net/PacketSender.java @@ -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 + "@bla@ - we are currently in Server Stage v@blu@" + GameConstants.TEST_VERSION + "@bla@."); + 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("@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"); diff --git a/2006Scape Server/src/main/java/com/rs2/net/packets/impl/Commands.java b/2006Scape Server/src/main/java/com/rs2/net/packets/impl/Commands.java index 365a973a..4c644aeb 100644 --- a/2006Scape Server/src/main/java/com/rs2/net/packets/impl/Commands.java +++ b/2006Scape Server/src/main/java/com/rs2/net/packets/impl/Commands.java @@ -8,7 +8,6 @@ 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; @@ -45,6 +44,34 @@ public class Commands implements PacketType { public static void playerCommands(Player player, String playerCommand, String[] arguments) { switch (playerCommand.toLowerCase()) { + 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": @@ -257,9 +284,6 @@ public class Commands implements PacketType { "::loc, ::pos, ::coord", "Get your current world position", "", - "::stuck", - "Return to Lumbridge when stuck", - "", "::randomtoggle", "Enable/Disable random events", "", @@ -280,6 +304,8 @@ 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 @@ -294,17 +320,6 @@ 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": diff --git a/docker-compose.yml b/docker-compose.yml index 12babfff..a86545be 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,7 +17,7 @@ services: volumes: - ./2006Scape Server:/usr/src/server working_dir: /usr/src/server - ports: # You will need to open other ports if your world ID is not 1 (43597 for world 2) + ports: # You will need to open other ports if your world ID is not 1 (43598 for world 2) - 43594:43594 # Server - 43595-43596:43595-43596 # File Server restart: unless-stopped