old-bugs

Minecraft: Better than Adventure! mod that brings back bugs from older versions
git clone git://memoryshards.xyz/old-bugs.git
Log | Files | Refs | README | LICENSE

commit 2ac495ef83e319fce1fa38ccf8a080e291ab6f7b
parent dcd58397b0d29bd5971cc1dfc18616c334589425
Author: BuildTools <unconfigured@null.spigotmc.org>
Date:   Mon,  6 Feb 2023 22:16:42 +0300

Add settings file

Diffstat:
Mbuild.gradle | 3+++
Mgradle.properties | 2+-
Dsrc/main/java/eosl/minecart_boosters_fix/BoatWaterLift.java | 17-----------------
Dsrc/main/java/eosl/minecart_boosters_fix/LadderGaps.java | 29-----------------------------
Dsrc/main/java/eosl/minecart_boosters_fix/MinecartBooster.java | 21---------------------
Dsrc/main/java/eosl/minecart_boosters_fix/OldFireSpread.java | 41-----------------------------------------
Dsrc/main/java/eosl/minecart_boosters_fix/SouthEastRuleForLiquids.java | 37-------------------------------------
Asrc/main/java/eosl/nostalgic_bugs/NostalgicBugsMod.java | 45+++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/eosl/nostalgic_bugs/Settings.java | 179+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/eosl/nostalgic_bugs/features/BoatWaterLift.java | 21+++++++++++++++++++++
Asrc/main/java/eosl/nostalgic_bugs/features/LadderGaps.java | 34++++++++++++++++++++++++++++++++++
Asrc/main/java/eosl/nostalgic_bugs/features/MinecartBooster.java | 25+++++++++++++++++++++++++
Asrc/main/java/eosl/nostalgic_bugs/features/OldFireSpread.java | 43+++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/eosl/nostalgic_bugs/features/SouthEastRuleForLiquids.java | 44++++++++++++++++++++++++++++++++++++++++++++
Msrc/main/resources/fabric.mod.json | 7++++++-
Msrc/main/resources/nostalgic_bugs.mixins.json | 2+-
16 files changed, 402 insertions(+), 148 deletions(-)

diff --git a/build.gradle b/build.gradle @@ -55,6 +55,9 @@ dependencies { modRuntimeOnly "objects:client:43db9b498cb67058d2e12d394e6507722e71bb45" // https://piston-data.mojang.com/v1/objects/43db9b498cb67058d2e12d394e6507722e71bb45/client.jar modImplementation "babric:fabric-loader:${project.loader_version}" + + modImplementation "org.slf4j:slf4j-api:1.8.0-beta4" + modImplementation "org.apache.logging.log4j:log4j-slf4j18-impl:2.16.0" } java { diff --git a/gradle.properties b/gradle.properties @@ -14,6 +14,6 @@ loader_version=0.14.6-babric.1 halplibe_version=1.1.3 # Mod -mod_version=1.1 +mod_version=1.2 mod_group=eosl mod_name=nostalgic_bugs diff --git a/src/main/java/eosl/minecart_boosters_fix/BoatWaterLift.java b/src/main/java/eosl/minecart_boosters_fix/BoatWaterLift.java @@ -1,17 +0,0 @@ -package eosl.minecart_boosters_fix; - -import net.minecraft.src.*; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; - - -@Mixin(value = EntityBoat.class, remap = false) -public class BoatWaterLift -{ - @ModifyConstant(method = "onUpdate", constant = @Constant(doubleValue = 1.0, ordinal = 1)) - private double dConditionDestroyer(double d) - { - return Double.MAX_VALUE; - } -} diff --git a/src/main/java/eosl/minecart_boosters_fix/LadderGaps.java b/src/main/java/eosl/minecart_boosters_fix/LadderGaps.java @@ -1,29 +0,0 @@ -package eosl.minecart_boosters_fix; - -import net.minecraft.src.Block; -import net.minecraft.src.EntityLiving; -import net.minecraft.src.MathHelper; -import org.jetbrains.annotations.NotNull; -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.CallbackInfoReturnable; - - -@Mixin(value = EntityLiving.class, remap = false) -public class LadderGaps -{ - @Inject(method = "isOnLadder", at = @At("HEAD"), cancellable = true) - public void increaseLadderCoverage(@NotNull CallbackInfoReturnable<Boolean> cir) - { - EntityLiving self = ((EntityLiving) ((Object) this)); - int i = MathHelper.floor_double(self.posX); - int j = MathHelper.floor_double(self.boundingBox.minY); - int k = MathHelper.floor_double(self.posZ); - - int id1 = self.worldObj.getBlockId(i, j, k); - int id2 = self.worldObj.getBlockId(i, j + 1, k); - - cir.setReturnValue(id1 == Block.ladderOak.blockID || id2 == Block.ladderOak.blockID); - } -} diff --git a/src/main/java/eosl/minecart_boosters_fix/MinecartBooster.java b/src/main/java/eosl/minecart_boosters_fix/MinecartBooster.java @@ -1,21 +0,0 @@ -package eosl.minecart_boosters_fix; - -import net.minecraft.src.*; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - - -@Mixin(value = EntityMinecart.class, remap = false) -public class MinecartBooster -{ - @ModifyVariable( - method = "applyEntityCollision", - at = @At(value = "STORE"), - ordinal = 6 - ) - private double d6ConditionDestroyer(double d6) - { - return 0; - } -} diff --git a/src/main/java/eosl/minecart_boosters_fix/OldFireSpread.java b/src/main/java/eosl/minecart_boosters_fix/OldFireSpread.java @@ -1,41 +0,0 @@ -package eosl.minecart_boosters_fix; - -import net.minecraft.src.Block; -import net.minecraft.src.BlockFire; -import net.minecraft.src.World; -import org.jetbrains.annotations.NotNull; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.*; - - -/* - * Thanks to Amb0s for the code: https://github.com/Amb0s - */ -@Mixin(value = BlockFire.class, remap = false) -public class OldFireSpread -{ - @ModifyConstant(method = "tickRate", constant = @Constant(intValue = 40)) - private int changeTickRate(int a) - { - // It is 10 in beta before 1.6: - return 10; - } - - - @Redirect(method = "tryToCatchBlockOnFire", at = @At(value = "INVOKE", - target = "Lnet/minecraft/src/World;setBlockAndMetadataWithNotify(IIIII)Z")) - private boolean infiniteSpreading(@NotNull World world, int x, int y, int z, int id, int meta) - { - // Make new fire blocks spawn with zero old: - world.setBlockAndMetadataWithNotify(x, y, z, Block.fire.blockID, 0); - return false; - } - - - @Redirect(method = "tryToCatchBlockOnFire", at = @At(value = "INVOKE", - target = "Lnet/minecraft/src/BlockFire;setBurnResult(Lnet/minecraft/src/World;III)V")) - private void cancelSetBurnResult(BlockFire instance, World world, int x, int y, int z) - { - // Remove a chance to burn a block before the fire block old will reach 15. - } -} diff --git a/src/main/java/eosl/minecart_boosters_fix/SouthEastRuleForLiquids.java b/src/main/java/eosl/minecart_boosters_fix/SouthEastRuleForLiquids.java @@ -1,37 +0,0 @@ -package eosl.minecart_boosters_fix; - -import net.minecraft.src.AxisAlignedBB; -import net.minecraft.src.Entity; -import net.minecraft.src.Material; -import org.jetbrains.annotations.NotNull; -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.CallbackInfoReturnable; - - -@Mixin(value = Entity.class, remap = false) -public class SouthEastRuleForLiquids -{ - @Inject(method = "handleWaterMovement", at = @At("HEAD"), cancellable = true) - private void waterInject(@NotNull CallbackInfoReturnable<Boolean> cir) - { - // Just remove negative expanding of aabb: - Entity self = ((Entity) ((Object) this)); - AxisAlignedBB aabb = self.boundingBox.expand(0.0, -0.4000000059604645, 0.0); - boolean res = self.worldObj.handleMaterialAcceleration(aabb, Material.water, self); - cir.setReturnValue(res); - } - - - @Inject(method = "handleLavaMovement", at = @At("HEAD"), cancellable = true) - private void lavaInject(@NotNull CallbackInfoReturnable<Boolean> cir) - { - // Just remove negative expanding of aabb: - Entity self = ((Entity) ((Object) this)); - AxisAlignedBB aabb = self.boundingBox.expand(0.0, -0.4000000059604645, 0.0); - boolean res = self.worldObj.isMaterialInBB(aabb, Material.lava); - cir.setReturnValue(res); - } - -} diff --git a/src/main/java/eosl/nostalgic_bugs/NostalgicBugsMod.java b/src/main/java/eosl/nostalgic_bugs/NostalgicBugsMod.java @@ -0,0 +1,45 @@ +package eosl.nostalgic_bugs; + +import net.fabricmc.api.ModInitializer; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; + + +public class NostalgicBugsMod implements ModInitializer +{ + public static final Logger g_logger = LoggerFactory.getLogger("nostalgic_bugs"); + private static final String g_settingsFileName = "./nostalgic_bugs.cfg"; + public static @NotNull Settings g_settings = new Settings(); + + + @Override + public void onInitialize() + { + reset(); + } + + + public static void reset() + { + File file = new File(g_settingsFileName); + + try { + if (file.createNewFile()) { + g_logger.info("Create default settings file [" + g_settingsFileName + "]"); + g_settings = new Settings(); + g_settings.write(new FileWriter(file)); + } + else { + g_logger.info("Using setting file [" + g_settingsFileName + "]"); + g_settings = new Settings(new FileReader(file)); + } + } catch (IOException e) { + g_settings = new Settings(); + g_logger.error("Can not read settings file [" + g_settingsFileName + "]. The default one is using now"); + } + } + +} diff --git a/src/main/java/eosl/nostalgic_bugs/Settings.java b/src/main/java/eosl/nostalgic_bugs/Settings.java @@ -0,0 +1,179 @@ +package eosl.nostalgic_bugs; + +import net.minecraft.src.NBTTagCompound; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Range; + +import java.io.*; +import java.util.Properties; + + +// Can't use GameSettings and Option classes, so I need to write own little code: +public class Settings +{ + public final boolean m_boatWaterLift; + public final boolean m_ladderGaps; + public final boolean m_minecartBoosters; + public final boolean m_southEastRuleForLiquids; + @Range(from = 0, to = Integer.MAX_VALUE) + public final int m_fireTickRate; + public final boolean m_infiniteFireSpread; + + + /** + * Get default settings. + */ + public Settings() + { + m_boatWaterLift = true; + m_ladderGaps = true; + m_minecartBoosters = true; + m_southEastRuleForLiquids = true; + m_fireTickRate = 10; + m_infiniteFireSpread = true; + } + + + /** + * Get settings from a Reader. + * @param a_settings Reader. + */ + public Settings(@NotNull Reader a_settings) throws IOException + { + Properties properties = new Properties(); + properties.load(a_settings); + + m_boatWaterLift = getProperty(properties, "boatWaterLift", true); + m_ladderGaps = getProperty(properties, "ladderGaps", true); + m_minecartBoosters = getProperty(properties, "minecartBoosters", true); + m_southEastRuleForLiquids = getProperty(properties, "southEastRuleForLiquids", true); + int fireTickRate = getProperty(properties, "fireTickRate", 10); + m_infiniteFireSpread = getProperty(properties, "infiniteFireSpread", true); + + if (fireTickRate < 0) { + NostalgicBugsMod.g_logger.error("Option [" + "fireTickRate" + "] is negative"); + m_fireTickRate = 10; + } + else + m_fireTickRate = fireTickRate; + } + + + /** + * Get settings from an NBT. + * @param a_settings An NBT. + */ + @SuppressWarnings("unused") // for the future + public Settings(@NotNull NBTTagCompound a_settings) + { + m_boatWaterLift = getProperty(a_settings, "boatWaterLift", true); + m_ladderGaps = getProperty(a_settings, "ladderGaps", true); + m_minecartBoosters = getProperty(a_settings, "minecartBoosters", true); + m_southEastRuleForLiquids = getProperty(a_settings, "southEastRuleForLiquids", true); + int fireTickRate = getProperty(a_settings, "fireTickRate", 10); + m_infiniteFireSpread = getProperty(a_settings, "infiniteFireSpread", true); + + if (fireTickRate < 0) { + NostalgicBugsMod.g_logger.error("Option [" + "fireTickRate" + "] is negative"); + m_fireTickRate = 10; + } + else + m_fireTickRate = fireTickRate; + } + + + public void write(@NotNull Writer a_settings) throws IOException + { + Properties properties = new Properties(); + + properties.setProperty("boatWaterLift", String.valueOf(m_boatWaterLift)); + properties.setProperty("ladderGaps", String.valueOf(m_ladderGaps)); + properties.setProperty("minecartBoosters", String.valueOf(m_minecartBoosters)); + properties.setProperty("southEastRuleForLiquids", String.valueOf(m_southEastRuleForLiquids)); + properties.setProperty("fireTickRate", String.valueOf(m_fireTickRate)); + properties.setProperty("infiniteFireSpread", String.valueOf(m_infiniteFireSpread)); + + properties.store(a_settings, null); + } + + + /** + * Write the settings into an NBT. + * @param a_settings An NBT. + */ + @SuppressWarnings("unused") // for the future + public void writeToNBT(@NotNull NBTTagCompound a_settings) + { + a_settings.setBoolean("boatWaterLift", m_boatWaterLift); + a_settings.setBoolean("ladderGaps", m_ladderGaps); + a_settings.setBoolean("minecartBoosters", m_minecartBoosters); + a_settings.setBoolean("southEastRuleForLiquids", m_southEastRuleForLiquids); + a_settings.setInteger("fireTickRate", m_fireTickRate); + a_settings.setBoolean("infiniteFireSpread", m_infiniteFireSpread); + } + + + @SuppressWarnings("SameParameterValue") + private static boolean getProperty( + @NotNull Properties a_properties, + @NotNull String a_key, + boolean a_defaultValue) + { + String res = a_properties.getProperty(a_key); + + if (res == null) { + NostalgicBugsMod.g_logger.error("Missing [" + a_key + "] param in client settings"); + return a_defaultValue; + } + + return Boolean.parseBoolean(res); + } + + + @SuppressWarnings("SameParameterValue") + private static int getProperty( + @NotNull Properties a_properties, + @NotNull String a_key, + @Range(from = 0, to = Integer.MAX_VALUE) int a_defaultValue) + { + String res = a_properties.getProperty(a_key); + + if (res == null) { + NostalgicBugsMod.g_logger.error("Missing [" + a_key + "] param in client settings"); + return a_defaultValue; + } + + return Integer.parseInt(res); + } + + + @SuppressWarnings("SameParameterValue") + private static boolean getProperty( + @NotNull NBTTagCompound a_properties, + @NotNull String a_key, + boolean a_defaultValue) + { + if (!a_properties.hasKey(a_key)) { + NostalgicBugsMod.g_logger.error("Missing [" + a_key + "] param in server settings"); + return a_defaultValue; + } + + return a_properties.getBoolean(a_key); + } + + + @SuppressWarnings("SameParameterValue") + private static int getProperty( + @NotNull NBTTagCompound a_properties, + @NotNull String a_key, + @Range(from = 0, to = Integer.MAX_VALUE) int a_defaultValue) + { + if (!a_properties.hasKey(a_key)) { + NostalgicBugsMod.g_logger.error("Missing [" + a_key + "] param in server settings"); + return a_defaultValue; + } + + return a_properties.getInteger(a_key); + } +} + diff --git a/src/main/java/eosl/nostalgic_bugs/features/BoatWaterLift.java b/src/main/java/eosl/nostalgic_bugs/features/BoatWaterLift.java @@ -0,0 +1,21 @@ +package eosl.nostalgic_bugs.features; + +import eosl.nostalgic_bugs.NostalgicBugsMod; +import net.minecraft.src.*; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + + +@Mixin(value = EntityBoat.class, remap = false) +public class BoatWaterLift +{ + @ModifyConstant(method = "onUpdate", constant = @Constant(doubleValue = 1.0, ordinal = 1)) + private double dConditionDestroyer(double d) + { + if (NostalgicBugsMod.g_settings.m_boatWaterLift) + return Double.MAX_VALUE; + else + return d; + } +} diff --git a/src/main/java/eosl/nostalgic_bugs/features/LadderGaps.java b/src/main/java/eosl/nostalgic_bugs/features/LadderGaps.java @@ -0,0 +1,34 @@ +package eosl.nostalgic_bugs.features; + +import eosl.nostalgic_bugs.NostalgicBugsMod; +import net.minecraft.src.Block; +import net.minecraft.src.EntityLiving; +import net.minecraft.src.MathHelper; +import org.jetbrains.annotations.NotNull; +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.CallbackInfoReturnable; + + +@Mixin(value = EntityLiving.class, remap = false) +public class LadderGaps +{ + @Inject(method = "isOnLadder", at = @At("HEAD"), cancellable = true) + public void increaseLadderCoverage(@NotNull CallbackInfoReturnable<Boolean> cir) + { + if (!NostalgicBugsMod.g_settings.m_ladderGaps) + return; + + EntityLiving self = ((EntityLiving) ((Object) this)); + int x = MathHelper.floor_double(self.posX); + int yd = MathHelper.floor_double(self.boundingBox.minY); + int yu = MathHelper.floor_double(self.boundingBox.maxY); + int z = MathHelper.floor_double(self.posZ); + + int id1 = self.worldObj.getBlockId(x, yd, z); + int id2 = self.worldObj.getBlockId(x, yu, z); + + cir.setReturnValue(id1 == Block.ladderOak.blockID || id2 == Block.ladderOak.blockID); + } +} diff --git a/src/main/java/eosl/nostalgic_bugs/features/MinecartBooster.java b/src/main/java/eosl/nostalgic_bugs/features/MinecartBooster.java @@ -0,0 +1,25 @@ +package eosl.nostalgic_bugs.features; + +import eosl.nostalgic_bugs.NostalgicBugsMod; +import net.minecraft.src.*; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + + +@Mixin(value = EntityMinecart.class, remap = false) +public class MinecartBooster +{ + @ModifyVariable( + method = "applyEntityCollision", + at = @At(value = "STORE"), + ordinal = 6 + ) + private double d6ConditionDestroyer(double d6) + { + if (NostalgicBugsMod.g_settings.m_minecartBoosters) + return 0; + else + return d6; + } +} diff --git a/src/main/java/eosl/nostalgic_bugs/features/OldFireSpread.java b/src/main/java/eosl/nostalgic_bugs/features/OldFireSpread.java @@ -0,0 +1,43 @@ +package eosl.nostalgic_bugs.features; + +import eosl.nostalgic_bugs.NostalgicBugsMod; +import net.minecraft.src.Block; +import net.minecraft.src.BlockFire; +import net.minecraft.src.World; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.*; + + +/* + * Thanks to Amb0s for the code: https://github.com/Amb0s + */ +@Mixin(value = BlockFire.class, remap = false) +public class OldFireSpread +{ + @ModifyConstant(method = "tickRate", constant = @Constant(intValue = 40)) + private int changeTickRate(int a) + { + // It is 10 in beta before 1.6: + return NostalgicBugsMod.g_settings.m_fireTickRate; + } + + + @Redirect(method = "tryToCatchBlockOnFire", at = @At(value = "INVOKE", + target = "Lnet/minecraft/src/World;setBlockAndMetadataWithNotify(IIIII)Z")) + private boolean infiniteSpreading(@NotNull World world, int x, int y, int z, int id, int meta) + { + // Make new fire blocks spawn with zero old: + if (NostalgicBugsMod.g_settings.m_infiniteFireSpread) + world.setBlockAndMetadataWithNotify(x, y, z, Block.fire.blockID, 0); + return false; + } + + + @Redirect(method = "tryToCatchBlockOnFire", at = @At(value = "INVOKE", + target = "Lnet/minecraft/src/BlockFire;setBurnResult(Lnet/minecraft/src/World;III)V")) + private void cancelSetBurnResult(BlockFire instance, World world, int x, int y, int z) + { + // Remove a chance to burn a block before the fire block old will reach 15. + } +} diff --git a/src/main/java/eosl/nostalgic_bugs/features/SouthEastRuleForLiquids.java b/src/main/java/eosl/nostalgic_bugs/features/SouthEastRuleForLiquids.java @@ -0,0 +1,44 @@ +package eosl.nostalgic_bugs.features; + +import eosl.nostalgic_bugs.NostalgicBugsMod; +import net.minecraft.src.AxisAlignedBB; +import net.minecraft.src.Entity; +import net.minecraft.src.Material; +import org.jetbrains.annotations.NotNull; +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.CallbackInfoReturnable; + + +@Mixin(value = Entity.class, remap = false) +public class SouthEastRuleForLiquids +{ + @Inject(method = "handleWaterMovement", at = @At("HEAD"), cancellable = true) + private void waterInject(@NotNull CallbackInfoReturnable<Boolean> cir) + { + if (!NostalgicBugsMod.g_settings.m_southEastRuleForLiquids) + return; + + // Just remove negative expanding of aabb: + Entity self = ((Entity) ((Object) this)); + AxisAlignedBB aabb = self.boundingBox.expand(0.0, -0.4000000059604645, 0.0); + boolean res = self.worldObj.handleMaterialAcceleration(aabb, Material.water, self); + cir.setReturnValue(res); + } + + + @Inject(method = "handleLavaMovement", at = @At("HEAD"), cancellable = true) + private void lavaInject(@NotNull CallbackInfoReturnable<Boolean> cir) + { + if (!NostalgicBugsMod.g_settings.m_southEastRuleForLiquids) + return; + + // Just remove negative expanding of aabb: + Entity self = ((Entity) ((Object) this)); + AxisAlignedBB aabb = self.boundingBox.expand(0.0, -0.4000000059604645, 0.0); + boolean res = self.worldObj.isMaterialInBB(aabb, Material.lava); + cir.setReturnValue(res); + } + +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json @@ -7,11 +7,16 @@ "authors": ["eosl"], "contact": { "homepage": "", - "sources": "", + "sources": "https://github.com/EOfSL/bta-old-nostalgic-bugs", "steam": "https://steamcommunity.com/id/true_eosl/" }, "license": "CC0-1.0", "environment": "*", + "entrypoints": { + "main": [ + "eosl.nostalgic_bugs.NostalgicBugsMod" + ] + }, "mixins": [ "nostalgic_bugs.mixins.json" ], diff --git a/src/main/resources/nostalgic_bugs.mixins.json b/src/main/resources/nostalgic_bugs.mixins.json @@ -1,7 +1,7 @@ { "required": true, "minVersion": "0.8", - "package": "eosl.minecart_boosters_fix", + "package": "eosl.nostalgic_bugs.features", "compatibilityLevel": "JAVA_8", "mixins": [ "BoatWaterLift",