Skip to content

Commit

Permalink
Add FluidGroupComparable
Browse files Browse the repository at this point in the history
Change SimpleFluidCollisionHandler
  • Loading branch information
FirstMegaGame4 committed Sep 2, 2023
1 parent 04ca2e1 commit 1498389
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 47 deletions.
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -15,52 +16,67 @@

public class SimpleFluidCollisionHandler implements FluidCollisionHandler {

private final BiMap<BlockState, BiFunction<WorldAccess, BlockState, BlockState>, BiConsumer<WorldAccess, BlockState>> blockHandlers = new BiHashMap<>();
private final BiMap<FluidState, BiFunction<WorldAccess, FluidState, BlockState>, BiConsumer<WorldAccess, FluidState>> fluidHandlers = new BiHashMap<>();
private final BiMap<BlockState, BiFunction<WorldAccess, BlockState, BlockState>, BiConsumer<WorldAccess, BlockState>> blockHandlers = new BiHashMap<>();
private final BiMap<FluidState, BiFunction<WorldAccess, FluidState, BlockState>, BiConsumer<WorldAccess, FluidState>> fluidHandlers = new BiHashMap<>();
private final BiMap<FluidGroup, BiFunction<WorldAccess, FluidState, BlockState>, BiConsumer<WorldAccess, FluidState>> groupHandlers = new BiHashMap<>();

/**
* @apiNote Instantiable at {@link FluidCollisionHandler#ofSimple()}
*/
SimpleFluidCollisionHandler() {}
/**
* @apiNote Instantiable at {@link FluidCollisionHandler#ofSimple()}
*/
SimpleFluidCollisionHandler() {}

public SimpleFluidCollisionHandler addHandling(BlockState collided, BiFunction<WorldAccess, BlockState, BlockState> result, BiConsumer<WorldAccess, BlockState> after) {
this.blockHandlers.put(collided, result, after);
return this;
}
public SimpleFluidCollisionHandler addHandling(BlockState collided, BiFunction<WorldAccess, BlockState, BlockState> result, BiConsumer<WorldAccess, BlockState> after) {
this.blockHandlers.put(collided, result, after);
return this;
}

public SimpleFluidCollisionHandler addHandling(FluidState collided, BiFunction<WorldAccess, FluidState, BlockState> result, BiConsumer<WorldAccess, FluidState> after) {
this.fluidHandlers.put(collided, result, after);
return this;
}
public SimpleFluidCollisionHandler addHandling(FluidState collided, BiFunction<WorldAccess, FluidState, BlockState> result, BiConsumer<WorldAccess, FluidState> after) {
this.fluidHandlers.put(collided, result, after);
return this;
}

@Override
public BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock) {
AtomicReference<BlockState> 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<WorldAccess, FluidState, BlockState> result, BiConsumer<WorldAccess, FluidState> after) {
this.groupHandlers.put(collided, result, after);
return this;
}

@Override
public BlockState getCollisionResult(WorldAccess world, BlockPos originPos, BlockState originFluid, BlockPos collidedPos, BlockState collidedBlock) {
AtomicReference<BlockState> 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<BlockState> 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<BlockState> 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) {}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
Expand All @@ -25,4 +27,9 @@ private void getVelocity(BlockView world, BlockPos pos, CallbackInfoReturnable<V
cir.setReturnValue(((FluidAccessor) this.getFluid()).getVelocity(world, pos, (FluidState) (Object) this).multiply(extensions.getVelocityMultiplier()));
}
}

@Override
public boolean isOf(FluidGroup group) {
return this.getFluid() == group.getStill() || this.getFluid() == group.getFlowing();
}
}
3 changes: 3 additions & 0 deletions src/main/resources/quilt.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@
"net/minecraft/class_1792": [
"com/mmodding/mmodding_lib/interface_injections/ItemGlintPack"
],
"net/minecraft/class_3610": [
"com/mmodding/mmodding_lib/interface_injections/FluidGroupComparable"
],
"net/minecraft/class_4770": [
"com/mmodding/mmodding_lib/interface_injections/ShouldLightCustomPortal"
]
Expand Down

0 comments on commit 1498389

Please sign in to comment.