commit 26e6077a800ace8528f765d66d6323ed60708473 Author: Ryan Fox (flewkey) Date: Tue Jan 7 15:53:42 2020 +0000 Initial commit 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 0000000..3174d86 Binary files /dev/null and b/src/main/resources/assets/minecraft-tweaks-2a03/icon.png differ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..485e9a3 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,30 @@ +{ + "schemaVersion": 1, + "id": "minecraft-tweaks-2a03", + "version": "1.0.0", + "name": "2a03.party Tweaks", + "description": "Simple modifications for the 2a03.party Minecraft server.", + "authors": [ + "flewkey" + ], + "contact": { + "homepage": "https://flewkey.com/", + "sources": "https://github.com/flewkey/minecraft-tweaks-2a03" + }, + "license": "MIT", + "icon": "assets/2a03-minecraft-tweaks/icon.png", + "environment": "*", + "entrypoints": { + "main": [ + "party._2a03.mc.MinecraftTweaks2a03" + ] + }, + "mixins": [ + "minecraft-tweaks-2a03.mixins.json" + ], + "depends": { + "fabricloader": ">=0.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 + } +}