From d1b56bd8b42880396f0f54c47c854fcc0d4a92b9 Mon Sep 17 00:00:00 2001 From: EarlOfBerkeley Date: Sun, 8 Feb 2026 09:55:47 -0800 Subject: [PATCH 1/4] Added all 1.18 mixins except for TNTBlock as it's obsolete. --- .../config/WesterosCraftConfig.java | 42 +++++++++++++++++++ .../westeroscraft/mixin/BambooBlockMixin.java | 2 +- .../westeroscraft/mixin/CactusBlockMixin.java | 40 ++++++++++++++++++ .../westeroscraft/mixin/CropBlockMixin.java | 2 +- .../westeroscraft/mixin/DoorBlockMixin.java | 2 +- .../mixin/FallingBlockMixin.java | 22 ++++++++++ .../westeroscraft/mixin/FarmBlockMixin.java | 24 +++++++++++ .../mixin/FenceGateBlockMixin.java | 2 +- .../westeroscraft/mixin/FoodDataMixin.java | 25 +++++++++++ .../mixin/FrostedIceBlockMixin.java | 34 +++++++++++++++ .../mixin/GrowingPlantHeadBlockMixin.java | 35 ++++++++++++++++ .../mixin/HangingEntityMixin.java | 26 ++++++++++++ .../westeroscraft/mixin/IceBlockMixin.java | 2 +- .../westeroscraft/mixin/ItemFrameMixin.java | 31 ++++++++++++++ .../westeroscraft/mixin/LeavesBlockMixin.java | 2 +- .../westeroscraft/mixin/LiquidBlockMixin.java | 2 +- .../westeroscraft/mixin/MinecartTNTMixin.java | 20 +++++++++ .../mixin/MushroomBlockMixin.java | 2 +- .../mixin/NetherWartBlockMixin.java | 33 +++++++++++++++ .../westeroscraft/mixin/PrimedTntMixin.java | 21 ++++++++++ .../mixin/ServerPlayerMixin.java | 2 +- .../mixin/SnowLayerBlockMixin.java | 2 +- .../mixin/SpreadingSnowyDirtBlockMixin.java | 2 +- .../westeroscraft/mixin/StemBlockMixin.java | 26 ++++++++++++ .../mixin/SugarCaneBlockMixin.java | 40 ++++++++++++++++++ .../mixin/TrapDoorBlockMixin.java | 2 +- .../westeroscraft/mixin/VineBlockMixin.java | 35 ++++++++++++++++ .../mixin/WitherSkullBlockMixin.java | 2 +- .../westeroscraft-essentials.mixins.json | 34 ++++++++++----- 29 files changed, 491 insertions(+), 23 deletions(-) create mode 100644 src/main/java/westeroscraft/mixin/CactusBlockMixin.java create mode 100644 src/main/java/westeroscraft/mixin/FallingBlockMixin.java create mode 100644 src/main/java/westeroscraft/mixin/FarmBlockMixin.java create mode 100644 src/main/java/westeroscraft/mixin/FoodDataMixin.java create mode 100644 src/main/java/westeroscraft/mixin/FrostedIceBlockMixin.java create mode 100644 src/main/java/westeroscraft/mixin/GrowingPlantHeadBlockMixin.java create mode 100644 src/main/java/westeroscraft/mixin/HangingEntityMixin.java create mode 100644 src/main/java/westeroscraft/mixin/ItemFrameMixin.java create mode 100644 src/main/java/westeroscraft/mixin/MinecartTNTMixin.java create mode 100644 src/main/java/westeroscraft/mixin/NetherWartBlockMixin.java create mode 100644 src/main/java/westeroscraft/mixin/PrimedTntMixin.java create mode 100644 src/main/java/westeroscraft/mixin/StemBlockMixin.java create mode 100644 src/main/java/westeroscraft/mixin/SugarCaneBlockMixin.java create mode 100644 src/main/java/westeroscraft/mixin/VineBlockMixin.java diff --git a/src/main/java/westeroscraft/config/WesterosCraftConfig.java b/src/main/java/westeroscraft/config/WesterosCraftConfig.java index 797b31a..3c984b2 100644 --- a/src/main/java/westeroscraft/config/WesterosCraftConfig.java +++ b/src/main/java/westeroscraft/config/WesterosCraftConfig.java @@ -24,6 +24,20 @@ public class WesterosCraftConfig { public static boolean cropSurviveAny = false; public static boolean disableBambooSpread = false; public static boolean bambooSurviveAny = false; + public static boolean disableCactusGrowth = false; + public static boolean cactusSurviveAny = false; + public static boolean disableFallingBlocks = false; + public static boolean disableFarmStomping = false; + public static boolean disableHunger = false; + public static boolean disablePlantGrowFade = false; + public static boolean blockHangingItemChanges = false; + public static boolean disableTNTExplode = false; + public static boolean disableNetherWartGrowFade = false; + public static boolean disableStemGrowFade = false; + public static boolean disableSugarCaneGrowFade = false; + public static boolean sugarCaneSurviveAny = false; + public static boolean disableVineGrowFade = false; + public static boolean vineSurviveAny = false; public static boolean disableGrassSpread = false; public static boolean disableFluidTicking = false; public static boolean blockWitherSpawn = false; @@ -59,6 +73,20 @@ private static class ConfigData { boolean disableMushroomGrowFade = true; boolean mushroomSurviveAny = true; boolean forceAdventureMode = true; + boolean disableCactusGrowth = true; + boolean cactusSurviveAny = true; + boolean disableFallingBlocks = true; + boolean disableFarmStomping = true; + boolean disableHunger = true; + boolean disablePlantGrowFade = true; + boolean blockHangingItemChanges = true; + boolean disableTNTExplode = true; + boolean disableNetherWartGrowFade = true; + boolean disableStemGrowFade = true; + boolean disableSugarCaneGrowFade = true; + boolean sugarCaneSurviveAny = true; + boolean disableVineGrowFade = true; + boolean vineSurviveAny = true; AutoRestoreConfig autoRestore = new AutoRestoreConfig(); } @@ -78,6 +106,20 @@ public static void load() { cropSurviveAny = data.cropSurviveAny; disableBambooSpread = data.disableBambooSpread; bambooSurviveAny = data.bambooSurviveAny; + disableCactusGrowth = data.disableCactusGrowth; + cactusSurviveAny = data.cactusSurviveAny; + disableFallingBlocks = data.disableFallingBlocks; + disableFarmStomping = data.disableFarmStomping; + disableHunger = data.disableHunger; + disablePlantGrowFade = data.disablePlantGrowFade; + blockHangingItemChanges = data.blockHangingItemChanges; + disableTNTExplode = data.disableTNTExplode; + disableNetherWartGrowFade = data.disableNetherWartGrowFade; + disableStemGrowFade = data.disableStemGrowFade; + disableSugarCaneGrowFade = data.disableSugarCaneGrowFade; + sugarCaneSurviveAny = data.sugarCaneSurviveAny; + disableVineGrowFade = data.disableVineGrowFade; + vineSurviveAny = data.vineSurviveAny; disableGrassSpread = data.disableGrassSpread; disableFluidTicking = data.disableFluidTicking; blockWitherSpawn = data.blockWitherSpawn; diff --git a/src/main/java/westeroscraft/mixin/BambooBlockMixin.java b/src/main/java/westeroscraft/mixin/BambooBlockMixin.java index e4856d0..e3e6087 100644 --- a/src/main/java/westeroscraft/mixin/BambooBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/BambooBlockMixin.java @@ -14,7 +14,7 @@ import westeroscraft.config.WesterosCraftConfig; @Mixin(BambooStalkBlock.class) -public class BambooBlockMixin { +public abstract class BambooBlockMixin { @Inject(method = "tick", at = @At("HEAD"), cancellable = true) private void onTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random, CallbackInfo ci) { if (WesterosCraftConfig.disableBambooSpread) { diff --git a/src/main/java/westeroscraft/mixin/CactusBlockMixin.java b/src/main/java/westeroscraft/mixin/CactusBlockMixin.java new file mode 100644 index 0000000..7469da0 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/CactusBlockMixin.java @@ -0,0 +1,40 @@ +package westeroscraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.CactusBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(CactusBlock.class) +public abstract class CactusBlockMixin { + protected CactusBlockMixin() {} + + @Inject(method = "tick", at = @At("HEAD"), cancellable = true) + private void onTick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, CallbackInfo ci) { + if(WesterosCraftConfig.disableCactusGrowth) { + ci.cancel(); + } + } + + @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) + private void onRandomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random, CallbackInfo ci) { + if (WesterosCraftConfig.disableCactusGrowth) { + ci.cancel(); + } + } + + @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) + private void onCanSurvive(BlockState state, LevelReader level, BlockPos pos, CallbackInfoReturnable cir) { + if (WesterosCraftConfig.cactusSurviveAny) { + cir.setReturnValue(true); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/CropBlockMixin.java b/src/main/java/westeroscraft/mixin/CropBlockMixin.java index 3586294..fb84e9a 100644 --- a/src/main/java/westeroscraft/mixin/CropBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/CropBlockMixin.java @@ -14,7 +14,7 @@ import westeroscraft.config.WesterosCraftConfig; @Mixin(CropBlock.class) -public class CropBlockMixin { +public abstract class CropBlockMixin { @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) private void onRandomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random, CallbackInfo ci) { if (WesterosCraftConfig.disableCropGrowth) { diff --git a/src/main/java/westeroscraft/mixin/DoorBlockMixin.java b/src/main/java/westeroscraft/mixin/DoorBlockMixin.java index a3fcee9..b2ed294 100644 --- a/src/main/java/westeroscraft/mixin/DoorBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/DoorBlockMixin.java @@ -18,7 +18,7 @@ import westeroscraft.restore.AutoRestoreManager; @Mixin(DoorBlock.class) -public class DoorBlockMixin { +public abstract class DoorBlockMixin { @Unique private static final ThreadLocal originalOpenState = new ThreadLocal<>(); diff --git a/src/main/java/westeroscraft/mixin/FallingBlockMixin.java b/src/main/java/westeroscraft/mixin/FallingBlockMixin.java new file mode 100644 index 0000000..2ef9640 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/FallingBlockMixin.java @@ -0,0 +1,22 @@ +package westeroscraft.mixin; + +import net.minecraft.world.level.block.FallingBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(FallingBlock.class) +public abstract class FallingBlockMixin { + + protected FallingBlockMixin() {} + + @Inject(method = "isFree", at = @At("HEAD"), cancellable=true) + private static void doIsFree(BlockState blockState, CallbackInfoReturnable ci) { + if (WesterosCraftConfig.disableFallingBlocks) { + ci.setReturnValue(Boolean.FALSE); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/FarmBlockMixin.java b/src/main/java/westeroscraft/mixin/FarmBlockMixin.java new file mode 100644 index 0000000..2991c32 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/FarmBlockMixin.java @@ -0,0 +1,24 @@ +package westeroscraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.FarmBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(FarmBlock.class) +public abstract class FarmBlockMixin { + protected FarmBlockMixin() {} + + @Inject(method = "turnToDirt", at = @At("HEAD"), cancellable = true) + private static void doTurnToDirt(Entity entity, BlockState blockState, Level level, BlockPos blockPos, CallbackInfo ci) { + if (WesterosCraftConfig.disableFarmStomping) { + ci.cancel(); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/FenceGateBlockMixin.java b/src/main/java/westeroscraft/mixin/FenceGateBlockMixin.java index 128c339..3775395 100644 --- a/src/main/java/westeroscraft/mixin/FenceGateBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/FenceGateBlockMixin.java @@ -18,7 +18,7 @@ import westeroscraft.restore.AutoRestoreManager; @Mixin(FenceGateBlock.class) -public class FenceGateBlockMixin { +public abstract class FenceGateBlockMixin { @Unique private static final ThreadLocal originalOpenState = new ThreadLocal<>(); diff --git a/src/main/java/westeroscraft/mixin/FoodDataMixin.java b/src/main/java/westeroscraft/mixin/FoodDataMixin.java new file mode 100644 index 0000000..2d82f1c --- /dev/null +++ b/src/main/java/westeroscraft/mixin/FoodDataMixin.java @@ -0,0 +1,25 @@ +package westeroscraft.mixin; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.food.FoodData; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(FoodData.class) +public abstract class FoodDataMixin { + @Shadow + private int foodLevel; + + protected FoodDataMixin() {} + + @Inject(method = "tick", at = @At("HEAD")) + private void doTick(Player player, CallbackInfo ci) { + if(WesterosCraftConfig.disableHunger) { + foodLevel = 20; + } + } +} diff --git a/src/main/java/westeroscraft/mixin/FrostedIceBlockMixin.java b/src/main/java/westeroscraft/mixin/FrostedIceBlockMixin.java new file mode 100644 index 0000000..4328c54 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/FrostedIceBlockMixin.java @@ -0,0 +1,34 @@ +package westeroscraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.FrostedIceBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import westeroscraft.config.WesterosCraftConfig; + + +@Mixin(FrostedIceBlock.class) +public abstract class FrostedIceBlockMixin { + protected FrostedIceBlockMixin() {} + + @Inject(method = "tick", at = @At("HEAD"), cancellable=true) + private void doTick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, CallbackInfo ci) { + if (WesterosCraftConfig.disableIceMelt) { + ci.cancel(); + } + } + + @Inject(method = "slightlyMelt", at = @At("HEAD"), cancellable=true) + private void doSlightlyMelt(BlockState bs, Level lvl, BlockPos pos, CallbackInfoReturnable ci) { + if (WesterosCraftConfig.disableIceMelt) { + ci.setReturnValue(Boolean.FALSE); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/GrowingPlantHeadBlockMixin.java b/src/main/java/westeroscraft/mixin/GrowingPlantHeadBlockMixin.java new file mode 100644 index 0000000..63e134c --- /dev/null +++ b/src/main/java/westeroscraft/mixin/GrowingPlantHeadBlockMixin.java @@ -0,0 +1,35 @@ +package westeroscraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.GrowingPlantHeadBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import westeroscraft.config.WesterosCraftConfig; + +import java.util.Random; + +@Mixin(GrowingPlantHeadBlock.class) +public abstract class GrowingPlantHeadBlockMixin { + protected GrowingPlantHeadBlockMixin() {} + + + @Inject(method = "randomTick", at = @At("HEAD"), cancellable=true) + private void doRandomTick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, CallbackInfo ci) { + if (WesterosCraftConfig.disablePlantGrowFade) { + ci.cancel(); + } + } + + @Inject(method = "isRandomlyTicking(Lnet/minecraft/world/level/block/state/BlockState;)Z", at = @At("HEAD"), cancellable=true) + private void doIsRandomlyTicking(BlockState bs, CallbackInfoReturnable ci) { + if (WesterosCraftConfig.disablePlantGrowFade) { + ci.setReturnValue(false); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/HangingEntityMixin.java b/src/main/java/westeroscraft/mixin/HangingEntityMixin.java new file mode 100644 index 0000000..4c83a79 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/HangingEntityMixin.java @@ -0,0 +1,26 @@ +package westeroscraft.mixin; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.BlockAttachedEntity; +import net.minecraft.world.entity.decoration.HangingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(HangingEntity.class) +public abstract class HangingEntityMixin extends BlockAttachedEntity { + protected HangingEntityMixin(EntityType et, Level l) { + super(et, l); + } + + @Override + public InteractionResult interact(Player player, InteractionHand hand) { + if ((!player.isCreative()) && WesterosCraftConfig.blockHangingItemChanges) { + return InteractionResult.CONSUME; + } + return super.interact(player, hand); + } +} diff --git a/src/main/java/westeroscraft/mixin/IceBlockMixin.java b/src/main/java/westeroscraft/mixin/IceBlockMixin.java index bef917b..a495bf3 100644 --- a/src/main/java/westeroscraft/mixin/IceBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/IceBlockMixin.java @@ -12,7 +12,7 @@ import westeroscraft.config.WesterosCraftConfig; @Mixin(IceBlock.class) -public class IceBlockMixin { +public abstract class IceBlockMixin { @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) private void onRandomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random, CallbackInfo ci) { if (WesterosCraftConfig.disableIceMelt) { diff --git a/src/main/java/westeroscraft/mixin/ItemFrameMixin.java b/src/main/java/westeroscraft/mixin/ItemFrameMixin.java new file mode 100644 index 0000000..f3d4ab8 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/ItemFrameMixin.java @@ -0,0 +1,31 @@ +package westeroscraft.mixin; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.entity.player.Player; +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; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(ItemFrame.class) +public abstract class ItemFrameMixin { + protected ItemFrameMixin() {} + + + @Inject(method = "interact", at = @At("HEAD"), cancellable=true) + private void doInteract(Player player, InteractionHand hand, CallbackInfoReturnable ci) { + if ((!player.isCreative()) && WesterosCraftConfig.blockHangingItemChanges) { + ci.setReturnValue(InteractionResult.CONSUME); + } + } + @Inject(method = "hurt", at = @At("HEAD"), cancellable=true) + private void doHurt(DamageSource src, float damage, CallbackInfoReturnable ci) { + if ((!src.isCreativePlayer()) && WesterosCraftConfig.blockHangingItemChanges) { + ci.setReturnValue(Boolean.FALSE); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/LeavesBlockMixin.java b/src/main/java/westeroscraft/mixin/LeavesBlockMixin.java index 5be9d87..5f17936 100644 --- a/src/main/java/westeroscraft/mixin/LeavesBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/LeavesBlockMixin.java @@ -13,7 +13,7 @@ import westeroscraft.config.WesterosCraftConfig; @Mixin(LeavesBlock.class) -public class LeavesBlockMixin { +public abstract class LeavesBlockMixin { @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) private void onRandomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random, CallbackInfo ci) { if (WesterosCraftConfig.doPreventLeafDecay) { diff --git a/src/main/java/westeroscraft/mixin/LiquidBlockMixin.java b/src/main/java/westeroscraft/mixin/LiquidBlockMixin.java index 04a873c..952e0c5 100644 --- a/src/main/java/westeroscraft/mixin/LiquidBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/LiquidBlockMixin.java @@ -14,7 +14,7 @@ import westeroscraft.config.WesterosCraftConfig; @Mixin(LiquidBlock.class) -public class LiquidBlockMixin { +public abstract class LiquidBlockMixin { @Inject(method = "isRandomlyTicking", at = @At("HEAD"), cancellable = true) private void onIsRandomlyTicking(BlockState state, CallbackInfoReturnable cir) { if (WesterosCraftConfig.disableFluidTicking) { diff --git a/src/main/java/westeroscraft/mixin/MinecartTNTMixin.java b/src/main/java/westeroscraft/mixin/MinecartTNTMixin.java new file mode 100644 index 0000000..ec827ae --- /dev/null +++ b/src/main/java/westeroscraft/mixin/MinecartTNTMixin.java @@ -0,0 +1,20 @@ +package westeroscraft.mixin; + +import net.minecraft.world.entity.vehicle.MinecartTNT; +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; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(MinecartTNT.class) +public abstract class MinecartTNTMixin { + protected MinecartTNTMixin() {} + + @Inject(method = "explode*", at = @At("HEAD"), cancellable=true) + private void doExplode(double radius, CallbackInfo ci) { + if (WesterosCraftConfig.disableTNTExplode) { + ci.cancel(); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/MushroomBlockMixin.java b/src/main/java/westeroscraft/mixin/MushroomBlockMixin.java index 23e4255..7cbc66c 100644 --- a/src/main/java/westeroscraft/mixin/MushroomBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/MushroomBlockMixin.java @@ -14,7 +14,7 @@ import westeroscraft.config.WesterosCraftConfig; @Mixin(MushroomBlock.class) -public class MushroomBlockMixin { +public abstract class MushroomBlockMixin { @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) private void onRandomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random, CallbackInfo ci) { if (WesterosCraftConfig.disableMushroomGrowFade) { diff --git a/src/main/java/westeroscraft/mixin/NetherWartBlockMixin.java b/src/main/java/westeroscraft/mixin/NetherWartBlockMixin.java new file mode 100644 index 0000000..cc40e94 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/NetherWartBlockMixin.java @@ -0,0 +1,33 @@ +package westeroscraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.NetherWartBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import westeroscraft.config.WesterosCraftConfig; + + +@Mixin(NetherWartBlock.class) +public abstract class NetherWartBlockMixin { + protected NetherWartBlockMixin() {} + + @Inject(method = "randomTick", at = @At("HEAD"), cancellable=true) + private void doRandomTick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, CallbackInfo ci) { + if (WesterosCraftConfig.disableNetherWartGrowFade) { + ci.cancel(); + } + } + + @Inject(method = "isRandomlyTicking(Lnet/minecraft/world/level/block/state/BlockState;)Z", at = @At("HEAD"), cancellable=true) + private void doIsRandomlyTicking(BlockState bs, CallbackInfoReturnable ci) { + if (WesterosCraftConfig.disableNetherWartGrowFade) { + ci.setReturnValue(false); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/PrimedTntMixin.java b/src/main/java/westeroscraft/mixin/PrimedTntMixin.java new file mode 100644 index 0000000..a946f15 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/PrimedTntMixin.java @@ -0,0 +1,21 @@ +package westeroscraft.mixin; + +import net.minecraft.world.entity.item.PrimedTnt; +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; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(PrimedTnt.class) +public abstract class PrimedTntMixin { + protected PrimedTntMixin() {} + + @Inject(method = "explode", at = @At("HEAD"), cancellable=true) + private void doExplode(CallbackInfo ci) { + if (WesterosCraftConfig.disableTNTExplode) { + ci.cancel(); + } + } + +} diff --git a/src/main/java/westeroscraft/mixin/ServerPlayerMixin.java b/src/main/java/westeroscraft/mixin/ServerPlayerMixin.java index fc8c662..f40e19d 100644 --- a/src/main/java/westeroscraft/mixin/ServerPlayerMixin.java +++ b/src/main/java/westeroscraft/mixin/ServerPlayerMixin.java @@ -9,7 +9,7 @@ import westeroscraft.adventure.GameModeEnforcer; @Mixin(ServerPlayer.class) -public class ServerPlayerMixin { +public abstract class ServerPlayerMixin { @Inject(method = "changeDimension", at = @At("RETURN")) private void onDimensionChange(DimensionTransition transition, diff --git a/src/main/java/westeroscraft/mixin/SnowLayerBlockMixin.java b/src/main/java/westeroscraft/mixin/SnowLayerBlockMixin.java index d1f49df..855444f 100644 --- a/src/main/java/westeroscraft/mixin/SnowLayerBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/SnowLayerBlockMixin.java @@ -14,7 +14,7 @@ import westeroscraft.config.WesterosCraftConfig; @Mixin(SnowLayerBlock.class) -public class SnowLayerBlockMixin { +public abstract class SnowLayerBlockMixin { @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) private void onRandomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random, CallbackInfo ci) { if (WesterosCraftConfig.disableSnowMelt) { diff --git a/src/main/java/westeroscraft/mixin/SpreadingSnowyDirtBlockMixin.java b/src/main/java/westeroscraft/mixin/SpreadingSnowyDirtBlockMixin.java index 0d6e091..5f3144a 100644 --- a/src/main/java/westeroscraft/mixin/SpreadingSnowyDirtBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/SpreadingSnowyDirtBlockMixin.java @@ -12,7 +12,7 @@ import westeroscraft.config.WesterosCraftConfig; @Mixin(SpreadingSnowyDirtBlock.class) -public class SpreadingSnowyDirtBlockMixin { +public abstract class SpreadingSnowyDirtBlockMixin { @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) private void onRandomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random, CallbackInfo ci) { if (WesterosCraftConfig.disableGrassSpread) { diff --git a/src/main/java/westeroscraft/mixin/StemBlockMixin.java b/src/main/java/westeroscraft/mixin/StemBlockMixin.java new file mode 100644 index 0000000..a185a38 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/StemBlockMixin.java @@ -0,0 +1,26 @@ +package westeroscraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.StemBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import westeroscraft.config.WesterosCraftConfig; + +import java.util.Random; + +@Mixin(StemBlock.class) +public abstract class StemBlockMixin { + protected StemBlockMixin() {} + + @Inject(method = "randomTick", at = @At("HEAD"), cancellable=true) + private void doRandomTick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, CallbackInfo ci) { + if (WesterosCraftConfig.disableStemGrowFade) { + ci.cancel(); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/SugarCaneBlockMixin.java b/src/main/java/westeroscraft/mixin/SugarCaneBlockMixin.java new file mode 100644 index 0000000..3fcd0fd --- /dev/null +++ b/src/main/java/westeroscraft/mixin/SugarCaneBlockMixin.java @@ -0,0 +1,40 @@ +package westeroscraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.SugarCaneBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(SugarCaneBlock.class) +public abstract class SugarCaneBlockMixin { + protected SugarCaneBlockMixin() {} + + @Inject(method = "tick", at = @At("HEAD"), cancellable=true) + private void doTick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, CallbackInfo ci) { + if (WesterosCraftConfig.disableSugarCaneGrowFade) { + ci.cancel(); + } + } + + @Inject(method = "randomTick", at = @At("HEAD"), cancellable=true) + private void doRandomTick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, CallbackInfo ci) { + if (WesterosCraftConfig.disableSugarCaneGrowFade) { + ci.cancel(); + } + } + + @Inject(method = "canSurvive", at = @At("HEAD"), cancellable=true) + private void doCanSurvive(BlockState bs, LevelReader lvl, BlockPos pos, CallbackInfoReturnable ci) { + if (WesterosCraftConfig.sugarCaneSurviveAny) { + ci.setReturnValue(true); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/TrapDoorBlockMixin.java b/src/main/java/westeroscraft/mixin/TrapDoorBlockMixin.java index afbd9d8..267f520 100644 --- a/src/main/java/westeroscraft/mixin/TrapDoorBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/TrapDoorBlockMixin.java @@ -18,7 +18,7 @@ import westeroscraft.restore.AutoRestoreManager; @Mixin(TrapDoorBlock.class) -public class TrapDoorBlockMixin { +public abstract class TrapDoorBlockMixin { @Unique private static final ThreadLocal originalOpenState = new ThreadLocal<>(); diff --git a/src/main/java/westeroscraft/mixin/VineBlockMixin.java b/src/main/java/westeroscraft/mixin/VineBlockMixin.java new file mode 100644 index 0000000..60d9067 --- /dev/null +++ b/src/main/java/westeroscraft/mixin/VineBlockMixin.java @@ -0,0 +1,35 @@ +package westeroscraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.VineBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import westeroscraft.config.WesterosCraftConfig; + +import java.util.Random; + +@Mixin(VineBlock.class) +public abstract class VineBlockMixin { + protected VineBlockMixin() {} + + @Inject(method = "randomTick", at = @At("HEAD"), cancellable=true) + private void doRandomTick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, CallbackInfo ci) { + if (WesterosCraftConfig.disableVineGrowFade) { + ci.cancel(); + } + } + + @Inject(method = "canSurvive(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;)Z", at = @At("HEAD"), cancellable=true) + private void doCanSurvive(BlockState bs, LevelReader lvl, BlockPos pos, CallbackInfoReturnable ci) { + if (WesterosCraftConfig.vineSurviveAny) { + ci.setReturnValue(true); + } + } +} diff --git a/src/main/java/westeroscraft/mixin/WitherSkullBlockMixin.java b/src/main/java/westeroscraft/mixin/WitherSkullBlockMixin.java index 999de94..0b39515 100644 --- a/src/main/java/westeroscraft/mixin/WitherSkullBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/WitherSkullBlockMixin.java @@ -11,7 +11,7 @@ import westeroscraft.config.WesterosCraftConfig; @Mixin(WitherSkullBlock.class) -public class WitherSkullBlockMixin { +public abstract class WitherSkullBlockMixin { @Inject(method = "checkSpawn(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/entity/SkullBlockEntity;)V", at = @At("HEAD"), cancellable = true) private static void onCheckSpawn(Level level, BlockPos pos, SkullBlockEntity skullBlockEntity, CallbackInfo ci) { if (WesterosCraftConfig.blockWitherSpawn) { diff --git a/src/main/resources/westeroscraft-essentials.mixins.json b/src/main/resources/westeroscraft-essentials.mixins.json index d78dab4..659ec53 100644 --- a/src/main/resources/westeroscraft-essentials.mixins.json +++ b/src/main/resources/westeroscraft-essentials.mixins.json @@ -3,21 +3,35 @@ "package": "westeroscraft.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ + "BambooBlockMixin", + "CactusBlockMixin", + "ClientLevelDataMixin", + "ClientLevelMixin", + "CropBlockMixin", + "DoorBlockMixin", + "FallingBlockMixin", + "FarmBlockMixin", + "FenceGateBlockMixin", + "FoodDataMixin", + "FrostedIceBlockMixin", + "GrowingPlantHeadBlockMixin", + "HangingEntityMixin", "IceBlockMixin", - "SnowLayerBlockMixin", - "SpreadingSnowyDirtBlockMixin", + "ItemFrameMixin", "LeavesBlockMixin", - "CropBlockMixin", - "BambooBlockMixin", "LiquidBlockMixin", + "MinecartTNTMixin", "MushroomBlockMixin", - "WitherSkullBlockMixin", - "DoorBlockMixin", - "TrapDoorBlockMixin", - "FenceGateBlockMixin", + "NetherWartBlockMixin", + "PrimedTntMixin", "ServerPlayerMixin", - "ClientLevelMixin", - "ClientLevelDataMixin" + "SnowLayerBlockMixin", + "SpreadingSnowyDirtBlockMixin", + "StemBlockMixin", + "SugarCaneBlockMixin", + "TrapDoorBlockMixin", + "VineBlockMixin", + "WitherSkullBlockMixin" ], "injectors": { "defaultRequire": 1 From bef5621b21b9ddfb832c4501ebcea46ee0f10793 Mon Sep 17 00:00:00 2001 From: EarlOfBerkeley Date: Sun, 8 Feb 2026 09:58:47 -0800 Subject: [PATCH 2/4] Removed warnings --- .../java/westeroscraft/mixin/GrowingPlantHeadBlockMixin.java | 2 -- src/main/java/westeroscraft/mixin/HangingEntityMixin.java | 3 ++- src/main/java/westeroscraft/mixin/StemBlockMixin.java | 2 -- src/main/java/westeroscraft/mixin/VineBlockMixin.java | 2 -- 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/westeroscraft/mixin/GrowingPlantHeadBlockMixin.java b/src/main/java/westeroscraft/mixin/GrowingPlantHeadBlockMixin.java index 63e134c..b0cb1b0 100644 --- a/src/main/java/westeroscraft/mixin/GrowingPlantHeadBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/GrowingPlantHeadBlockMixin.java @@ -12,8 +12,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import westeroscraft.config.WesterosCraftConfig; -import java.util.Random; - @Mixin(GrowingPlantHeadBlock.class) public abstract class GrowingPlantHeadBlockMixin { protected GrowingPlantHeadBlockMixin() {} diff --git a/src/main/java/westeroscraft/mixin/HangingEntityMixin.java b/src/main/java/westeroscraft/mixin/HangingEntityMixin.java index 4c83a79..9f10eb0 100644 --- a/src/main/java/westeroscraft/mixin/HangingEntityMixin.java +++ b/src/main/java/westeroscraft/mixin/HangingEntityMixin.java @@ -7,6 +7,7 @@ import net.minecraft.world.entity.decoration.HangingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import westeroscraft.config.WesterosCraftConfig; @@ -17,7 +18,7 @@ protected HangingEntityMixin(EntityType et, Level l) { } @Override - public InteractionResult interact(Player player, InteractionHand hand) { + public @NotNull InteractionResult interact(Player player, InteractionHand hand) { if ((!player.isCreative()) && WesterosCraftConfig.blockHangingItemChanges) { return InteractionResult.CONSUME; } diff --git a/src/main/java/westeroscraft/mixin/StemBlockMixin.java b/src/main/java/westeroscraft/mixin/StemBlockMixin.java index a185a38..8d3b046 100644 --- a/src/main/java/westeroscraft/mixin/StemBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/StemBlockMixin.java @@ -11,8 +11,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import westeroscraft.config.WesterosCraftConfig; -import java.util.Random; - @Mixin(StemBlock.class) public abstract class StemBlockMixin { protected StemBlockMixin() {} diff --git a/src/main/java/westeroscraft/mixin/VineBlockMixin.java b/src/main/java/westeroscraft/mixin/VineBlockMixin.java index 60d9067..e2ab6c6 100644 --- a/src/main/java/westeroscraft/mixin/VineBlockMixin.java +++ b/src/main/java/westeroscraft/mixin/VineBlockMixin.java @@ -13,8 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import westeroscraft.config.WesterosCraftConfig; -import java.util.Random; - @Mixin(VineBlock.class) public abstract class VineBlockMixin { protected VineBlockMixin() {} From db0406cd2229c8698b31cbda8fccd7f945433c76 Mon Sep 17 00:00:00 2001 From: EarlOfBerkeley Date: Sun, 8 Feb 2026 12:21:04 -0800 Subject: [PATCH 3/4] Added a Dripstone Mixin to prevent Mud drying and lava farming --- .../config/WesterosCraftConfig.java | 3 +++ .../mixin/PointedDripstoneBlockMixin.java | 22 +++++++++++++++++++ .../westeroscraft-essentials.mixins.json | 1 + 3 files changed, 26 insertions(+) create mode 100644 src/main/java/westeroscraft/mixin/PointedDripstoneBlockMixin.java diff --git a/src/main/java/westeroscraft/config/WesterosCraftConfig.java b/src/main/java/westeroscraft/config/WesterosCraftConfig.java index 3c984b2..1e74c3e 100644 --- a/src/main/java/westeroscraft/config/WesterosCraftConfig.java +++ b/src/main/java/westeroscraft/config/WesterosCraftConfig.java @@ -38,6 +38,7 @@ public class WesterosCraftConfig { public static boolean sugarCaneSurviveAny = false; public static boolean disableVineGrowFade = false; public static boolean vineSurviveAny = false; + public static boolean disableDripstoneTransfer = false; public static boolean disableGrassSpread = false; public static boolean disableFluidTicking = false; public static boolean blockWitherSpawn = false; @@ -87,6 +88,7 @@ private static class ConfigData { boolean sugarCaneSurviveAny = true; boolean disableVineGrowFade = true; boolean vineSurviveAny = true; + boolean disableDripstoneTransfer = true; AutoRestoreConfig autoRestore = new AutoRestoreConfig(); } @@ -120,6 +122,7 @@ public static void load() { sugarCaneSurviveAny = data.sugarCaneSurviveAny; disableVineGrowFade = data.disableVineGrowFade; vineSurviveAny = data.vineSurviveAny; + disableDripstoneTransfer = data.disableDripstoneTransfer; disableGrassSpread = data.disableGrassSpread; disableFluidTicking = data.disableFluidTicking; blockWitherSpawn = data.blockWitherSpawn; diff --git a/src/main/java/westeroscraft/mixin/PointedDripstoneBlockMixin.java b/src/main/java/westeroscraft/mixin/PointedDripstoneBlockMixin.java new file mode 100644 index 0000000..38f4b6d --- /dev/null +++ b/src/main/java/westeroscraft/mixin/PointedDripstoneBlockMixin.java @@ -0,0 +1,22 @@ +package westeroscraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.PointedDripstoneBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import westeroscraft.config.WesterosCraftConfig; + +@Mixin(PointedDripstoneBlock.class) +public abstract class PointedDripstoneBlockMixin { + + @Inject(method = "maybeTransferFluid", at = @At("HEAD"), cancellable = true) + private static void doMaybeTransferFluid(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, float f, CallbackInfo ci) { + if (WesterosCraftConfig.disableDripstoneTransfer) { + ci.cancel(); + } + } +} diff --git a/src/main/resources/westeroscraft-essentials.mixins.json b/src/main/resources/westeroscraft-essentials.mixins.json index 659ec53..ca80221 100644 --- a/src/main/resources/westeroscraft-essentials.mixins.json +++ b/src/main/resources/westeroscraft-essentials.mixins.json @@ -23,6 +23,7 @@ "MinecartTNTMixin", "MushroomBlockMixin", "NetherWartBlockMixin", + "PointedDripstoneBlockMixin", "PrimedTntMixin", "ServerPlayerMixin", "SnowLayerBlockMixin", From 611cce0de29f826cbb2d894c052b1ae63668b888 Mon Sep 17 00:00:00 2001 From: EarlOfBerkeley Date: Sun, 8 Feb 2026 12:46:41 -0800 Subject: [PATCH 4/4] Readme --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/README.md b/README.md index 90bd198..8219626 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,42 @@ WesterosCraftEssentials is a custom Fabric mod that handles various requirements ## Features +A /ptime command to allow players to set their own time without affecting the server's time +A /pweather command to allow players to set their own weather without affecting the server's weather + +A registry that tracks the opening and closing of doors, gates and trapdoors. When a guest opens or closes a door, after some time, it is reset to it's original condition + +A large array of mixins to prevent randomTick events: + +| Config | Default | Notes | +|---------------------------|---------|----------------------------------------------------------------------------| +| disableIceMelt | true | Disables ice melting | +| disableSnowMelt | true | Disables snow melt | +| snowLayerSurviveAny | true | Allows snow layers to be placed in places ordinarily not allowed | +| doPreventLeafDecay | true | Prevents leaf decay | +| disableCropGrowth | true | Prevents crop growth | +| cropSurviveAny | true | Allows crops to be placed in places ordinarily not allowed | +| disableBambooSpread | true | Prevents bamboo spread | +| bambooSurviveAny | true | Allows bamboo to be placed in places ordinarily not allowed | +| disableGrassSpread | true | Prevents grass spread | +| disableFluidTicking | true | Prevents water and lava to spread normally | +| blockWitherSpawn | true | Prevents wither spawning | +| disableMushroomGrowFade | true | Prevents mushroom growth | +| mushroomSurviveAny | true | Allows mushrooms to be placed in places ordinarily not allowed | +| forceAdventureMode | true | Enforces adventure mode on dimension changes | +| disableCactusGrowth | true | Prevents Cactus growth | +| cactusSurviveAny | true | Allows cactus to be placed in places ordinarily not allowed | +| disableFallingBlocks | true | Prevents blocks such as sand and gravel from experiencing gravity | +| disableFarmStomping | true | Prevents jumping on crops causing the farmland to dry | +| disableHunger | true | Disables hunger | +| disablePlantGrowFade | true | Prevents plant growth | +| blockHangingItemChanges | true | Prevents hanging items such as paintings and item frames from being broken | +| disableTNTExplode | true | Disables TNT explosions, | +| disableNetherWartGrowFade | true | Prevents nether wart growth | +| disableStemGrowFade | true | Prevents stem growth | +| disableSugarCaneGrowFade | true | Prevents sugar cane growth | +| sugarCaneSurviveAny | true | Allows sugar cane to be placed in places ordinarily not allowed | +| disableVineGrowFade | true | Prevents Vine growth | +| vineSurviveAny | true | Allows vines to be placed in places ordinarily not allowed | +| disableDripstoneTransfer | true | Prevents dripstone from drying mud and lava farming | \ No newline at end of file