From 000b84e87eaedb94fb87ccb11e376c51f99a1d07 Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Wed, 10 Jan 2024 17:41:07 +0100 Subject: Added Energy Condenser --- .../mixin/ContainerOpenersCounterMixin.java | 56 ++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/main/java/lv/enes/mc/eris_alchemy/mixin/ContainerOpenersCounterMixin.java (limited to 'src/main/java/lv/enes/mc/eris_alchemy/mixin/ContainerOpenersCounterMixin.java') diff --git a/src/main/java/lv/enes/mc/eris_alchemy/mixin/ContainerOpenersCounterMixin.java b/src/main/java/lv/enes/mc/eris_alchemy/mixin/ContainerOpenersCounterMixin.java new file mode 100644 index 0000000..13b8669 --- /dev/null +++ b/src/main/java/lv/enes/mc/eris_alchemy/mixin/ContainerOpenersCounterMixin.java @@ -0,0 +1,56 @@ +package lv.enes.mc.eris_alchemy.mixin; + +import jakarta.annotation.Nonnull; +import lv.enes.mc.eris_alchemy.utils.ContainerOpenersCounterUtil; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.ContainerOpenersCounter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.entity.EntityTypeTest; +import net.minecraft.world.phys.AABB; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; + +@Mixin(ContainerOpenersCounter.class) +public abstract class ContainerOpenersCounterMixin + implements ContainerOpenersCounterUtil.ContainerOpenersCounterSuper { + @Shadow protected abstract boolean isOwnContainer(Player player); + + @Unique + private final static Map> openers = new WeakHashMap<>(); + + @Inject(method = "recheckOpeners", at = @At("RETURN")) + public void onRecheckOpeners(Level world, BlockPos pos, BlockState state, CallbackInfo ci) { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + var boundingBox = new AABB( + x - 5.0, y - 5.0, z - 5.0, + x + 5.0, y + 5.0, z + 5.0 + ); + var players = world.getEntities(EntityTypeTest.forClass(ServerPlayer.class), boundingBox, this::isOwnContainer); + if (openers.containsKey(this)) { + var list = openers.get(this); + list.clear(); + list.addAll(players); + } else { + openers.put(this, players); + } + } + + @Nonnull + @Override + public List lv_enes_mc$getOpeners() { + return openers.getOrDefault(this, List.of()); + } +} -- cgit v1.2.3