From 26e6077a800ace8528f765d66d6323ed60708473 Mon Sep 17 00:00:00 2001 From: "Ryan Fox (flewkey)" Date: Tue, 7 Jan 2020 15:53:42 +0000 Subject: [PATCH] Initial commit --- .gitignore | 3 + LICENSE.txt | 21 +++++ README.txt | 7 ++ build.gradle | 19 ++++ gradle.properties | 8 ++ settings.gradle | 9 ++ .../party/_2a03/mc/MinecraftTweaks2a03.java | 34 +++++++ .../party/_2a03/mc/command/ConfigCommand.java | 29 ++++++ .../party/_2a03/mc/command/HatCommand.java | 24 +++++ .../party/_2a03/mc/command/HeadCommand.java | 35 +++++++ .../party/_2a03/mc/command/HomeCommand.java | 68 ++++++++++++++ .../party/_2a03/mc/command/SpawnCommand.java | 51 +++++++++++ .../_2a03/mc/mixin/MixinGameModeCommand.java | 22 +++++ .../party/_2a03/mc/mixin/MixinTntEntity.java | 23 +++++ .../java/party/_2a03/mc/server/Config.java | 86 ++++++++++++++++++ .../party/_2a03/mc/server/PlayerData.java | 34 +++++++ .../party/_2a03/mc/server/PlayerPosition.java | 58 ++++++++++++ .../assets/minecraft-tweaks-2a03/icon.png | Bin 0 -> 11320 bytes src/main/resources/fabric.mod.json | 30 ++++++ .../minecraft-tweaks-2a03.mixins.json | 12 +++ 20 files changed, 573 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.txt create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 settings.gradle create mode 100644 src/main/java/party/_2a03/mc/MinecraftTweaks2a03.java create mode 100644 src/main/java/party/_2a03/mc/command/ConfigCommand.java create mode 100644 src/main/java/party/_2a03/mc/command/HatCommand.java create mode 100644 src/main/java/party/_2a03/mc/command/HeadCommand.java create mode 100644 src/main/java/party/_2a03/mc/command/HomeCommand.java create mode 100644 src/main/java/party/_2a03/mc/command/SpawnCommand.java create mode 100644 src/main/java/party/_2a03/mc/mixin/MixinGameModeCommand.java create mode 100644 src/main/java/party/_2a03/mc/mixin/MixinTntEntity.java create mode 100644 src/main/java/party/_2a03/mc/server/Config.java create mode 100644 src/main/java/party/_2a03/mc/server/PlayerData.java create mode 100644 src/main/java/party/_2a03/mc/server/PlayerPosition.java create mode 100644 src/main/resources/assets/minecraft-tweaks-2a03/icon.png create mode 100644 src/main/resources/fabric.mod.json create mode 100644 src/main/resources/minecraft-tweaks-2a03.mixins.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..249ce68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.gradle/ +build/ +run/ diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..e7beec5 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Ryan Fox + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..66e8fbb --- /dev/null +++ b/README.txt @@ -0,0 +1,7 @@ +2a03-minecraft-tweaks + +This repository contains simple modifications for the 2a03.party Minecraft +server. I have replaced the patches with a Fabric mod. +If you want a new feature added, you can either make an issue here or e-mail +me. Preferably the latter, because I am inactive on GitHub. +You probably want to ignore this. diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..4cf01cd --- /dev/null +++ b/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'fabric-loom' version '0.2.6-SNAPSHOT' +} + +repositories { + mavenCentral() +} + +dependencies { + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modCompile "net.fabricmc:fabric-loader:${project.loader_version}" + modCompile "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + compile "org.json:json:20190722" +} + +jar { + from "LICENSE.txt" +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..71db68a --- /dev/null +++ b/gradle.properties @@ -0,0 +1,8 @@ +org.gradle.jvmargs=-Xmx1G +minecraft_version=1.15.1 +yarn_mappings=1.15.1+build.1 +loader_version=0.7.2+build.175 +mod_version = 1.0.0 +maven_group = party.2a03.mc +archives_base_name = minecraft-tweaks-2a03 +fabric_version=0.4.25+build.282-1.15 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..f91a4fe --- /dev/null +++ b/settings.gradle @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + gradlePluginPortal() + } +} diff --git a/src/main/java/party/_2a03/mc/MinecraftTweaks2a03.java b/src/main/java/party/_2a03/mc/MinecraftTweaks2a03.java new file mode 100644 index 0000000..cc16919 --- /dev/null +++ b/src/main/java/party/_2a03/mc/MinecraftTweaks2a03.java @@ -0,0 +1,34 @@ +package party._2a03.mc; + +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.registry.CommandRegistry; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import party._2a03.mc.command.ConfigCommand; +import party._2a03.mc.command.HatCommand; +import party._2a03.mc.command.HeadCommand; +import party._2a03.mc.command.HomeCommand; +import party._2a03.mc.command.SpawnCommand; +import party._2a03.mc.server.Config; + +public class MinecraftTweaks2a03 implements ModInitializer { + private static final Logger LOGGER = LogManager.getLogger(); + + @Override + public void onInitialize() { + try { + Config.loadConfig(); + } catch (Exception e) { + e.printStackTrace(); + LOGGER.error(e); + } + LOGGER.info("Registering 2a03.party commands"); + CommandRegistry.INSTANCE.register(false, dispatcher -> { + ConfigCommand.register(dispatcher); + HatCommand.register(dispatcher); + HeadCommand.register(dispatcher); + HomeCommand.register(dispatcher); + SpawnCommand.register(dispatcher); + }); + } +} diff --git a/src/main/java/party/_2a03/mc/command/ConfigCommand.java b/src/main/java/party/_2a03/mc/command/ConfigCommand.java new file mode 100644 index 0000000..d55c685 --- /dev/null +++ b/src/main/java/party/_2a03/mc/command/ConfigCommand.java @@ -0,0 +1,29 @@ +package party._2a03.mc.command; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.LiteralText; +import party._2a03.mc.server.Config; + +public class ConfigCommand { + public static void register(CommandDispatcher dispatcher) { + LiteralArgumentBuilder literalargumentbuilder = CommandManager.literal("config").requires(ctx -> { + return ctx.hasPermissionLevel(2); + }); + + literalargumentbuilder.then(CommandManager.literal("reload").executes(ctx -> { + ServerCommandSource source = ctx.getSource(); + try { + Config.loadConfig(); + source.sendFeedback(new LiteralText("Reloaded the configuration"), true); + } catch(Exception e) { + source.sendFeedback(new LiteralText("Failed to reload the configuration"), true); + } + return 1; + })); + + dispatcher.register(literalargumentbuilder); + } +} diff --git a/src/main/java/party/_2a03/mc/command/HatCommand.java b/src/main/java/party/_2a03/mc/command/HatCommand.java new file mode 100644 index 0000000..f6eaede --- /dev/null +++ b/src/main/java/party/_2a03/mc/command/HatCommand.java @@ -0,0 +1,24 @@ +package party._2a03.mc.command; + +import com.mojang.brigadier.CommandDispatcher; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.LiteralText; + +public class HatCommand { + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(CommandManager.literal("hat").executes(ctx -> { + ServerCommandSource source = ctx.getSource(); + ServerPlayerEntity sender = source.getPlayer(); + ItemStack mainhand = sender.getEquippedStack(EquipmentSlot.MAINHAND); + ItemStack head = sender.getEquippedStack(EquipmentSlot.HEAD); + sender.equipStack(EquipmentSlot.MAINHAND, head); + sender.equipStack(EquipmentSlot.HEAD, mainhand); + source.sendFeedback(new LiteralText("Swapped items between main hand and head"), false); + return 1; + })); + } +} diff --git a/src/main/java/party/_2a03/mc/command/HeadCommand.java b/src/main/java/party/_2a03/mc/command/HeadCommand.java new file mode 100644 index 0000000..959fa89 --- /dev/null +++ b/src/main/java/party/_2a03/mc/command/HeadCommand.java @@ -0,0 +1,35 @@ +package party._2a03.mc.command; + +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.CommandDispatcher; +import net.minecraft.block.Blocks; +import net.minecraft.entity.ItemEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.LiteralText; + +public class HeadCommand { + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(CommandManager.literal("head").executes(ctx -> { + return giveHead(ctx.getSource(), ctx.getSource().getPlayer(), ctx.getSource().getName()); + }).then(CommandManager.argument("username", StringArgumentType.greedyString()).executes(ctx -> { + return giveHead(ctx.getSource(), ctx.getSource().getPlayer(), StringArgumentType.getString(ctx, "username")); + }))); + } + + private static int giveHead(ServerCommandSource source, ServerPlayerEntity sender, String skullowner) { + ItemStack itemstack = new ItemStack(Blocks.PLAYER_HEAD.asItem()); + CompoundTag compoundtag = new CompoundTag(); + compoundtag.putString("SkullOwner", skullowner); + itemstack.setTag(compoundtag); + ItemEntity itementity = sender.dropItem(itemstack, false); + itementity.resetPickupDelay(); + itementity.setOwner(sender.getUuid()); + source.sendFeedback(new LiteralText("Player head has been given"), false); + return 1; + } +} diff --git a/src/main/java/party/_2a03/mc/command/HomeCommand.java b/src/main/java/party/_2a03/mc/command/HomeCommand.java new file mode 100644 index 0000000..1c58d2e --- /dev/null +++ b/src/main/java/party/_2a03/mc/command/HomeCommand.java @@ -0,0 +1,68 @@ +package party._2a03.mc.command; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.LiteralText; +import net.minecraft.world.dimension.DimensionType; +import party._2a03.mc.server.Config; +import party._2a03.mc.server.PlayerData; +import party._2a03.mc.server.PlayerPosition; + +public class HomeCommand { + public static void register(CommandDispatcher dispatcher) { + LiteralArgumentBuilder literalargumentbuilder = CommandManager.literal("home").executes(ctx -> { + ServerCommandSource source = ctx.getSource(); + ServerPlayerEntity sender = source.getPlayer(); + PlayerPosition position = Config.getPlayer(sender.getUuid().toString()).getHome(); + if (position.dimensiontype == null) { + source.sendFeedback(new LiteralText("Home not found, do /home set"), false); + return -1; + } + sender.teleport(sender.getServer().getWorld(position.dimensiontype), position.x, position.y, position.z, position.yaw, position.pitch); + source.sendFeedback(new LiteralText("Teleported to home"), true); + return 1; + }); + + literalargumentbuilder.then(CommandManager.literal("set").executes(ctx -> { + ServerCommandSource source = ctx.getSource(); + ServerPlayerEntity sender = source.getPlayer(); + PlayerData playerdata = Config.getPlayer(sender.getUuid().toString()); + double x = sender.getX(); + double y = sender.getY(); + double z = sender.getZ(); + float yaw = sender.yaw; + float pitch = sender.pitch; + DimensionType dimensiontype = sender.getServerWorld().getDimension().getType(); + PlayerPosition location = new PlayerPosition(x, y, z, yaw, pitch, dimensiontype); + playerdata.setHome(location); + Config.setPlayer(playerdata); + source.sendFeedback(new LiteralText("Your home has been updated"), true); + return 1; + })); + + literalargumentbuilder.then(CommandManager.literal("sudoset").requires(ctx -> { + return ctx.hasPermissionLevel(2); + }).then(CommandManager.argument("UUID", StringArgumentType.word()).executes(ctx -> { + ServerCommandSource source = ctx.getSource(); + ServerPlayerEntity sender = source.getPlayer(); + PlayerData playerdata = Config.getPlayer(StringArgumentType.getString(ctx, "UUID")); + double x = sender.getX(); + double y = sender.getY(); + double z = sender.getZ(); + float yaw = sender.yaw; + float pitch = sender.pitch; + DimensionType dimensiontype = sender.getServerWorld().getDimension().getType(); + PlayerPosition location = new PlayerPosition(x, y, z, yaw, pitch, dimensiontype); + playerdata.setHome(location); + Config.setPlayer(playerdata); + source.sendFeedback(new LiteralText("User's home has been updated (" + StringArgumentType.getString(ctx, "UUID") + ")"), true); + return 1; + }))); + + dispatcher.register(literalargumentbuilder); + } +} diff --git a/src/main/java/party/_2a03/mc/command/SpawnCommand.java b/src/main/java/party/_2a03/mc/command/SpawnCommand.java new file mode 100644 index 0000000..1e6e4b6 --- /dev/null +++ b/src/main/java/party/_2a03/mc/command/SpawnCommand.java @@ -0,0 +1,51 @@ +package party._2a03.mc.command; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.LiteralText; +import net.minecraft.world.dimension.DimensionType; +import party._2a03.mc.server.Config; +import party._2a03.mc.server.PlayerPosition; + +public class SpawnCommand { + public static void register(CommandDispatcher dispatcher) { + LiteralArgumentBuilder literalargumentbuilder = CommandManager.literal("spawn").executes(ctx -> { + ServerCommandSource source = ctx.getSource(); + ServerPlayerEntity sender = source.getPlayer(); + PlayerPosition position = new PlayerPosition(Config.getData("spawn")); + if (position.dimensiontype == null) { + if (source.hasPermissionLevel(2)) { + source.sendFeedback(new LiteralText("Spawn not found, do /spawn set"), false); + } else { + source.sendFeedback(new LiteralText("Spawn not found, ask an admin to set it"), false); + } + return -1; + } + sender.teleport(sender.getServer().getWorld(position.dimensiontype), position.x, position.y, position.z, position.yaw, position.pitch); + source.sendFeedback(new LiteralText("Teleported to the spawn point"), true); + return 1; + }); + + literalargumentbuilder.then(CommandManager.literal("set").requires(ctx -> { + return ctx.hasPermissionLevel(2); + }).executes(ctx -> { + ServerCommandSource source = ctx.getSource(); + ServerPlayerEntity sender = source.getPlayer(); + double x = sender.getX(); + double y = sender.getY(); + double z = sender.getZ(); + float yaw = sender.yaw; + float pitch = sender.pitch; + DimensionType dimensiontype = sender.getServerWorld().getDimension().getType(); + PlayerPosition location = new PlayerPosition(x, y, z, yaw, pitch, dimensiontype); + Config.setData("spawn", location.getJSON()); + source.sendFeedback(new LiteralText("Spawn has been set"), true); + return 1; + })); + + dispatcher.register(literalargumentbuilder); + } +} diff --git a/src/main/java/party/_2a03/mc/mixin/MixinGameModeCommand.java b/src/main/java/party/_2a03/mc/mixin/MixinGameModeCommand.java new file mode 100644 index 0000000..378d114 --- /dev/null +++ b/src/main/java/party/_2a03/mc/mixin/MixinGameModeCommand.java @@ -0,0 +1,22 @@ +package party._2a03.mc.mixin; + +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.command.GameModeCommand; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.LiteralText; +import net.minecraft.world.GameMode; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(GameModeCommand.class) +public class MixinGameModeCommand { + @Inject(method = "setGameMode", at = @At("HEAD")) + private static void OnSetGameMode(ServerCommandSource source, ServerPlayerEntity player, GameMode gameMode, CallbackInfo ci) { + if (gameMode == GameMode.CREATIVE) { + source.sendFeedback(new LiteralText(" Creative mode? What are you, a cheater?"), false); + } + return; + } +} diff --git a/src/main/java/party/_2a03/mc/mixin/MixinTntEntity.java b/src/main/java/party/_2a03/mc/mixin/MixinTntEntity.java new file mode 100644 index 0000000..b07e234 --- /dev/null +++ b/src/main/java/party/_2a03/mc/mixin/MixinTntEntity.java @@ -0,0 +1,23 @@ +package party._2a03.mc.mixin; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.TntEntity; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +@Mixin(TntEntity.class) +public abstract class MixinTntEntity extends Entity { + public MixinTntEntity(EntityType entityType, World world) { + super(entityType, world); + } + + /** + * @reason Disable TNT entity explosions. + * @author flewkey + */ + @Overwrite + private void explode() { + } +} diff --git a/src/main/java/party/_2a03/mc/server/Config.java b/src/main/java/party/_2a03/mc/server/Config.java new file mode 100644 index 0000000..3183553 --- /dev/null +++ b/src/main/java/party/_2a03/mc/server/Config.java @@ -0,0 +1,86 @@ +package party._2a03.mc.server; + +import com.google.common.collect.Maps; +import java.io.File; +import java.io.FileWriter; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Map; +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.mc.server.PlayerData; +import party._2a03.mc.server.PlayerPosition; + +public class Config { + private static final Logger LOGGER = LogManager.getLogger(); + private static JSONObject json; + + 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("Config not found, creating one"); + json = new JSONObject("{\"spawn\":[0,0,0,0,0,-2],\"members\":[]}"); + saveConfig(); + } + LOGGER.info("Configuration loaded"); + } + + public static PlayerData getPlayer(String uuid) { + JSONArray members = json.getJSONArray("members"); + PlayerPosition home = 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)) { + home = new PlayerPosition(item.getJSONArray("home")); + } + } + if (home == null) { + home = new PlayerPosition(); + } + return new PlayerData(uuid, home); + } + + 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.getJSON()); + json.put("members", members); + saveConfig(); + } + + public static JSONArray getData(String key) { + return json.getJSONArray(key); + } + + public static void setData(String key, JSONArray data) { + json.put(key, data); + saveConfig(); + } + + 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/main/java/party/_2a03/mc/server/PlayerData.java b/src/main/java/party/_2a03/mc/server/PlayerData.java new file mode 100644 index 0000000..08e45c4 --- /dev/null +++ b/src/main/java/party/_2a03/mc/server/PlayerData.java @@ -0,0 +1,34 @@ +package party._2a03.mc.server; + +import org.json.JSONArray; +import org.json.JSONObject; +import party._2a03.mc.server.PlayerPosition; + +public class PlayerData { + private String uuid; + private PlayerPosition home; + + public PlayerData(String p_uuid, PlayerPosition p_home) { + this.uuid = p_uuid; + this.home = p_home; + } + + public PlayerPosition getHome() { + return this.home; + } + + public String getUUID() { + return this.uuid; + } + + public void setHome(PlayerPosition location) { + this.home = location; + } + + public JSONObject getJSON() { + JSONObject json = new JSONObject(); + json.put("uuid", uuid); + json.put("home", home.getJSON()); + return json; + } +} \ No newline at end of file diff --git a/src/main/java/party/_2a03/mc/server/PlayerPosition.java b/src/main/java/party/_2a03/mc/server/PlayerPosition.java new file mode 100644 index 0000000..1a6adaf --- /dev/null +++ b/src/main/java/party/_2a03/mc/server/PlayerPosition.java @@ -0,0 +1,58 @@ +package party._2a03.mc.server; + +import org.json.JSONArray; +import net.minecraft.world.dimension.DimensionType; +import party._2a03.mc.server.Config; + +public class PlayerPosition { + public double x; + public double y; + public double z; + public float yaw; + public float pitch; + public DimensionType dimensiontype; + + public PlayerPosition() { + } + + public PlayerPosition(JSONArray data) { + int dimension_id = data.getInt(5); + if (dimension_id != -2) { + this.x = data.getDouble(0); + this.y = data.getDouble(1); + this.z = data.getDouble(2); + this.yaw = data.getFloat(3); + this.pitch = data.getFloat(4); + this.dimensiontype = DimensionType.byRawId(dimension_id); + } + } + + public PlayerPosition(double p_x, double p_y, double p_z, float p_yaw, float p_pitch, DimensionType p_dimensiontype) { + this.x = p_x; + this.y = p_y; + this.z = p_z; + this.yaw = p_yaw; + this.pitch = p_pitch; + this.dimensiontype = p_dimensiontype; + } + + public JSONArray getJSON() { + JSONArray json = new JSONArray(); + if (this.dimensiontype != null) { + json.put(this.x); + json.put(this.y); + json.put(this.z); + json.put(this.yaw); + json.put(this.pitch); + json.put(this.dimensiontype.getRawId()); + } else { + json.put(0); + json.put(0); + json.put(0); + json.put(0); + json.put(0); + json.put(-2); + } + return json; + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecraft-tweaks-2a03/icon.png b/src/main/resources/assets/minecraft-tweaks-2a03/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3174d86fba70f4736fd4004d466c0f92229bcebf GIT binary patch literal 11320 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.7.2", + "fabric": "*", + "minecraft": "1.15.x" + } +} diff --git a/src/main/resources/minecraft-tweaks-2a03.mixins.json b/src/main/resources/minecraft-tweaks-2a03.mixins.json new file mode 100644 index 0000000..449b0cf --- /dev/null +++ b/src/main/resources/minecraft-tweaks-2a03.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "package": "party._2a03.mc.mixin", + "compatibilityLevel": "JAVA_8", + "server": [ + "MixinGameModeCommand", + "MixinTntEntity" + ], + "injectors": { + "defaultRequire": 1 + } +}