From 149838977419f5fedf63381093bc85e415436152 Mon Sep 17 00:00:00 2001 From: FirstMegaGame4 <84094287+FirstMegaGame4@users.noreply.github.com> Date: Sat, 2 Sep 2023 20:23:57 +0200 Subject: [PATCH] Add FluidGroupComparable Change SimpleFluidCollisionHandler --- .../FluidGroupComparable.java | 13 +++ .../collisions/FluidCollisionHandler.java | 14 +-- .../SimpleFluidCollisionHandler.java | 94 +++++++++++-------- .../mixin/injectors/FluidStateMixin.java | 9 +- src/main/resources/quilt.mod.json | 3 + 5 files changed, 86 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/mmodding/mmodding_lib/interface_injections/FluidGroupComparable.java diff --git a/src/main/java/com/mmodding/mmodding_lib/interface_injections/FluidGroupComparable.java b/src/main/java/com/mmodding/mmodding_lib/interface_injections/FluidGroupComparable.java new file mode 100644 index 0000000..b3c55fb --- /dev/null +++ b/src/main/java/com/mmodding/mmodding_lib/interface_injections/FluidGroupComparable.java @@ -0,0 +1,13 @@ +package com.mmodding.mmodding_lib.interface_injections; + +import com.mmodding.mmodding_lib.library.fluids.FluidGroup; +import net.minecraft.fluid.FluidState; +import org.quiltmc.qsl.base.api.util.InjectedInterface; + +@InjectedInterface(FluidState.class) +public interface FluidGroupComparable { + + default boolean isOf(FluidGroup group) { + throw new AssertionError(); + } +} diff --git a/src/main/java/com/mmodding/mmodding_lib/library/fluids/collisions/FluidCollisionHandler.java b/src/main/java/com/mmodding/mmodding_lib/library/fluids/collisions/FluidCollisionHandler.java index 56b0502..a62f036 100644 --- a/src/main/java/com/mmodding/mmodding_lib/library/fluids/collisions/FluidCollisionHandler.java +++ b/src/main/java/com/mmodding/mmodding_lib/library/fluids/collisions/FluidCollisionHandler.java @@ -7,15 +7,15 @@ public interface FluidCollisionHandler { - static SimpleFluidCollisionHandler ofSimple() { - return new SimpleFluidCollisionHandler(); - } + static SimpleFluidCollisionHandler ofSimple() { + return new SimpleFluidCollisionHandler(); + } - BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock); + BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock); - void afterCollision(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, FluidState collidedFluid); + void afterCollision(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, FluidState collidedFluid); - BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, FluidState collidedFluid); + BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, FluidState collidedFluid); - void afterCollision(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock); + void afterCollision(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock); } diff --git a/src/main/java/com/mmodding/mmodding_lib/library/fluids/collisions/SimpleFluidCollisionHandler.java b/src/main/java/com/mmodding/mmodding_lib/library/fluids/collisions/SimpleFluidCollisionHandler.java index a5482e2..02c0ff7 100644 --- a/src/main/java/com/mmodding/mmodding_lib/library/fluids/collisions/SimpleFluidCollisionHandler.java +++ b/src/main/java/com/mmodding/mmodding_lib/library/fluids/collisions/SimpleFluidCollisionHandler.java @@ -1,5 +1,6 @@ package com.mmodding.mmodding_lib.library.fluids.collisions; +import com.mmodding.mmodding_lib.library.fluids.FluidGroup; import com.mmodding.mmodding_lib.library.utils.BiHashMap; import com.mmodding.mmodding_lib.library.utils.BiMap; import net.minecraft.block.BlockState; @@ -15,52 +16,67 @@ public class SimpleFluidCollisionHandler implements FluidCollisionHandler { - private final BiMap, BiConsumer> blockHandlers = new BiHashMap<>(); - private final BiMap, BiConsumer> fluidHandlers = new BiHashMap<>(); + private final BiMap, BiConsumer> blockHandlers = new BiHashMap<>(); + private final BiMap, BiConsumer> fluidHandlers = new BiHashMap<>(); + private final BiMap, BiConsumer> groupHandlers = new BiHashMap<>(); - /** - * @apiNote Instantiable at {@link FluidCollisionHandler#ofSimple()} - */ - SimpleFluidCollisionHandler() {} + /** + * @apiNote Instantiable at {@link FluidCollisionHandler#ofSimple()} + */ + SimpleFluidCollisionHandler() {} - public SimpleFluidCollisionHandler addHandling(BlockState collided, BiFunction result, BiConsumer after) { - this.blockHandlers.put(collided, result, after); - return this; - } + public SimpleFluidCollisionHandler addHandling(BlockState collided, BiFunction result, BiConsumer after) { + this.blockHandlers.put(collided, result, after); + return this; + } - public SimpleFluidCollisionHandler addHandling(FluidState collided, BiFunction result, BiConsumer after) { - this.fluidHandlers.put(collided, result, after); - return this; - } + public SimpleFluidCollisionHandler addHandling(FluidState collided, BiFunction result, BiConsumer after) { + this.fluidHandlers.put(collided, result, after); + return this; + } - @Override - public BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock) { - AtomicReference state = new AtomicReference<>(Blocks.AIR.getDefaultState()); - this.blockHandlers.forEach((collided, result, after) -> { - if (collidedBlock.isOf(collided.getBlock())) { - state.set(result.apply(world, collidedBlock)); + public SimpleFluidCollisionHandler addHandling(FluidGroup collided, BiFunction result, BiConsumer after) { + this.groupHandlers.put(collided, result, after); + return this; + } + + @Override + public BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock) { + AtomicReference state = new AtomicReference<>(Blocks.AIR.getDefaultState()); + this.blockHandlers.forEach((collided, result, after) -> { + if (collidedBlock.isOf(collided.getBlock())) { + state.set(result.apply(world, collidedBlock)); after.accept(world, collidedBlock); - } - }); - return state.get(); - } + } + }); + return state.get(); + } - @Override - public void afterCollision(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, FluidState collidedFluid) {} + @Override + public void afterCollision(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, FluidState collidedFluid) {} - @Nullable - @Override - public BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, FluidState collidedFluid) { - AtomicReference state = new AtomicReference<>(Blocks.AIR.getDefaultState()); - this.fluidHandlers.forEach((collided, result, after) -> { - if (collidedFluid.isOf(collided.getFluid())) { - state.set(result.apply(world, collidedFluid)); + @Nullable + @Override + public BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, FluidState collidedFluid) { + AtomicReference state = new AtomicReference<>(Blocks.AIR.getDefaultState()); + this.fluidHandlers.forEach((collided, result, after) -> { + if (collidedFluid.isOf(collided.getFluid())) { + state.set(result.apply(world, collidedFluid)); + after.accept(world, collidedFluid); + } + }); + if (!state.get().isOf(Blocks.AIR)) { + return state.get(); + } + this.groupHandlers.forEach((collided, result, after) -> { + if (collidedFluid.isOf(collided)) { + state.set(result.apply(world, collidedFluid)); after.accept(world, collidedFluid); - } - }); - return state.get(); - } + } + }); + return state.get(); + } - @Override - public void afterCollision(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock) {} + @Override + public void afterCollision(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock) {} } diff --git a/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/FluidStateMixin.java b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/FluidStateMixin.java index 9ac4cd1..980ce55 100644 --- a/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/FluidStateMixin.java +++ b/src/main/java/com/mmodding/mmodding_lib/mixin/injectors/FluidStateMixin.java @@ -1,6 +1,8 @@ package com.mmodding.mmodding_lib.mixin.injectors; +import com.mmodding.mmodding_lib.interface_injections.FluidGroupComparable; import com.mmodding.mmodding_lib.library.fluids.FluidExtensions; +import com.mmodding.mmodding_lib.library.fluids.FluidGroup; import com.mmodding.mmodding_lib.mixin.accessors.FluidAccessor; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.FluidState; @@ -14,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(FluidState.class) -public abstract class FluidStateMixin { +public abstract class FluidStateMixin implements FluidGroupComparable { @Shadow public abstract Fluid getFluid(); @@ -25,4 +27,9 @@ private void getVelocity(BlockView world, BlockPos pos, CallbackInfoReturnable