From 5fcc22f17825e0f8d0c2aba39a9961dedc25b335 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 7 Oct 2022 17:52:45 +0200 Subject: [PATCH] Add waterlogged state to sea plants --- .../unicopia/mixin/MixinStateManager.java | 78 +++++++++++++++++++ src/main/resources/unicopia.mixin.json | 3 + 2 files changed, 81 insertions(+) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/MixinStateManager.java diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinStateManager.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinStateManager.java new file mode 100644 index 00000000..e2536554 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinStateManager.java @@ -0,0 +1,78 @@ +package com.minelittlepony.unicopia.mixin; + +import java.util.Map; +import java.util.function.Function; + +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.block.*; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.state.State; +import net.minecraft.state.StateManager; +import net.minecraft.state.StateManager.Factory; +import net.minecraft.state.property.Properties; +import net.minecraft.state.property.Property; + +@Mixin(StateManager.class) +abstract class MixinStateManager> { + @Shadow + private @Final O owner; + + @Inject(method = "getDefaultState", at = @At("RETURN"), cancellable = true) + private void onGetDefaultState(CallbackInfoReturnable info) { + if ((owner instanceof SeagrassBlock + || owner instanceof TallSeagrassBlock + || owner instanceof KelpBlock + || owner instanceof KelpPlantBlock + ) && info.getReturnValue().contains(Properties.WATERLOGGED)) { + info.setReturnValue(info.getReturnValue().with(Properties.WATERLOGGED, true)); + } + } +} + +@Mixin(StateManager.Builder.class) +abstract class MixinStateManagerBuilder> { + @Shadow + private @Final O owner; + + @Shadow + private @Final Map> namedProperties; + + @SuppressWarnings("unchecked") + @Inject(method = "build", at = @At("HEAD")) + private void build(Function defaultStateGetter, Factory factory, CallbackInfoReturnable> info) { + if (owner instanceof SeagrassBlock + || owner instanceof TallSeagrassBlock + || owner instanceof KelpBlock + || owner instanceof KelpPlantBlock + ) { + if (!namedProperties.containsValue(Properties.WATERLOGGED)) { + ((StateManager.Builder)(Object)this).add(Properties.WATERLOGGED); + } + } + } +} + +@Mixin(BlockState.class) +abstract class MixinBlockState extends AbstractBlock.AbstractBlockState { + protected MixinBlockState() { + super(null, null, null); + } + + @Override + public FluidState getFluidState() { + if (contains(Properties.WATERLOGGED) && ( + getBlock() instanceof SeagrassBlock + || getBlock() instanceof TallSeagrassBlock + || getBlock() instanceof KelpBlock + || getBlock() instanceof KelpPlantBlock + )) { + return (get(Properties.WATERLOGGED) ? Fluids.WATER : Fluids.EMPTY).getDefaultState(); + } + return super.getFluidState(); + } +} \ No newline at end of file diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 6acd7d0d..f9eb0627 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -32,6 +32,9 @@ "MixinServerWorld", "MixinSheepEntity", "MixinShulkerEntity", + "MixinStateManager", + "MixinStateManagerBuilder", + "MixinBlockState", "MixinTargetPredicate", "MixinWorld", "MixinWorldChunk",