From ef320eabd8461a678a6cd4b98698a83d3de704aa Mon Sep 17 00:00:00 2001 From: Mary Hopson Date: Sat, 8 Nov 2025 04:53:48 -0500 Subject: [PATCH 1/6] QED base --- .../utilitiesinexcess/ModBlocks.java | 2 + .../utilitiesinexcess/UtilitiesInExcess.java | 2 + .../common/blocks/BlockQED.java | 34 +++ .../common/tileentities/TileEntityQED.java | 225 ++++++++++++++++++ .../assets/utilitiesinexcess/lang/en_US.lang | 1 + .../utilitiesinexcess/textures/blocks/qed.png | Bin 0 -> 229 bytes 6 files changed, 264 insertions(+) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/qed.png diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 863103c7..7d923aaa 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -21,6 +21,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockMarginallyMaximisedChest; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPortalUnderWorld; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockPureLove; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockQED; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockRainMuffler; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockRedstoneClock; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSignificantlyShrunkChest; @@ -99,6 +100,7 @@ public enum ModBlocks { SPIKE_GOLD(BlockConfig.spikes.enableGoldSpike, new BlockSpike(BlockSpike.SpikeType.GOLD, "goldSpike"), BlockSpike.ItemSpike.class, "goldSpike"), SPIKE_DIAMOND(BlockConfig.spikes.enableDiamondSpike, new BlockSpike(BlockSpike.SpikeType.DIAMOND, "diamondSpike"), BlockSpike.ItemSpike.class, "diamondSpike"), UNDERWORLD_PORTAL(BlockConfig.enableUnderWorldPortal && UnderWorldConfig.enableUnderWorld, new BlockPortalUnderWorld(), "underworld_portal"), + QED(true, new BlockQED(), "uieqed") ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index c6f216ef..4e72a001 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -17,6 +17,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPureLove; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityQED; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRainMuffler; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRedstoneClock; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySignificantlyShrunkChest; @@ -105,6 +106,7 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityBlockUpdateDetector.class, "TileEntityBlockUpdateDetector"); GameRegistry.registerTileEntity(TileEntityConveyor.class, "TileEntityConveyor"); GameRegistry.registerTileEntity(TileEntityPortalUnderWorld.class, "TileEntityPortalUnderWorld"); + GameRegistry.registerTileEntity(TileEntityQED.class, "TileEntityQEDUIE"); GameRegistry.registerTileEntity( TileEntityLowTemperatureFurnaceGenerator.class, diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java new file mode 100644 index 00000000..122b1993 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java @@ -0,0 +1,34 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityQED; + +public class BlockQED extends BlockContainer { + + public BlockQED() { + super(Material.iron); + setBlockName("qed"); + setBlockTextureName("utilitiesinexcess:qed"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityQED(); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (!worldIn.isRemote) { + GuiFactories.tileEntity() + .open(player, x, y, z); + } + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java new file mode 100644 index 00000000..3c74c2ac --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java @@ -0,0 +1,225 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.ItemDrawable; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.factory.inventory.ItemHandler; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.utils.ItemStackItemHandler; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.utils.item.ItemStackHandler; +import com.cleanroommc.modularui.value.sync.GenericSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.ItemDisplayWidget; +import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; +import com.fouristhenumber.utilitiesinexcess.api.QEDRegistry; +import com.fouristhenumber.utilitiesinexcess.compat.nei.QEDRecipeHandler; +import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCraftResult; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.Constants; +import org.lwjgl.opengl.GL11; + +import static com.cleanroommc.modularui.drawable.GuiTextures.PROGRESS_ARROW; + +public class TileEntityQED extends TileEntity implements IInventory, IGuiHolder { + private final InventoryCrafting craftMatrix = new InventoryCrafting(new ContainerDummy(), 3, 3); + private final InventoryCraftResult craftResult = new InventoryCraftResult(); + + private static final ItemStack fakeItem = new ItemStack(new Item()); + private ItemStack preview = fakeItem; + + + @Override + public void updateEntity() { + + super.updateEntity(); + } + + private void updateCraftingResult() { + ItemStack stack = QEDRegistry.instance().findRecipe(craftMatrix, false); + preview = stack == null ? fakeItem : stack; + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + syncManager.syncValue("preview", GenericSyncValue.forItem(() -> preview, null)); + + // Add title + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + IItemHandler itemHandler = new InvWrapper(this); + + // Input slots + panel.child(SlotGroupWidget.builder() + .matrix("III", "III", "III") + .key('I', index -> new ItemSlot().slot(new ModularSlot(itemHandler, index))).build() + .marginTop(20) + .marginLeft(37)); + + // Progress bar + panel.child(new ProgressWidget() + .texture(PROGRESS_ARROW, 20) + .marginTop(38) + .marginLeft(97)); + + // Preview slot + panel.child(new ItemDisplayWidget() + .syncHandler("preview") + .marginTop(15) + .marginLeft(97)); + + // Output slot + panel.child(new ItemSlot() + .slot(new ModularSlot(itemHandler, 9)) + .marginTop(38) + .marginLeft(121)); + + return panel; + } + + @Override + public int getSizeInventory() { + return 10; + } + + @Override + public String getInventoryName() { + return "tile.qed.name"; + } + + @Override + public ItemStack getStackInSlot(int index) { + return index < 9 ? craftMatrix.getStackInSlot(index) : craftResult.getStackInSlot(0); + } + + @Override + public ItemStack decrStackSize(int index, int count) { + ItemStack stack; + if (index < 9) { + stack = craftMatrix.decrStackSize(index, count); + } else { + stack = craftResult.decrStackSize(0, count); + } + markDirty(); + return stack; + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return index < 9 ? craftMatrix.getStackInSlotOnClosing(index) : craftResult.getStackInSlotOnClosing(0); + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + if (index < 9) { + craftMatrix.setInventorySlotContents(index, stack); + updateCraftingResult(); + } else { + craftResult.setInventorySlotContents(0, stack); + } + markDirty(); + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) == this && player + .getDistanceSq((double) this.xCoord + 0.5D, (double) this.yCoord + 0.5D, (double) this.zCoord + 0.5D) + <= 64.0D; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } + + @Override + public void readFromNBT(NBTTagCompound nbttagcompound) { + super.readFromNBT(nbttagcompound); + NBTTagList nbttaglist = nbttagcompound.getTagList("Items", Constants.NBT.TAG_COMPOUND); + for (int index = 0; index < nbttaglist.tagCount(); index++) { + NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(index); + int slot = nbttagcompound1.getByte("Slot") & 255; + if (slot < getSizeInventory()) { + setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(nbttagcompound1)); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbttagcompound) { + super.writeToNBT(nbttagcompound); + NBTTagList nbttaglist = new NBTTagList(); + for (int index = 0; index < getSizeInventory(); index++) { + ItemStack curStack = getStackInSlot(index); + if (curStack != null) { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + nbttagcompound1.setByte("Slot", (byte) index); + curStack.writeToNBT(nbttagcompound1); + nbttaglist.appendTag(nbttagcompound1); + } + } + nbttagcompound.setTag("Items", nbttaglist); + } + + public static class ContainerDummy extends Container { + public ContainerDummy() { + } + + public boolean canInteractWith(EntityPlayer var1) { + return false; + } + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 2f3a1f8b..8df06c87 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -169,6 +169,7 @@ gui.energy.tooltip=RF: %s / %s item.golden_bag.name=Golden Bag of Holding item.golden_bag.desc=Carries a double chest worth of items +tile.qed.name=QED utilitiesinexcess.config.block.ender_lotus=Ender Lotus diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/qed.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/qed.png new file mode 100644 index 0000000000000000000000000000000000000000..d5e4ec1be0d862547930928dd5050ad49d2345f8 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|=6kw0hFJ6_ z=V;CNG{3R2@!^}vuX&a*Buo0Tfq+_(iSp}2C3oXZiaG{;K{q@>f^F5S&jkK3D9E2` z*(L?#cQAS-st1}Jx^aT*B5%`4!- Date: Sat, 8 Nov 2025 06:27:07 -0500 Subject: [PATCH 2/6] Semi-functional QED --- .../utilitiesinexcess/ModBlocks.java | 4 +- .../common/blocks/BlockFluxCrystal.java | 45 ++++++ .../common/blocks/BlockQED.java | 31 ++++ .../common/tileentities/TileEntityQED.java | 149 ++++++++++++------ .../config/blocks/BlockConfig.java | 3 + .../utilitiesinexcess/utils/UIEUtils.java | 30 ++++ .../assets/utilitiesinexcess/lang/en_US.lang | 1 + .../textures/blocks/flux_crystal.png | Bin 0 -> 141 bytes 8 files changed, 211 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFluxCrystal.java create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/flux_crystal.png diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 7d923aaa..72c96545 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -15,6 +15,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEtherealGlass; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFloating; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFluxCrystal; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockInverted; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockLapisAetherius; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockMagicWood; @@ -100,7 +101,8 @@ public enum ModBlocks { SPIKE_GOLD(BlockConfig.spikes.enableGoldSpike, new BlockSpike(BlockSpike.SpikeType.GOLD, "goldSpike"), BlockSpike.ItemSpike.class, "goldSpike"), SPIKE_DIAMOND(BlockConfig.spikes.enableDiamondSpike, new BlockSpike(BlockSpike.SpikeType.DIAMOND, "diamondSpike"), BlockSpike.ItemSpike.class, "diamondSpike"), UNDERWORLD_PORTAL(BlockConfig.enableUnderWorldPortal && UnderWorldConfig.enableUnderWorld, new BlockPortalUnderWorld(), "underworld_portal"), - QED(true, new BlockQED(), "uieqed") + QED(BlockConfig.enableQED, new BlockQED(), "qed"), + FLUX_CRYSTAL(BlockConfig.enableQED, new BlockFluxCrystal(), "flux_crystal"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFluxCrystal.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFluxCrystal.java new file mode 100644 index 00000000..8d483888 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFluxCrystal.java @@ -0,0 +1,45 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static codechicken.nei.NEIClientConfig.world; +import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.scanForBlock; + +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityQED; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +public class BlockFluxCrystal extends Block { + + public BlockFluxCrystal() { + super(Material.iron); + setBlockName("flux_crystal"); + setBlockTextureName("utilitiesinexcess:flux_crystal"); + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) { + Set positions = scanForBlock(world, x, y, z, 9, ModBlocks.QED.get()); + + for (BlockPos pos : positions) { + TileEntityQED qed = (TileEntityQED) world.getTileEntity(pos.x, pos.y, pos.z); + qed.addCrystal(new BlockPos(x, y, z)); + } + super.onBlockAdded(world, x, y, z); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block blockBroken, int meta) { + Set positions = scanForBlock(world, x, y, z, 9, ModBlocks.QED.get()); + + for (BlockPos pos : positions) { + TileEntityQED qed = (TileEntityQED) world.getTileEntity(pos.x, pos.y, pos.z); + qed.removeCrystal(new BlockPos(x, y, z)); + } + super.breakBlock(world, x, y, z, blockBroken, meta); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java index 122b1993..17626499 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java @@ -1,5 +1,10 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks; +import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.scanForBlock; + +import java.util.Set; + +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -7,7 +12,9 @@ import net.minecraft.world.World; import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityQED; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; public class BlockQED extends BlockContainer { @@ -30,5 +37,29 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer .open(player, x, y, z); } return true; + + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) { + Set positions = scanForBlock(world, x, y, z, 9, ModBlocks.FLUX_CRYSTAL.get()); + TileEntityQED qed = (TileEntityQED) world.getTileEntity(x, y, z); + + for (BlockPos pos : positions) { + qed.addCrystal(new BlockPos(pos.x, pos.y, pos.z)); + } + + super.onBlockAdded(world, x, y, z); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block blockBroken, int meta) { + Set positions = scanForBlock(world, x, y, z, 9, ModBlocks.FLUX_CRYSTAL.get()); + TileEntityQED qed = (TileEntityQED) world.getTileEntity(x, y, z); + + for (BlockPos pos : positions) { + qed.removeCrystal(new BlockPos(pos.x, pos.y, pos.z)); + } + super.breakBlock(world, x, y, z, blockBroken, meta); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java index 3c74c2ac..e5920572 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java @@ -1,67 +1,103 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities; +import static com.cleanroommc.modularui.drawable.GuiTextures.PROGRESS_ARROW; + +import java.util.HashSet; +import java.util.Set; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCraftResult; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.Constants; + import com.cleanroommc.modularui.api.IGuiHolder; -import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.factory.inventory.ItemHandler; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; -import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.utils.ItemStackItemHandler; import com.cleanroommc.modularui.utils.item.IItemHandler; import com.cleanroommc.modularui.utils.item.InvWrapper; -import com.cleanroommc.modularui.utils.item.ItemStackHandler; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.GenericSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandler; -import com.cleanroommc.modularui.value.sync.SyncHandlers; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ItemDisplayWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; import com.fouristhenumber.utilitiesinexcess.api.QEDRegistry; -import com.fouristhenumber.utilitiesinexcess.compat.nei.QEDRecipeHandler; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryCraftResult; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.StatCollector; -import net.minecraftforge.common.util.Constants; -import org.lwjgl.opengl.GL11; - -import static com.cleanroommc.modularui.drawable.GuiTextures.PROGRESS_ARROW; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; public class TileEntityQED extends TileEntity implements IInventory, IGuiHolder { + private final InventoryCrafting craftMatrix = new InventoryCrafting(new ContainerDummy(), 3, 3); private final InventoryCraftResult craftResult = new InventoryCraftResult(); private static final ItemStack fakeItem = new ItemStack(new Item()); private ItemStack preview = fakeItem; + private int craftingProgress = 0; + private boolean crafting = false; + private final Set crystals = new HashSet<>(); @Override public void updateEntity() { - + if (crafting) { + for (BlockPos ignored : crystals) { + craftingProgress++; + } + } + if (craftingProgress >= 500) { + ItemStack newStack = QEDRegistry.instance() + .findRecipe(craftMatrix, true); + if (newStack != null) { + ItemStack outputStack = craftResult.getStackInSlot(0); + + if (outputStack == null) craftResult.setInventorySlotContents(0, newStack); + else outputStack.stackSize += newStack.stackSize; + } + craftingProgress = 0; + crafting = false; + updateCraftingResult(); + } super.updateEntity(); } private void updateCraftingResult() { - ItemStack stack = QEDRegistry.instance().findRecipe(craftMatrix, false); - preview = stack == null ? fakeItem : stack; + ItemStack stack = QEDRegistry.instance() + .findRecipe(craftMatrix, false); + + crafting = stack != null && canInsertToOutput(stack); + preview = stack != null ? stack : fakeItem; + } + + public boolean canInsertToOutput(ItemStack toInsert) { + ItemStack outputStack = craftResult.getStackInSlot(0); + if (outputStack == null) return true; + + if (!outputStack.isItemEqual(toInsert) || !ItemStack.areItemStackTagsEqual(outputStack, toInsert)) { + return false; + } + + return (outputStack.stackSize + toInsert.stackSize) <= outputStack.getMaxStackSize(); + } + + public void addCrystal(BlockPos position) { + crystals.add(position); + } + + public void removeCrystal(BlockPos position) { + crystals.remove(position); } @Override @@ -71,6 +107,8 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet panel.bindPlayerInventory(); syncManager.syncValue("preview", GenericSyncValue.forItem(() -> preview, null)); + IntSyncValue craftingSyncer = new IntSyncValue(() -> craftingProgress); + syncManager.syncValue("craftingProgress", craftingSyncer); // Add title panel.child( @@ -87,29 +125,39 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet IItemHandler itemHandler = new InvWrapper(this); // Input slots - panel.child(SlotGroupWidget.builder() - .matrix("III", "III", "III") - .key('I', index -> new ItemSlot().slot(new ModularSlot(itemHandler, index))).build() - .marginTop(20) - .marginLeft(37)); + panel.child( + SlotGroupWidget.builder() + .matrix("III", "III", "III") + .key( + 'I', + index -> new ItemSlot().slot( + new ModularSlot(itemHandler, index).changeListener((w, x, y, z) -> updateCraftingResult()))) + .build() + .marginTop(20) + .marginLeft(37)); // Progress bar - panel.child(new ProgressWidget() - .texture(PROGRESS_ARROW, 20) - .marginTop(38) - .marginLeft(97)); + panel.child( + new ProgressWidget().texture(PROGRESS_ARROW, 20) + .value(new DoubleSyncValue(() -> (double) craftingSyncer.getIntValue() / 500)) + .marginTop(38) + .marginLeft(97)); // Preview slot - panel.child(new ItemDisplayWidget() - .syncHandler("preview") - .marginTop(15) - .marginLeft(97)); + panel.child( + new ItemDisplayWidget().syncHandler("preview") + .marginTop(15) + .marginLeft(97)); // Output slot - panel.child(new ItemSlot() - .slot(new ModularSlot(itemHandler, 9)) - .marginTop(38) - .marginLeft(121)); + panel + .child( + new ItemSlot() + .slot( + new ModularSlot(itemHandler, 9).changeListener((w, x, y, z) -> updateCraftingResult()) + .accessibility(false, true)) + .marginTop(38) + .marginLeft(121)); return panel; } @@ -150,7 +198,6 @@ public ItemStack getStackInSlotOnClosing(int index) { public void setInventorySlotContents(int index, ItemStack stack) { if (index < 9) { craftMatrix.setInventorySlotContents(index, stack); - updateCraftingResult(); } else { craftResult.setInventorySlotContents(0, stack); } @@ -215,8 +262,8 @@ public void writeToNBT(NBTTagCompound nbttagcompound) { } public static class ContainerDummy extends Container { - public ContainerDummy() { - } + + public ContainerDummy() {} public boolean canInteractWith(EntityPlayer var1) { return false; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java index 0345bca5..5c3e956b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -76,6 +76,9 @@ public static void registerConfig() throws ConfigException { @Config.DefaultBoolean(true) public static boolean enableUnderWorldPortal; + @Config.DefaultBoolean(true) + public static boolean enableQED; + @Config.Comment("Cursed Earth Configuration") public static final CursedEarth cursedEarth = new CursedEarth(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java index aeea2464..cccac564 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java @@ -1,7 +1,14 @@ package com.fouristhenumber.utilitiesinexcess.utils; import java.text.DecimalFormat; +import java.util.HashSet; import java.util.Random; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; public class UIEUtils { @@ -24,4 +31,27 @@ public static String formatNumber(double number) { public static String formatNumber(float number) { return COMMA_FORMAT.format(number); } + + public static Set scanForBlock(World world, int x, int y, int z, int radius, Block findBlock) { + Set positions = new HashSet<>(); + for (int dx = -radius; dx <= radius; dx++) { + for (int dy = -radius; dy <= radius; dy++) { + int rem = radius - (Math.abs(dx) + Math.abs(dy)); + if (rem < 0) continue; + + for (int dz = -rem; dz <= rem; dz++) { + if (Math.abs(dx) + Math.abs(dy) + Math.abs(dz) > radius) continue; + + int nx = x + dx; + int ny = y + dy; + int nz = z + dz; + + if (!world.blockExists(nx, ny, nz)) continue; + + if (world.getBlock(nx, ny, nz) == findBlock) positions.add(new BlockPos(nx, ny, nz)); + } + } + } + return positions; + } } diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 8df06c87..57757901 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -170,6 +170,7 @@ item.golden_bag.name=Golden Bag of Holding item.golden_bag.desc=Carries a double chest worth of items tile.qed.name=QED +tile.flux_crystal.name=Flux Crystal utilitiesinexcess.config.block.ender_lotus=Ender Lotus diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/flux_crystal.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/flux_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..53ff07d57513a2536183124a71d6068244a3e408 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|+&x_!Lo9le zx2%cyIKQ#6QE|hK$&Df#_LW;RgMhH*tchO@%J%;IF+b(5M? Date: Sat, 8 Nov 2025 13:52:22 -0500 Subject: [PATCH 3/6] Fix crystal syncing --- .../common/blocks/BlockQED.java | 31 ------------------- .../common/tileentities/TileEntityQED.java | 30 +++++++++++++++++- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java index 17626499..122b1993 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockQED.java @@ -1,10 +1,5 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks; -import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.scanForBlock; - -import java.util.Set; - -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -12,9 +7,7 @@ import net.minecraft.world.World; import com.cleanroommc.modularui.factory.GuiFactories; -import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityQED; -import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; public class BlockQED extends BlockContainer { @@ -37,29 +30,5 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer .open(player, x, y, z); } return true; - - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) { - Set positions = scanForBlock(world, x, y, z, 9, ModBlocks.FLUX_CRYSTAL.get()); - TileEntityQED qed = (TileEntityQED) world.getTileEntity(x, y, z); - - for (BlockPos pos : positions) { - qed.addCrystal(new BlockPos(pos.x, pos.y, pos.z)); - } - - super.onBlockAdded(world, x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block blockBroken, int meta) { - Set positions = scanForBlock(world, x, y, z, 9, ModBlocks.FLUX_CRYSTAL.get()); - TileEntityQED qed = (TileEntityQED) world.getTileEntity(x, y, z); - - for (BlockPos pos : positions) { - qed.removeCrystal(new BlockPos(pos.x, pos.y, pos.z)); - } - super.breakBlock(world, x, y, z, blockBroken, meta); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java index e5920572..62ef32de 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities; import static com.cleanroommc.modularui.drawable.GuiTextures.PROGRESS_ARROW; +import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.scanForBlock; import java.util.HashSet; import java.util.Set; @@ -35,6 +36,7 @@ import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.fouristhenumber.utilitiesinexcess.api.QEDRegistry; import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; @@ -49,11 +51,16 @@ public class TileEntityQED extends TileEntity implements IInventory, IGuiHolder< private int craftingProgress = 0; private boolean crafting = false; private final Set crystals = new HashSet<>(); + public boolean queuedScan = false; @Override public void updateEntity() { + if (worldObj.getTotalWorldTime() % 20 == 0 && queuedScan) { + scan(); + queuedScan = false; + } if (crafting) { - for (BlockPos ignored : crystals) { + for (BlockPos pos : crystals) { craftingProgress++; } } @@ -73,6 +80,19 @@ public void updateEntity() { super.updateEntity(); } + private void scan() { + Set positions = scanForBlock(worldObj, xCoord, yCoord, zCoord, 9, ModBlocks.FLUX_CRYSTAL.get()); + for (BlockPos pos : positions) { + addCrystal(new BlockPos(pos.x, pos.y, pos.z)); + } + } + + @Override + public void validate() { + queuedScan = true; + super.validate(); + } + private void updateCraftingResult() { ItemStack stack = QEDRegistry.instance() .findRecipe(craftMatrix, false); @@ -108,7 +128,9 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet syncManager.syncValue("preview", GenericSyncValue.forItem(() -> preview, null)); IntSyncValue craftingSyncer = new IntSyncValue(() -> craftingProgress); + IntSyncValue connected = new IntSyncValue(crystals::size); syncManager.syncValue("craftingProgress", craftingSyncer); + syncManager.syncValue("connected", connected); // Add title panel.child( @@ -122,6 +144,12 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .marginTop(5) .marginBottom(-15))); + panel.child( + IKey.dynamic(connected::getStringValue) + .asWidget() + .marginTop(70) + .marginLeft(10)); + IItemHandler itemHandler = new InvWrapper(this); // Input slots From 039058aae69da490f5a4235cbfb74d13764c6b5a Mon Sep 17 00:00:00 2001 From: Mary Hopson Date: Fri, 14 Nov 2025 19:52:10 -0500 Subject: [PATCH 4/6] Address comments --- .../common/blocks/BlockFluxCrystal.java | 32 ----------- .../common/tileentities/TileEntityQED.java | 56 +++++++------------ .../utilitiesinexcess/utils/UIEUtils.java | 7 ++- 3 files changed, 27 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFluxCrystal.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFluxCrystal.java index 8d483888..8a349efb 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFluxCrystal.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockFluxCrystal.java @@ -1,17 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks; -import static codechicken.nei.NEIClientConfig.world; -import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.scanForBlock; - -import java.util.Set; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.world.World; - -import com.fouristhenumber.utilitiesinexcess.ModBlocks; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityQED; -import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; public class BlockFluxCrystal extends Block { @@ -20,26 +10,4 @@ public BlockFluxCrystal() { setBlockName("flux_crystal"); setBlockTextureName("utilitiesinexcess:flux_crystal"); } - - @Override - public void onBlockAdded(World world, int x, int y, int z) { - Set positions = scanForBlock(world, x, y, z, 9, ModBlocks.QED.get()); - - for (BlockPos pos : positions) { - TileEntityQED qed = (TileEntityQED) world.getTileEntity(pos.x, pos.y, pos.z); - qed.addCrystal(new BlockPos(x, y, z)); - } - super.onBlockAdded(world, x, y, z); - } - - @Override - public void breakBlock(World world, int x, int y, int z, Block blockBroken, int meta) { - Set positions = scanForBlock(world, x, y, z, 9, ModBlocks.QED.get()); - - for (BlockPos pos : positions) { - TileEntityQED qed = (TileEntityQED) world.getTileEntity(pos.x, pos.y, pos.z); - qed.removeCrystal(new BlockPos(x, y, z)); - } - super.breakBlock(world, x, y, z, blockBroken, meta); - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java index 62ef32de..e0a5b2f7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityQED.java @@ -3,7 +3,6 @@ import static com.cleanroommc.modularui.drawable.GuiTextures.PROGRESS_ARROW; import static com.fouristhenumber.utilitiesinexcess.utils.UIEUtils.scanForBlock; -import java.util.HashSet; import java.util.Set; import net.minecraft.entity.player.EntityPlayer; @@ -37,6 +36,7 @@ import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.api.QEDRegistry; import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; @@ -50,19 +50,12 @@ public class TileEntityQED extends TileEntity implements IInventory, IGuiHolder< private int craftingProgress = 0; private boolean crafting = false; - private final Set crystals = new HashSet<>(); - public boolean queuedScan = false; + private int crystals = 0; @Override public void updateEntity() { - if (worldObj.getTotalWorldTime() % 20 == 0 && queuedScan) { - scan(); - queuedScan = false; - } if (crafting) { - for (BlockPos pos : crystals) { - craftingProgress++; - } + craftingProgress += crystals; } if (craftingProgress >= 500) { ItemStack newStack = QEDRegistry.instance() @@ -71,7 +64,9 @@ public void updateEntity() { ItemStack outputStack = craftResult.getStackInSlot(0); if (outputStack == null) craftResult.setInventorySlotContents(0, newStack); - else outputStack.stackSize += newStack.stackSize; + else if (canInsertToOutput(newStack)) outputStack.stackSize += newStack.stackSize; + else UtilitiesInExcess.LOG + .error("Failed to complete QED recipe because output stack did not match craft result."); } craftingProgress = 0; crafting = false; @@ -82,21 +77,14 @@ public void updateEntity() { private void scan() { Set positions = scanForBlock(worldObj, xCoord, yCoord, zCoord, 9, ModBlocks.FLUX_CRYSTAL.get()); - for (BlockPos pos : positions) { - addCrystal(new BlockPos(pos.x, pos.y, pos.z)); - } - } - - @Override - public void validate() { - queuedScan = true; - super.validate(); + crystals = positions.size(); } private void updateCraftingResult() { ItemStack stack = QEDRegistry.instance() .findRecipe(craftMatrix, false); + if (stack != null) scan(); crafting = stack != null && canInsertToOutput(stack); preview = stack != null ? stack : fakeItem; } @@ -112,14 +100,6 @@ public boolean canInsertToOutput(ItemStack toInsert) { return (outputStack.stackSize + toInsert.stackSize) <= outputStack.getMaxStackSize(); } - public void addCrystal(BlockPos position) { - crystals.add(position); - } - - public void removeCrystal(BlockPos position) { - crystals.remove(position); - } - @Override public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { @@ -128,7 +108,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet syncManager.syncValue("preview", GenericSyncValue.forItem(() -> preview, null)); IntSyncValue craftingSyncer = new IntSyncValue(() -> craftingProgress); - IntSyncValue connected = new IntSyncValue(crystals::size); + IntSyncValue connected = new IntSyncValue(() -> crystals); syncManager.syncValue("craftingProgress", craftingSyncer); syncManager.syncValue("connected", connected); @@ -261,9 +241,9 @@ public boolean isItemValidForSlot(int index, ItemStack stack) { } @Override - public void readFromNBT(NBTTagCompound nbttagcompound) { - super.readFromNBT(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getTagList("Items", Constants.NBT.TAG_COMPOUND); + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + NBTTagList nbttaglist = tag.getTagList("Items", Constants.NBT.TAG_COMPOUND); for (int index = 0; index < nbttaglist.tagCount(); index++) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(index); int slot = nbttagcompound1.getByte("Slot") & 255; @@ -271,11 +251,14 @@ public void readFromNBT(NBTTagCompound nbttagcompound) { setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(nbttagcompound1)); } } + craftingProgress = tag.getInteger("craftingProgress"); + crafting = tag.getBoolean("crafting"); + crystals = tag.getInteger("crystals"); } @Override - public void writeToNBT(NBTTagCompound nbttagcompound) { - super.writeToNBT(nbttagcompound); + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); NBTTagList nbttaglist = new NBTTagList(); for (int index = 0; index < getSizeInventory(); index++) { ItemStack curStack = getStackInSlot(index); @@ -286,7 +269,10 @@ public void writeToNBT(NBTTagCompound nbttagcompound) { nbttaglist.appendTag(nbttagcompound1); } } - nbttagcompound.setTag("Items", nbttaglist); + tag.setTag("Items", nbttaglist); + tag.setInteger("craftingProgres", craftingProgress); + tag.setBoolean("crafting", crafting); + tag.setInteger("crystals", crystals); } public static class ContainerDummy extends Container { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java index cccac564..9fb33203 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java @@ -33,6 +33,10 @@ public static String formatNumber(float number) { } public static Set scanForBlock(World world, int x, int y, int z, int radius, Block findBlock) { + return scanForBlock(world, x, y, z, radius, findBlock, 0); + } + + public static Set scanForBlock(World world, int x, int y, int z, int radius, Block findBlock, int meta) { Set positions = new HashSet<>(); for (int dx = -radius; dx <= radius; dx++) { for (int dy = -radius; dy <= radius; dy++) { @@ -48,7 +52,8 @@ public static Set scanForBlock(World world, int x, int y, int z, int r if (!world.blockExists(nx, ny, nz)) continue; - if (world.getBlock(nx, ny, nz) == findBlock) positions.add(new BlockPos(nx, ny, nz)); + if (world.getBlock(nx, ny, nz) == findBlock && world.getBlockMetadata(nx, ny, nz) == meta) + positions.add(new BlockPos(nx, ny, nz)); } } } From aa779d34aa9ce90074aeebe8fe113a5112272524 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 21:46:45 -0500 Subject: [PATCH 5/6] Spotless apply for branch QED for #62 (#67) Co-authored-by: GitHub GTNH Actions <> --- .../utilitiesinexcess/config/blocks/BlockConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java index cd0afd70..88e7d951 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -84,7 +84,7 @@ public static void registerConfig() throws ConfigException { @Config.DefaultBoolean(true) public static boolean enableQED; - + @Config.DefaultBoolean(true) public static boolean enableDecorativeGlass; From e18ed9cb1b122610201b35e7c44bf6d819da4f34 Mon Sep 17 00:00:00 2001 From: Mary Hopson Date: Sat, 22 Nov 2025 12:25:18 -0500 Subject: [PATCH 6/6] Merge --- .../fouristhenumber/utilitiesinexcess/utils/UIEUtils.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java index 356b0d8f..e3f652a1 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java @@ -6,14 +6,12 @@ import java.util.Set; import net.minecraft.block.Block; -import net.minecraft.world.World; - -import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import baubles.common.container.InventoryBaubles; import baubles.common.lib.PlayerHandler;