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()); } }