From 8b9dbeabd8db035b12e0847ce0567ab207b7c384 Mon Sep 17 00:00:00 2001 From: flewkey Date: Sun, 26 May 2019 23:14:20 -0700 Subject: [PATCH] Initial commit --- README.txt | 2 + patches/net/minecraft/command/Commands.patch | 22 +++++ .../command/impl/GameModeCommand.patch | 13 +++ .../minecraft/server/MinecraftServer.patch | 37 +++++++++ src/party/_2a03/command/ConfigCommand.java | 30 +++++++ src/party/_2a03/command/HomeCommand.java | 52 ++++++++++++ src/party/_2a03/command/SpawnCommand.java | 27 ++++++ src/party/_2a03/server/Config.java | 83 +++++++++++++++++++ src/party/_2a03/server/PlayerData.java | 37 +++++++++ src/party/_2a03/server/PlayerPosition.java | 17 ++++ 10 files changed, 320 insertions(+) create mode 100644 README.txt create mode 100644 patches/net/minecraft/command/Commands.patch create mode 100644 patches/net/minecraft/command/impl/GameModeCommand.patch create mode 100644 patches/net/minecraft/server/MinecraftServer.patch create mode 100644 src/party/_2a03/command/ConfigCommand.java create mode 100644 src/party/_2a03/command/HomeCommand.java create mode 100644 src/party/_2a03/command/SpawnCommand.java create mode 100644 src/party/_2a03/server/Config.java create mode 100644 src/party/_2a03/server/PlayerData.java create mode 100644 src/party/_2a03/server/PlayerPosition.java diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..6ead9e0 --- /dev/null +++ b/README.txt @@ -0,0 +1,2 @@ +This repository contains simple modifications for the 2a03.party Minecraft server. +You probably want to ignore this. diff --git a/patches/net/minecraft/command/Commands.patch b/patches/net/minecraft/command/Commands.patch new file mode 100644 index 0000000..ca05a75 --- /dev/null +++ b/patches/net/minecraft/command/Commands.patch @@ -0,0 +1,22 @@ +--- a/net/minecraft/command/Commands.java 2019-05-23 14:43:25 -0700 ++++ b/net/minecraft/command/Commands.java 2019-05-26 17:14:30 -0700 +@@ -90,6 +90,9 @@ + import net.minecraft.util.text.event.HoverEvent; + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; ++import party._2a03.command.SpawnCommand; //Patched ++import party._2a03.command.HomeCommand; //Patched ++import party._2a03.command.ConfigCommand; //Patched + + public class Commands { + private static final Logger field_197061_a = LogManager.getLogger(); +@@ -149,6 +152,9 @@ + TriggerCommand.func_198852_a(this.field_197062_b); + WeatherCommand.func_198862_a(this.field_197062_b); + WorldBorderCommand.func_198894_a(this.field_197062_b); ++ SpawnCommand.register(this.field_197062_b); //Patched ++ HomeCommand.register(this.field_197062_b); //Patched ++ ConfigCommand.register(this.field_197062_b); //Patched + if (p_i49161_1_) { + BanIpCommand.func_198220_a(this.field_197062_b); + BanListCommand.func_198229_a(this.field_197062_b); diff --git a/patches/net/minecraft/command/impl/GameModeCommand.patch b/patches/net/minecraft/command/impl/GameModeCommand.patch new file mode 100644 index 0000000..0dff91b --- /dev/null +++ b/patches/net/minecraft/command/impl/GameModeCommand.patch @@ -0,0 +1,13 @@ +--- a/net/minecraft/command/impl/GameModeCommand.java 2019-05-23 14:43:22 -0700 ++++ b/net/minecraft/command/impl/GameModeCommand.java 2019-05-26 14:13:25 -0700 +@@ -48,6 +48,10 @@ + + private static int func_198484_a(CommandContext p_198484_0_, Collection p_198484_1_, GameType p_198484_2_) { + int i = 0; ++ ++ if (p_198484_2_ == GameType.CREATIVE) { //Patched ++ p_198484_0_.getSource().func_197030_a(new TranslationTextComponent(" Creative mode? What are you, a cheater?"), true); //Patched ++ } //Patched + + for(ServerPlayerEntity serverplayerentity : p_198484_1_) { + if (serverplayerentity.field_71134_c.func_73081_b() != p_198484_2_) { diff --git a/patches/net/minecraft/server/MinecraftServer.patch b/patches/net/minecraft/server/MinecraftServer.patch new file mode 100644 index 0000000..90aa79a --- /dev/null +++ b/patches/net/minecraft/server/MinecraftServer.patch @@ -0,0 +1,37 @@ +--- a/net/minecraft/server/MinecraftServer.java 2019-05-23 14:43:21 -0700 ++++ b/net/minecraft/server/MinecraftServer.java 2019-05-26 14:37:21 -0700 +@@ -121,6 +121,7 @@ + import org.apache.commons.lang3.Validate; + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; ++import party._2a03.server.Config; //Patched + + public abstract class MinecraftServer extends RecursiveEventLoop implements ISnooperInfo, ICommandExecutor, AutoCloseable, Runnable { + private static final Logger field_147145_h = LogManager.getLogger(); +@@ -810,6 +811,7 @@ + } + + public static void main(String[] p_main_0_) { ++ field_147145_h.info("This jar has been patched!"); //Patched + OptionParser optionparser = new OptionParser(); + OptionSpec optionspec = optionparser.accepts("nogui"); + OptionSpec optionspec1 = optionparser.accepts("initSettings", "Initializes 'server.properties' and 'eula.txt', then quits"); +@@ -864,7 +866,8 @@ + dedicatedserver.func_213197_c(optionset.has(optionspec5)); + dedicatedserver.func_213208_c(optionset.valueOf(optionspec11)); + boolean flag = !optionset.has(optionspec) && !optionset.valuesOf(optionspec12).contains("nogui"); +- if (flag && !GraphicsEnvironment.isHeadless()) { ++ Config.loadConfig(); //Patched ++ if (flag && !GraphicsEnvironment.isHeadless() && false) { //Patched + dedicatedserver.func_120011_ar(); + } + +@@ -950,7 +953,7 @@ + } + + public String getServerModName() { +- return "vanilla"; ++ return "mc.2a03.party"; //Patched + } + + public CrashReport func_71230_b(CrashReport p_71230_1_) { diff --git a/src/party/_2a03/command/ConfigCommand.java b/src/party/_2a03/command/ConfigCommand.java new file mode 100644 index 0000000..c716f6e --- /dev/null +++ b/src/party/_2a03/command/ConfigCommand.java @@ -0,0 +1,30 @@ +package party._2a03.command; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.util.text.TranslationTextComponent; +import party._2a03.server.Config; + +public class ConfigCommand { + public static void register(CommandDispatcher dispatcher) { + LiteralArgumentBuilder literalargumentbuilder = Commands.func_197057_a("config").requires((source) -> { + return source.func_197034_c(2); + }); + literalargumentbuilder.then(Commands.func_197057_a("reload").executes((source) -> { + try { + Config.loadConfig(); + source.getSource().func_197030_a(new TranslationTextComponent("Reloaded the configuration"), true); + } catch(Exception e) { + source.getSource().func_197030_a(new TranslationTextComponent("Failed to reload the configuration"), true); + } + return 1; + })); + literalargumentbuilder.then(Commands.func_197057_a("delete").executes((source) -> { + source.getSource().func_197030_a(new TranslationTextComponent("Did you seriously think this command did something?"), true); + return 1; + })); + dispatcher.register(literalargumentbuilder); + } +} diff --git a/src/party/_2a03/command/HomeCommand.java b/src/party/_2a03/command/HomeCommand.java new file mode 100644 index 0000000..f24dd77 --- /dev/null +++ b/src/party/_2a03/command/HomeCommand.java @@ -0,0 +1,52 @@ +package party._2a03.command; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.play.server.SPlayerPositionLookPacket; +import java.util.Set; +import java.util.EnumSet; +import party._2a03.server.Config; +import party._2a03.server.PlayerData; +import party._2a03.server.PlayerPosition; + +public class HomeCommand { + public static void register(CommandDispatcher dispatcher) { + LiteralArgumentBuilder literalargumentbuilder = Commands.func_197057_a("home").executes((source) -> { + PlayerData player = Config.getPlayer(source.getSource().func_197035_h().func_110124_au().toString()); + PlayerPosition position = player.getHome(); + if (position.y == -1) { + source.getSource().func_197030_a(new TranslationTextComponent("Home not found, ask a moderator to set it"), true); + return 1; + } + Set set = EnumSet.noneOf(SPlayerPositionLookPacket.Flags.class); + set.add(SPlayerPositionLookPacket.Flags.X); + set.add(SPlayerPositionLookPacket.Flags.Y); + set.add(SPlayerPositionLookPacket.Flags.Z); + ((ServerPlayerEntity)source.getSource().func_197035_h()).field_71135_a.func_175089_a((double)position.x, (double)position.y, (double)position.z, (float)position.yaw, (float)position.pitch, set); + source.getSource().func_197030_a(new TranslationTextComponent("Teleported to home"), true); + return 1; + }); + literalargumentbuilder.then(Commands.func_197057_a("set").then(Commands.func_197056_a("UUID", StringArgumentType.word()).requires((source) -> { + return source.func_197034_c(2); + }).executes((source) -> { + PlayerData player = Config.getPlayer(StringArgumentType.getString(source, "UUID")); + ServerPlayerEntity playerEntity = source.getSource().func_197035_h(); + double x = playerEntity.field_70165_t; + double y = playerEntity.field_70163_u; + double z = playerEntity.field_70161_v; + float yaw = playerEntity.field_70177_z; + float pitch = playerEntity.field_70125_A; + PlayerPosition location = new PlayerPosition(x, y, z, yaw, pitch); + player.setHome(location); + Config.setPlayer(player); + source.getSource().func_197030_a(new TranslationTextComponent("User's home has been updated"), true); + return 1; + }))); + dispatcher.register(literalargumentbuilder); + } +} diff --git a/src/party/_2a03/command/SpawnCommand.java b/src/party/_2a03/command/SpawnCommand.java new file mode 100644 index 0000000..0282d04 --- /dev/null +++ b/src/party/_2a03/command/SpawnCommand.java @@ -0,0 +1,27 @@ +package party._2a03.command; + +import com.mojang.brigadier.CommandDispatcher; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.play.server.SPlayerPositionLookPacket; +import java.util.Set; +import java.util.EnumSet; +import party._2a03.server.Config; +import party._2a03.server.PlayerPosition; + +public class SpawnCommand { + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(Commands.func_197057_a("spawn").executes((source) -> { + Set set = EnumSet.noneOf(SPlayerPositionLookPacket.Flags.class); + set.add(SPlayerPositionLookPacket.Flags.X); + set.add(SPlayerPositionLookPacket.Flags.Y); + set.add(SPlayerPositionLookPacket.Flags.Z); + PlayerPosition position = Config.getPosition("spawn"); + ((ServerPlayerEntity)source.getSource().func_197035_h()).field_71135_a.func_175089_a((double)position.x, (double)position.y, (double)position.z, (float)position.yaw, (float)position.pitch, set); + source.getSource().func_197030_a(new TranslationTextComponent("Teleported to the spawn point"), true); + return 1; + })); + } +} diff --git a/src/party/_2a03/server/Config.java b/src/party/_2a03/server/Config.java new file mode 100644 index 0000000..d429f6a --- /dev/null +++ b/src/party/_2a03/server/Config.java @@ -0,0 +1,83 @@ +package party._2a03.server; + +import java.io.File; +import java.io.FileWriter; +import java.io.FileInputStream; +import java.io.InputStream; +import org.json.JSONObject; +import org.json.JSONArray; +import org.apache.commons.io.IOUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import party._2a03.server.PlayerData; +import party._2a03.server.PlayerPosition; + +public class Config { + private static JSONObject json; + private static final Logger logger = LogManager.getLogger(); + + public static void loadConfig() throws Exception { + logger.info("Loading 2a03.party configuration"); + File f = new File("2a03.json"); + if (f.exists()) { + InputStream is = new FileInputStream("2a03.json"); + String jsonRaw = IOUtils.toString(is, "UTF-8"); + json = new JSONObject(jsonRaw); + } else { + logger.info("Unable to find config"); + } + logger.info("Configuration loaded"); + } + + public static PlayerData getPlayer(String uuid) { + JSONArray members = json.getJSONArray("members"); + JSONObject data = null; + for (int i = 0; i < members.length(); ++i) { + JSONObject item = members.getJSONObject(i); + String item_uuid = item.getString("uuid"); + if (item_uuid.equals(uuid)) { + data = item; + } + } + if (data == null) { + data = new JSONObject("{\"uuid\":\""+uuid+"\",\"home\":[-1,-1,-1,-1,-1]}"); + } + return new PlayerData(data); + } + + public static void setPlayer(PlayerData player) { + JSONArray members = json.getJSONArray("members"); + int playerIndex = -1; + for (int i = 0; i < members.length(); ++i) { + JSONObject item = members.getJSONObject(i); + String item_uuid = item.getString("uuid"); + if (item_uuid.equals(player.getUUID())) { + playerIndex = i; + } + } + if (playerIndex >= 0) { + members.remove(playerIndex); + } + members.put(player.json); + json.put("members", members); + saveConfig(); + } + + public static PlayerPosition getPosition(String key) { + JSONArray data = json.getJSONArray(key); + double x = data.getDouble(0); + double y = data.getDouble(1); + double z = data.getDouble(2); + float yaw = data.getFloat(3); + float pitch = data.getFloat(4); + return new PlayerPosition((double)x, (double)y, (double)z, (float)yaw, (float)pitch); + } + + private static void saveConfig() { + try (FileWriter file = new FileWriter("2a03.json")) { + file.write(JSONObject.valueToString(json)); + } catch (Exception e) { + System.out.println("Failed to save config file"); + } + } +} \ No newline at end of file diff --git a/src/party/_2a03/server/PlayerData.java b/src/party/_2a03/server/PlayerData.java new file mode 100644 index 0000000..6bdd9f0 --- /dev/null +++ b/src/party/_2a03/server/PlayerData.java @@ -0,0 +1,37 @@ +package party._2a03.server; + +import org.json.JSONArray; +import org.json.JSONObject; +import party._2a03.server.PlayerPosition; + +public class PlayerData { + public JSONObject json; + + public PlayerData(JSONObject p_json) { + this.json = p_json; + } + + public PlayerPosition getHome() { + JSONArray data = json.getJSONArray("home"); + double x = data.getDouble(0); + double y = data.getDouble(1); + double z = data.getDouble(2); + float yaw = data.getFloat(3); + float pitch = data.getFloat(4); + return new PlayerPosition(x, y, z, yaw, pitch); + } + + public String getUUID() { + return json.getString("uuid"); + } + + public void setHome(PlayerPosition location) { + JSONArray locationArray = new JSONArray(); + locationArray.put(location.x); + locationArray.put(location.y); + locationArray.put(location.z); + locationArray.put(location.yaw); + locationArray.put(location.pitch); + json.put("home", locationArray); + } +} \ No newline at end of file diff --git a/src/party/_2a03/server/PlayerPosition.java b/src/party/_2a03/server/PlayerPosition.java new file mode 100644 index 0000000..5a6453a --- /dev/null +++ b/src/party/_2a03/server/PlayerPosition.java @@ -0,0 +1,17 @@ +package party._2a03.server; + +public class PlayerPosition { + public double x; + public double y; + public double z; + public float yaw; + public float pitch; + + public PlayerPosition(double p_x, double p_y, double p_z, float p_yaw, float p_pitch) { + this.x = p_x; + this.y = p_y; + this.z = p_z; + this.yaw = p_yaw; + this.pitch = p_pitch; + } +} \ No newline at end of file