From 7912765ab180c891651260aa1f8d8abafb9764d5 Mon Sep 17 00:00:00 2001 From: NegaNote Date: Tue, 11 Nov 2025 20:04:09 -0500 Subject: [PATCH 01/12] datagen --- src/generated/resources/assets/gtmutils/lang/en_ud.json | 1 + src/generated/resources/assets/gtmutils/lang/en_us.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src/generated/resources/assets/gtmutils/lang/en_ud.json b/src/generated/resources/assets/gtmutils/lang/en_ud.json index 7bcb3db..89b2648 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_ud.json +++ b/src/generated/resources/assets/gtmutils/lang/en_ud.json @@ -49,6 +49,7 @@ "config.gtmutils.option.omnibreakerEnabled": "pǝןqɐuƎɹǝʞɐǝɹqıuɯo", "config.gtmutils.option.omnibreakerEnergyCapacity": "ʎʇıɔɐdɐƆʎbɹǝuƎɹǝʞɐǝɹqıuɯo", "config.gtmutils.option.omnibreakerTier": "ɹǝı⟘ɹǝʞɐǝɹqıuɯo", + "config.gtmutils.option.parallelHatchAutoConfigure": "ǝɹnbıɟuoƆoʇnⱯɥɔʇɐHןǝןןɐɹɐd", "config.gtmutils.option.pterbCoolantBaseDrain": "uıɐɹᗡǝsɐᗺʇuɐןooƆqɹǝʇd", "config.gtmutils.option.pterbCoolantIOMultiplier": "ɹǝıןdıʇןnWOIʇuɐןooƆqɹǝʇd", "config.gtmutils.option.pterbEnabled": "pǝןqɐuƎqɹǝʇd", diff --git a/src/generated/resources/assets/gtmutils/lang/en_us.json b/src/generated/resources/assets/gtmutils/lang/en_us.json index bd3556d..167a0e1 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_us.json +++ b/src/generated/resources/assets/gtmutils/lang/en_us.json @@ -49,6 +49,7 @@ "config.gtmutils.option.omnibreakerEnabled": "omnibreakerEnabled", "config.gtmutils.option.omnibreakerEnergyCapacity": "omnibreakerEnergyCapacity", "config.gtmutils.option.omnibreakerTier": "omnibreakerTier", + "config.gtmutils.option.parallelHatchAutoConfigure": "parallelHatchAutoConfigure", "config.gtmutils.option.pterbCoolantBaseDrain": "pterbCoolantBaseDrain", "config.gtmutils.option.pterbCoolantIOMultiplier": "pterbCoolantIOMultiplier", "config.gtmutils.option.pterbEnabled": "pterbEnabled", From 49373a330f69023a648827399f75b7661119f946 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Tue, 6 Jan 2026 23:19:34 -0500 Subject: [PATCH 02/12] Fix some sync issues and added a jade provider for the expanded pattern buffer and proxy. --- .../ExpandedPatternBufferPartMachine.java | 6 +- ...ExpandedPatternBufferProxyPartMachine.java | 4 +- .../trait/ExpandedProxySlotRecipeHandler.java | 1 + .../integration/jade/UtilJadePlugin.java | 12 ++ .../ExpandedMEPatternBufferProvider.java | 119 ++++++++++++++++++ .../ExpandedMEPatternBufferProxyProvider.java | 71 +++++++++++ 6 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java create mode 100644 src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java index 97a8995..c1e67e0 100644 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java @@ -75,7 +75,11 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Set; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java index afad4e2..a536fe7 100644 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java @@ -76,8 +76,8 @@ public void setBuffer(@Nullable BlockPos pos) { if (level == null || pos == null) { this.buffer = null; } else if (MetaMachine.getMachine(level, pos) instanceof ExpandedPatternBufferPartMachine machine) { - this.bufferPos = pos; - this.buffer = machine; + bufferPos = pos; + buffer = machine; machine.addProxy(this); if (!isRemote()) proxySlotRecipeHandler.updateProxy(machine); } else { diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java index 07462ee..f3569ef 100644 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java @@ -191,6 +191,7 @@ public double getTotalContentAmount() { return proxy == null ? 0 : proxy.getTotalContentAmount(); } + @Override public int getPriority() { return proxy == null ? IFilteredHandler.LOW : proxy.getPriority(); } diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java b/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java index f61c590..83567ed 100644 --- a/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java +++ b/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java @@ -1,7 +1,11 @@ package net.neganote.gtutilities.integration.jade; +import com.gregtechceu.gtceu.GTCEu; + import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; +import net.neganote.gtutilities.integration.jade.provider.ExpandedMEPatternBufferProvider; +import net.neganote.gtutilities.integration.jade.provider.ExpandedMEPatternBufferProxyProvider; import net.neganote.gtutilities.integration.jade.provider.PTERBInformationProvider; import snownee.jade.api.IWailaClientRegistration; @@ -16,10 +20,18 @@ public class UtilJadePlugin implements IWailaPlugin { @Override public void register(IWailaCommonRegistration registration) { registration.registerBlockDataProvider(new PTERBInformationProvider(), BlockEntity.class); + if (GTCEu.Mods.isAE2Loaded()) { + registration.registerBlockDataProvider(new ExpandedMEPatternBufferProvider(), BlockEntity.class); + registration.registerBlockDataProvider(new ExpandedMEPatternBufferProxyProvider(), BlockEntity.class); + } } @Override public void registerClient(IWailaClientRegistration registration) { registration.registerBlockComponent(new PTERBInformationProvider(), Block.class); + if (GTCEu.Mods.isAE2Loaded()) { + registration.registerBlockComponent(new ExpandedMEPatternBufferProvider(), Block.class); + registration.registerBlockComponent(new ExpandedMEPatternBufferProxyProvider(), Block.class); + } } } diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java new file mode 100644 index 0000000..08c3183 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java @@ -0,0 +1,119 @@ +package net.neganote.gtutilities.integration.jade.provider; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.client.util.TooltipHelper; +import com.gregtechceu.gtceu.integration.jade.GTElementHelper; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; +import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferPartMachine; + +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IBlockComponentProvider; +import snownee.jade.api.IServerDataProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; +import snownee.jade.api.fluid.JadeFluidObject; +import snownee.jade.api.ui.IElementHelper; + +public class ExpandedMEPatternBufferProvider implements IBlockComponentProvider, IServerDataProvider { + + @Override + public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferPartMachine) { + CompoundTag serverData = blockAccessor.getServerData(); + if (!serverData.getBoolean("formed")) return; + + iTooltip.add(Component.translatable("gtceu.top.proxies_bound", serverData.getInt("proxies")) + .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); + readBufferTag(iTooltip, serverData); + } + } + } + + @Override + public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferPartMachine buffer) { + if (!buffer.isFormed()) { + compoundTag.putBoolean("formed", false); + return; + } + compoundTag.putBoolean("formed", true); + compoundTag.putInt("proxies", buffer.getProxies().size()); + writeBufferTag(compoundTag, buffer); + } + } + } + + @Override + public ResourceLocation getUid() { + return GTCEu.id("me_pattern_buffer"); + } + + public static void writeBufferTag(CompoundTag compoundTag, ExpandedPatternBufferPartMachine buffer) { + var merged = buffer.mergeInternalSlots(); + var items = merged.items(); + var fluids = merged.fluids(); + + ListTag itemsTag = new ListTag(); + for (var entry : items.object2LongEntrySet()) { + var ct = entry.getKey().serializeNBT(); + ct.putLong("real", entry.getLongValue()); + itemsTag.add(ct); + } + if (!itemsTag.isEmpty()) compoundTag.put("items", itemsTag); + + ListTag fluidsTag = new ListTag(); + for (var entry : fluids.object2LongEntrySet()) { + var ct = entry.getKey().writeToNBT(new CompoundTag()); + ct.putLong("real", entry.getLongValue()); + fluidsTag.add(ct); + } + if (!fluidsTag.isEmpty()) compoundTag.put("fluids", fluidsTag); + } + + public static void readBufferTag(ITooltip iTooltip, CompoundTag serverData) { + IElementHelper helper = iTooltip.getElementHelper(); + + ListTag itemsTag = serverData.getList("items", Tag.TAG_COMPOUND); + for (Tag t : itemsTag) { + if (!(t instanceof CompoundTag ct)) continue; + var stack = ItemStack.of(ct); + var count = ct.getLong("real"); + if (!stack.isEmpty() && count > 0) { + iTooltip.add(helper.smallItem(stack)); + Component text = Component.literal(" ") + .append(Component.literal(FormattingUtil.formatNumbers(count)) + .withStyle(ChatFormatting.DARK_PURPLE)) + .append(Component.literal("× ").withStyle(ChatFormatting.WHITE)) + .append(stack.getHoverName().copy().withStyle(ChatFormatting.GOLD)); + iTooltip.append(text); + } + } + ListTag fluidsTag = serverData.getList("fluids", Tag.TAG_COMPOUND); + for (Tag t : fluidsTag) { + if (!(t instanceof CompoundTag ct)) continue; + var stack = FluidStack.loadFluidStackFromNBT(ct); + var amount = ct.getLong("real"); + if (!stack.isEmpty() && amount > 0) { + iTooltip.add(GTElementHelper.smallFluid(JadeFluidObject.of(stack.getFluid()))); + Component text = Component.literal(" ") + .append(Component.literal(FormattingUtil.formatBuckets(amount))) + .withStyle(ChatFormatting.DARK_PURPLE) + .append(Component.literal(" ").withStyle(ChatFormatting.WHITE)) + .append(stack.getDisplayName().copy().withStyle(ChatFormatting.DARK_AQUA)); + iTooltip.append(text); + } + } + } +} diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java new file mode 100644 index 0000000..3446be2 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java @@ -0,0 +1,71 @@ +package net.neganote.gtutilities.integration.jade.provider; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.client.util.TooltipHelper; +import com.gregtechceu.gtceu.integration.jade.provider.MEPatternBufferProvider; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferProxyPartMachine; + +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IBlockComponentProvider; +import snownee.jade.api.IServerDataProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +public class ExpandedMEPatternBufferProxyProvider implements IBlockComponentProvider, + IServerDataProvider { + + @Override + public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferProxyPartMachine) { + CompoundTag serverData = blockAccessor.getServerData(); + if (!serverData.getBoolean("formed")) return; + if (!serverData.getBoolean("bound")) { + iTooltip.add(Component.translatable("gtceu.top.buffer_not_bound").withStyle(ChatFormatting.RED)); + return; + } + + int[] pos = serverData.getIntArray("pos"); + iTooltip.add(Component.translatable("gtceu.top.buffer_bound_pos", pos[0], pos[1], pos[2]) + .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); + + MEPatternBufferProvider.readBufferTag(iTooltip, + serverData); + } + } + } + + @Override + public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferProxyPartMachine proxy) { + if (!proxy.isFormed()) { + compoundTag.putBoolean("formed", false); + return; + } + compoundTag.putBoolean("formed", true); + var buffer = proxy.getBuffer(); + if (buffer == null) { + compoundTag.putBoolean("bound", false); + return; + } + compoundTag.putBoolean("bound", true); + + var pos = buffer.getPos(); + compoundTag.putIntArray("pos", new int[] { pos.getX(), pos.getY(), pos.getZ() }); + ExpandedMEPatternBufferProvider.writeBufferTag(compoundTag, buffer); + } + } + } + + @Override + public ResourceLocation getUid() { + return GTCEu.id("me_pattern_buffer_proxy"); + } +} From 0906aa0fdd9e03536b675ac0b93091079dac1fd0 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Tue, 6 Jan 2026 23:32:27 -0500 Subject: [PATCH 03/12] Idk man, just let me do the thing. --- .../ExpandedPatternBufferPartMachine.java | 621 ------------------ ...ExpandedPatternBufferProxyPartMachine.java | 133 ---- .../ExpandedInternalSlotRecipeHandler.java | 130 ---- .../trait/ExpandedProxySlotRecipeHandler.java | 199 ------ .../integration/jade/UtilJadePlugin.java | 37 -- .../ExpandedMEPatternBufferProvider.java | 119 ---- .../ExpandedMEPatternBufferProxyProvider.java | 71 -- 7 files changed, 1310 deletions(-) delete mode 100644 src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java delete mode 100644 src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java delete mode 100644 src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedInternalSlotRecipeHandler.java delete mode 100644 src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java delete mode 100644 src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java delete mode 100644 src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java delete mode 100644 src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java deleted file mode 100644 index c1e67e0..0000000 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java +++ /dev/null @@ -1,621 +0,0 @@ -package net.neganote.gtutilities.integration.ae2.machine; - -import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.fancyconfigurator.ButtonConfigurator; -import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; -import com.gregtechceu.gtceu.api.machine.fancyconfigurator.FancyInvConfigurator; -import com.gregtechceu.gtceu.api.machine.fancyconfigurator.FancyTankConfigurator; -import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; -import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.data.machines.GTAEMachines; -import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; -import com.gregtechceu.gtceu.integration.ae2.gui.widget.AETextInputButtonWidget; -import com.gregtechceu.gtceu.integration.ae2.gui.widget.slot.AEPatternViewSlotWidget; -import com.gregtechceu.gtceu.integration.ae2.machine.MEBusPartMachine; -import com.gregtechceu.gtceu.utils.GTMath; -import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; - -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.util.ClickData; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.syncdata.IContentChangeAware; -import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidType; -import net.neganote.gtutilities.integration.ae2.machine.trait.ExpandedInternalSlotRecipeHandler; - -import appeng.api.crafting.IPatternDetails; -import appeng.api.crafting.PatternDetailsHelper; -import appeng.api.implementations.blockentities.PatternContainerGroup; -import appeng.api.inventories.InternalInventory; -import appeng.api.networking.IGrid; -import appeng.api.networking.IGridNodeListener; -import appeng.api.networking.crafting.ICraftingProvider; -import appeng.api.stacks.*; -import appeng.api.storage.MEStorage; -import appeng.api.storage.StorageHelper; -import appeng.crafting.pattern.EncodedPatternItem; -import appeng.crafting.pattern.ProcessingPatternItem; -import appeng.helpers.patternprovider.PatternContainer; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import it.unimi.dsi.fastutil.objects.*; -import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnmodifiableView; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Set; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class ExpandedPatternBufferPartMachine extends MEBusPartMachine - implements ICraftingProvider, PatternContainer, IDataStickInteractable { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - ExpandedPatternBufferPartMachine.class, MEBusPartMachine.MANAGED_FIELD_HOLDER); - - protected static final int MAX_PATTERN_COUNT = 72; - - private final InternalInventory internalPatternInventory = new InternalInventory() { - - @Override - public int size() { - return MAX_PATTERN_COUNT; - } - - @Override - public ItemStack getStackInSlot(int slotIndex) { - return patternInventory.getStackInSlot(slotIndex); - } - - @Override - public void setItemDirect(int slotIndex, ItemStack stack) { - patternInventory.setStackInSlot(slotIndex, stack); - patternInventory.onContentsChanged(slotIndex); - onPatternChange(slotIndex); - } - }; - - @Getter - @Persisted - @DescSynced - private final CustomItemStackHandler patternInventory = new CustomItemStackHandler(MAX_PATTERN_COUNT); - - @Getter - @Persisted - protected final NotifiableItemStackHandler shareInventory; - - @Getter - @Persisted - protected final NotifiableFluidTank shareTank; - - @Getter - @Persisted - protected final InternalSlot[] internalInventory = new InternalSlot[MAX_PATTERN_COUNT]; - - private final BiMap detailsSlotMap = HashBiMap.create(MAX_PATTERN_COUNT); - - @DescSynced - @Persisted - @Setter - private String customName = ""; - - private boolean needPatternSync; - - @Persisted - private final Set proxies = new ObjectOpenHashSet<>(); - - private final Set proxyMachines = new ReferenceOpenHashSet<>(); - - @Getter - protected final ExpandedInternalSlotRecipeHandler internalRecipeHandler; - - @Nullable - protected TickableSubscription updateSubs; - - public ExpandedPatternBufferPartMachine(IMachineBlockEntity holder, Object... args) { - super(holder, IO.IN, args); - this.patternInventory.setFilter(stack -> stack.getItem() instanceof ProcessingPatternItem); - for (int i = 0; i < this.internalInventory.length; i++) { - this.internalInventory[i] = new InternalSlot(); - } - getMainNode().addService(ICraftingProvider.class, this); - this.shareInventory = new NotifiableItemStackHandler(this, 9, IO.IN, IO.NONE); - this.shareTank = new NotifiableFluidTank(this, 9, 8 * FluidType.BUCKET_VOLUME, IO.IN, IO.NONE); - this.internalRecipeHandler = new ExpandedInternalSlotRecipeHandler(this, internalInventory); - } - - @Override - public void onLoad() { - super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(1, () -> { - for (int i = 0; i < patternInventory.getSlots(); i++) { - var pattern = patternInventory.getStackInSlot(i); - var patternDetails = PatternDetailsHelper.decodePattern(pattern, getLevel()); - if (patternDetails != null) { - this.detailsSlotMap.put(patternDetails, this.internalInventory[i]); - } - } - needPatternSync = true; - })); - } - } - - @Override - public List getRecipeHandlers() { - return internalRecipeHandler.getSlotHandlers(); - } - - public void addProxy(ExpandedPatternBufferProxyPartMachine proxy) { - proxies.add(proxy.getPos()); - proxyMachines.add(proxy); - } - - public void removeProxy(ExpandedPatternBufferProxyPartMachine proxy) { - proxies.remove(proxy.getPos()); - proxyMachines.remove(proxy); - } - - @UnmodifiableView - public Set getProxies() { - if (proxyMachines.size() != proxies.size()) { - proxyMachines.clear(); - for (var pos : proxies) { - if (MetaMachine.getMachine(getLevel(), pos) instanceof ExpandedPatternBufferProxyPartMachine proxy) { - proxyMachines.add(proxy); - } - } - } - return Collections.unmodifiableSet(proxyMachines); - } - - @Override - public Widget createUIWidget() { - int rowSize = 9; - int colSize = 8; - var group = new WidgetGroup(0, 0, 18 * rowSize + 16, 18 * colSize + 16); - int index = 0; - for (int y = 0; y < colSize; ++y) { - for (int x = 0; x < rowSize; ++x) { - int finalI = index; - var slot = new AEPatternViewSlotWidget(patternInventory, index++, 8 + x * 18, 14 + y * 18) - .setOccupiedTexture(GuiTextures.SLOT) - .setItemHook(stack -> { - if (!stack.isEmpty() && stack.getItem() instanceof EncodedPatternItem iep) { - final ItemStack out = iep.getOutput(stack); - if (!out.isEmpty()) return out; - } - return stack; - }) - .setChangeListener(() -> onPatternChange(finalI)) - .setBackground(GuiTextures.SLOT, GuiTextures.PATTERN_OVERLAY); - group.addWidget(slot); - } - } - group.addWidget(new LabelWidget(8, 2, - () -> this.isOnline ? "gtceu.gui.me_network.online" : "gtceu.gui.me_network.offline")); - group.addWidget(new AETextInputButtonWidget(18 * rowSize + 8 - 70, 2, 70, 10) - .setText(customName) - .setOnConfirm(this::setCustomName) - .setButtonTooltips(Component.translatable("gui.gtceu.rename.desc"))); - return group; - } - - @Override - public boolean isWorkingEnabled() { - return true; - } - - @Override - public void setWorkingEnabled(boolean ignored) {} - - @Override - public boolean isDistinct() { - return true; - } - - @Override - public void setDistinct(boolean ignored) {} - - @Override - public void onMainNodeStateChanged(IGridNodeListener.State reason) { - super.onMainNodeStateChanged(reason); - this.updateSubscription(); - } - - protected void updateSubscription() { - if (getMainNode().isOnline()) { - updateSubs = subscribeServerTick(updateSubs, this::update); - } else if (updateSubs != null) { - updateSubs.unsubscribe(); - updateSubs = null; - } - } - - protected void update() { - if (needPatternSync) { - ICraftingProvider.requestUpdate(getMainNode()); - this.needPatternSync = false; - } - } - - private void refundAll(ClickData clickData) { - if (!clickData.isRemote) { - for (InternalSlot internalSlot : internalInventory) { - internalSlot.refund(); - } - } - } - - private void onPatternChange(int index) { - if (isRemote()) return; - var internalInv = internalInventory[index]; - var newPattern = patternInventory.getStackInSlot(index); - var newPatternDetails = PatternDetailsHelper.decodePattern(newPattern, getLevel()); - var oldPatternDetails = detailsSlotMap.inverse().get(internalInv); - detailsSlotMap.forcePut(newPatternDetails, internalInv); - if (oldPatternDetails != null && !oldPatternDetails.equals(newPatternDetails)) { - internalInv.refund(); - } - needPatternSync = true; - } - - @Override - public void attachConfigurators(ConfiguratorPanel configuratorPanel) { - configuratorPanel.attachConfigurators(new ButtonConfigurator( - new GuiTextureGroup(GuiTextures.BUTTON, GuiTextures.REFUND_OVERLAY), this::refundAll) - .setTooltips(List.of(Component.translatable("gui.gtceu.refund_all.desc")))); - if (isHasCircuitSlot() && isCircuitSlotEnabled()) { - configuratorPanel.attachConfigurators(new CircuitFancyConfigurator(circuitInventory.storage)); - } - configuratorPanel.attachConfigurators(new FancyInvConfigurator( - shareInventory.storage, Component.translatable("gui.gtceu.share_inventory.title")) - .setTooltips(List.of( - Component.translatable("gui.gtceu.share_inventory.desc.0"), - Component.translatable("gui.gtceu.share_inventory.desc.1")))); - configuratorPanel.attachConfigurators(new FancyTankConfigurator( - shareTank.getStorages(), Component.translatable("gui.gtceu.share_tank.title")) - .setTooltips(List.of( - Component.translatable("gui.gtceu.share_tank.desc.0"), - Component.translatable("gui.gtceu.share_inventory.desc.1")))); - } - - @Override - public List getAvailablePatterns() { - return detailsSlotMap.keySet().stream().filter(Objects::nonNull).toList(); - } - - @Override - public boolean pushPattern(IPatternDetails patternDetails, KeyCounter[] inputHolder) { - if (!isFormed() || !getMainNode().isActive() || !detailsSlotMap.containsKey(patternDetails) || - !checkInput(inputHolder)) { - return false; - } - var slot = detailsSlotMap.get(patternDetails); - if (slot != null) { - slot.pushPattern(patternDetails, inputHolder); - return true; - } - return false; - } - - @Override - public boolean isBusy() { - return false; - } - - private boolean checkInput(KeyCounter[] inputHolder) { - for (KeyCounter input : inputHolder) { - var illegal = input.keySet().stream() - .map(AEKey::getType) - .map(AEKeyType::getId) - .anyMatch(id -> !id.equals(AEKeyType.items().getId()) && !id.equals(AEKeyType.fluids().getId())); - if (illegal) return false; - } - return true; - } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public @Nullable IGrid getGrid() { - return getMainNode().getGrid(); - } - - @Override - public InternalInventory getTerminalPatternInventory() { - return internalPatternInventory; - } - - @Override - public PatternContainerGroup getTerminalGroup() { - if (isFormed()) { - IMultiController controller = getControllers().first(); - MultiblockMachineDefinition controllerDefinition = controller.self().getDefinition(); - if (!customName.isEmpty()) { - return new PatternContainerGroup(AEItemKey.of(controllerDefinition.asStack()), - Component.literal(customName), Collections.emptyList()); - } else { - ItemStack circuitStack = isHasCircuitSlot() ? circuitInventory.storage.getStackInSlot(0) : - ItemStack.EMPTY; - int circuitConfiguration = circuitStack.isEmpty() ? -1 : - IntCircuitBehaviour.getCircuitConfiguration(circuitStack); - Component groupName = circuitConfiguration != -1 ? - Component.translatable(controllerDefinition.getDescriptionId()) - .append(" - " + circuitConfiguration) : - Component.translatable(controllerDefinition.getDescriptionId()); - return new PatternContainerGroup(AEItemKey.of(controllerDefinition.asStack()), groupName, - Collections.emptyList()); - } - } else { - return new PatternContainerGroup(AEItemKey.of(GTAEMachines.ME_PATTERN_BUFFER.getItem()), - customName.isEmpty() ? - GTAEMachines.ME_PATTERN_BUFFER.get().getDefinition().getItem().getDescription() : - Component.literal(customName), - Collections.emptyList()); - } - } - - @Override - public void onMachineRemoved() { - clearInventory(patternInventory); - clearInventory(shareInventory); - } - - @Override - public InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { - dataStick.getOrCreateTag().putIntArray("pos", new int[] { getPos().getX(), getPos().getY(), getPos().getZ() }); - return InteractionResult.SUCCESS; - } - - public record BufferData(Object2LongMap items, Object2LongMap fluids) {} - - public BufferData mergeInternalSlots() { - var items = new Object2LongOpenCustomHashMap<>(ItemStackHashStrategy.comparingAllButCount()); - var fluids = new Object2LongOpenHashMap(); - for (InternalSlot slot : internalInventory) { - slot.itemInventory.object2LongEntrySet().fastForEach(e -> items.addTo(e.getKey(), e.getLongValue())); - slot.fluidInventory.object2LongEntrySet().fastForEach(e -> fluids.addTo(e.getKey(), e.getLongValue())); - } - return new BufferData(items, fluids); - } - - public class InternalSlot implements ITagSerializable, IContentChangeAware { - - @Getter - @Setter - private Runnable onContentsChanged = () -> {}; - private final Object2LongOpenCustomHashMap itemInventory = new Object2LongOpenCustomHashMap<>( - ItemStackHashStrategy.comparingAllButCount()); - private final Object2LongOpenHashMap fluidInventory = new Object2LongOpenHashMap<>(); - private List itemStacks = null; - private List fluidStacks = null; - - public InternalSlot() {} - - public boolean isItemEmpty() { - return itemInventory.isEmpty(); - } - - public boolean isFluidEmpty() { - return fluidInventory.isEmpty(); - } - - public void onContentsChanged() { - itemStacks = null; - fluidStacks = null; - onContentsChanged.run(); - } - - private void add(AEKey what, long amount) { - if (amount <= 0L) return; - if (what instanceof AEItemKey itemKey) { - itemInventory.addTo(itemKey.toStack(), amount); - } else if (what instanceof AEFluidKey fluidKey) { - fluidInventory.addTo(fluidKey.toStack(1), amount); - } - } - - public List getItems() { - if (itemStacks == null) { - itemStacks = new ArrayList<>(); - itemInventory.object2LongEntrySet().stream().map(e -> GTMath.splitStacks(e.getKey(), e.getLongValue())) - .forEach(itemStacks::addAll); - } - return itemStacks; - } - - public List getFluids() { - if (fluidStacks == null) { - fluidStacks = new ArrayList<>(); - fluidInventory.object2LongEntrySet().stream() - .map(e -> GTMath.splitFluidStacks(e.getKey(), e.getLongValue())).forEach(fluidStacks::addAll); - } - return fluidStacks; - } - - public void refund() { - var network = getMainNode().getGrid(); - if (network != null) { - MEStorage networkInv = network.getStorageService().getInventory(); - var energy = network.getEnergyService(); - for (var it = itemInventory.object2LongEntrySet().iterator(); it.hasNext();) { - var entry = it.next(); - var key = AEItemKey.of(entry.getKey()); - if (key == null) continue; - long inserted = StorageHelper.poweredInsert(energy, networkInv, key, entry.getLongValue(), - actionSource); - if (inserted > 0) { - long count = entry.getLongValue() - inserted; - if (count == 0) it.remove(); - else entry.setValue(count); - } - } - for (var it = fluidInventory.object2LongEntrySet().iterator(); it.hasNext();) { - var entry = it.next(); - var key = AEFluidKey.of(entry.getKey()); - if (key == null) continue; - long inserted = StorageHelper.poweredInsert(energy, networkInv, key, entry.getLongValue(), - actionSource); - if (inserted > 0) { - long amount = entry.getLongValue() - inserted; - if (amount == 0) it.remove(); - else entry.setValue(amount); - } - } - onContentsChanged(); - } - } - - public void pushPattern(IPatternDetails patternDetails, KeyCounter[] inputHolder) { - patternDetails.pushInputsToExternalInventory(inputHolder, this::add); - onContentsChanged(); - } - - public @Nullable List handleItemInternal(List left, boolean simulate) { - boolean changed = false; - for (var it = left.listIterator(); it.hasNext();) { - var ingredient = it.next(); - var items = ingredient.getItems(); - if (items.length == 0 || items[0].isEmpty()) { - it.remove(); - continue; - } - int amount = items[0].getCount(); - for (var it2 = itemInventory.object2LongEntrySet().iterator(); it2.hasNext();) { - var entry = it2.next(); - if (!ingredient.test(entry.getKey())) continue; - int extracted = Math.min(GTMath.saturatedCast(entry.getLongValue()), amount); - if (!simulate && extracted > 0) { - changed = true; - long count = entry.getLongValue() - extracted; - if (count == 0) it2.remove(); - else entry.setValue(count); - } - amount -= extracted; - if (amount <= 0) { - it.remove(); - break; - } - } - if (amount > 0) { - if (ingredient instanceof SizedIngredient si) si.setAmount(amount); - else items[0].setCount(amount); - } - } - if (changed) onContentsChanged(); - return left.isEmpty() ? null : left; - } - - public @Nullable List handleFluidInternal(List left, boolean simulate) { - boolean changed = false; - for (var it = left.listIterator(); it.hasNext();) { - var ingredient = it.next(); - var fluids = ingredient.getStacks(); - if (fluids.length == 0 || fluids[0].isEmpty()) { - it.remove(); - continue; - } - int amount = fluids[0].getAmount(); - for (var it2 = fluidInventory.object2LongEntrySet().iterator(); it2.hasNext();) { - var entry = it2.next(); - if (!ingredient.test(entry.getKey())) continue; - int extracted = Math.min(GTMath.saturatedCast(entry.getLongValue()), amount); - if (!simulate && extracted > 0) { - changed = true; - long count = entry.getLongValue() - extracted; - if (count == 0) it2.remove(); - else entry.setValue(count); - } - amount -= extracted; - if (amount <= 0) { - it.remove(); - break; - } - } - if (amount > 0) ingredient.setAmount(amount); - } - if (changed) onContentsChanged(); - return left.isEmpty() ? null : left; - } - - @Override - public CompoundTag serializeNBT() { - CompoundTag tag = new CompoundTag(); - ListTag itemsTag = new ListTag(); - for (var entry : itemInventory.object2LongEntrySet()) { - var ct = entry.getKey().serializeNBT(); - ct.putLong("real", entry.getLongValue()); - itemsTag.add(ct); - } - if (!itemsTag.isEmpty()) tag.put("inventory", itemsTag); - ListTag fluidsTag = new ListTag(); - for (var entry : fluidInventory.object2LongEntrySet()) { - var ct = entry.getKey().writeToNBT(new CompoundTag()); - ct.putLong("real", entry.getLongValue()); - fluidsTag.add(ct); - } - if (!fluidsTag.isEmpty()) tag.put("fluidInventory", fluidsTag); - return tag; - } - - @Override - public void deserializeNBT(CompoundTag tag) { - ListTag items = tag.getList("inventory", Tag.TAG_COMPOUND); - for (Tag t : items) { - if (!(t instanceof CompoundTag ct)) continue; - var stack = ItemStack.of(ct); - var count = ct.getLong("real"); - if (!stack.isEmpty() && count > 0) itemInventory.put(stack, count); - } - ListTag fluids = tag.getList("fluidInventory", Tag.TAG_COMPOUND); - for (Tag t : fluids) { - if (!(t instanceof CompoundTag ct)) continue; - var stack = FluidStack.loadFluidStackFromNBT(ct); - var amount = ct.getLong("real"); - if (!stack.isEmpty() && amount > 0) fluidInventory.put(stack, amount); - } - } - } -} diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java deleted file mode 100644 index a536fe7..0000000 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java +++ /dev/null @@ -1,133 +0,0 @@ -package net.neganote.gtutilities.integration.ae2.machine; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; -import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; - -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.Tag; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.phys.BlockHitResult; -import net.neganote.gtutilities.integration.ae2.machine.trait.ExpandedProxySlotRecipeHandler; - -import lombok.Getter; -import org.jetbrains.annotations.Nullable; - -import java.util.List; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class ExpandedPatternBufferProxyPartMachine extends TieredIOPartMachine - implements IMachineLife, IDataStickInteractable { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - ExpandedPatternBufferProxyPartMachine.class, TieredIOPartMachine.MANAGED_FIELD_HOLDER); - - @Getter - private final ExpandedProxySlotRecipeHandler proxySlotRecipeHandler; - - @Persisted - @Getter - @DescSynced - private @Nullable BlockPos bufferPos; - - private @Nullable ExpandedPatternBufferPartMachine buffer = null; - private boolean bufferResolved = false; - - public ExpandedPatternBufferProxyPartMachine(IMachineBlockEntity holder) { - super(holder, GTValues.LuV, IO.IN); - this.proxySlotRecipeHandler = new ExpandedProxySlotRecipeHandler(this, 72); - } - - @Override - public void onLoad() { - super.onLoad(); - if (getLevel() instanceof ServerLevel level) { - level.getServer().tell(new TickTask(0, () -> this.setBuffer(bufferPos))); - } - } - - @Override - public List getRecipeHandlers() { - return proxySlotRecipeHandler.getProxySlotHandlers(); - } - - public void setBuffer(@Nullable BlockPos pos) { - this.bufferResolved = true; - var level = getLevel(); - if (level == null || pos == null) { - this.buffer = null; - } else if (MetaMachine.getMachine(level, pos) instanceof ExpandedPatternBufferPartMachine machine) { - bufferPos = pos; - buffer = machine; - machine.addProxy(this); - if (!isRemote()) proxySlotRecipeHandler.updateProxy(machine); - } else { - this.buffer = null; - } - } - - @Nullable - public ExpandedPatternBufferPartMachine getBuffer() { - if (!bufferResolved) setBuffer(bufferPos); - return buffer; - } - - @Override - public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { - return getBuffer() != null; - } - - @Override - public ModularUI createUI(Player entityPlayer) { - var buf = getBuffer(); - assert buf != null; - return buf.createUI(entityPlayer); - } - - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - @Override - public void onMachineRemoved() { - var buf = getBuffer(); - if (buf != null) { - buf.removeProxy(this); - proxySlotRecipeHandler.clearProxy(); - } - } - - @Override - public InteractionResult onDataStickUse(Player player, ItemStack dataStick) { - if (dataStick.hasTag()) { - assert dataStick.getTag() != null; - if (dataStick.getTag().contains("pos", Tag.TAG_INT_ARRAY)) { - var posArray = dataStick.getOrCreateTag().getIntArray("pos"); - var newBufferPos = new BlockPos(posArray[0], posArray[1], posArray[2]); - setBuffer(newBufferPos); - return InteractionResult.SUCCESS; - } - } - return InteractionResult.PASS; - } -} diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedInternalSlotRecipeHandler.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedInternalSlotRecipeHandler.java deleted file mode 100644 index 5dac071..0000000 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedInternalSlotRecipeHandler.java +++ /dev/null @@ -1,130 +0,0 @@ -package net.neganote.gtutilities.integration.ae2.machine.trait; - -import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; - -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.fluids.FluidStack; -import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferPartMachine; - -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -public final class ExpandedInternalSlotRecipeHandler { - - @Getter - private final List slotHandlers; - - public ExpandedInternalSlotRecipeHandler(ExpandedPatternBufferPartMachine buffer, - ExpandedPatternBufferPartMachine.InternalSlot[] slots) { - this.slotHandlers = new ArrayList<>(slots.length); - for (int i = 0; i < slots.length; i++) { - var rhl = new SlotRHL(buffer, slots[i], i); - slotHandlers.add(rhl); - } - } - - @Getter - protected static class SlotRHL extends RecipeHandlerList { - - private final SlotItemRecipeHandler itemRecipeHandler; - private final SlotFluidRecipeHandler fluidRecipeHandler; - - public SlotRHL(ExpandedPatternBufferPartMachine buffer, ExpandedPatternBufferPartMachine.InternalSlot slot, - int idx) { - super(IO.IN); - itemRecipeHandler = new SlotItemRecipeHandler(buffer, slot, idx); - fluidRecipeHandler = new SlotFluidRecipeHandler(buffer, slot, idx); - addHandlers(buffer.getCircuitInventory(), buffer.getShareInventory(), buffer.getShareTank(), - itemRecipeHandler, fluidRecipeHandler); - this.setGroup(RecipeHandlerGroupDistinctness.BUS_DISTINCT); - } - - @Override - public boolean isDistinct() { - return true; - } - - @Override - public void setDistinct(boolean ignored, boolean notify) {} - } - - @Getter - private static class SlotItemRecipeHandler extends NotifiableRecipeHandlerTrait { - - private final ExpandedPatternBufferPartMachine.InternalSlot slot; - private final int priority; - private final int size = 81; - private final RecipeCapability capability = ItemRecipeCapability.CAP; - private final IO handlerIO = IO.IN; - private final boolean isDistinct = true; - - private SlotItemRecipeHandler(ExpandedPatternBufferPartMachine buffer, - ExpandedPatternBufferPartMachine.InternalSlot slot, int index) { - super(buffer); - this.slot = slot; - this.priority = IFilteredHandler.HIGH + index + 1; - slot.setOnContentsChanged(this::notifyListeners); - } - - @Override - public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { - if (io != IO.IN || slot.isItemEmpty()) return left; - return slot.handleItemInternal(left, simulate); - } - - @Override - public @NotNull List getContents() { - return new ArrayList<>(slot.getItems()); - } - - @Override - public double getTotalContentAmount() { - return slot.getItems().stream().mapToLong(ItemStack::getCount).sum(); - } - } - - @Getter - private static class SlotFluidRecipeHandler extends NotifiableRecipeHandlerTrait { - - private final ExpandedPatternBufferPartMachine.InternalSlot slot; - private final int priority; - private final int size = 81; - private final RecipeCapability capability = FluidRecipeCapability.CAP; - private final IO handlerIO = IO.IN; - private final boolean isDistinct = true; - - private SlotFluidRecipeHandler(ExpandedPatternBufferPartMachine buffer, - ExpandedPatternBufferPartMachine.InternalSlot slot, int index) { - super(buffer); - this.slot = slot; - this.priority = IFilteredHandler.HIGH + index + 1; - slot.setOnContentsChanged(this::notifyListeners); - } - - @Override - public List handleRecipeInner(IO io, GTRecipe recipe, List left, - boolean simulate) { - if (io != IO.IN || slot.isFluidEmpty()) return left; - return slot.handleFluidInternal(left, simulate); - } - - @Override - public @NotNull List getContents() { - return new ArrayList<>(slot.getFluids()); - } - - @Override - public double getTotalContentAmount() { - return slot.getFluids().stream().mapToLong(FluidStack::getAmount).sum(); - } - } -} diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java deleted file mode 100644 index f3569ef..0000000 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java +++ /dev/null @@ -1,199 +0,0 @@ -package net.neganote.gtutilities.integration.ae2.machine.trait; - -import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; - -import com.lowdragmc.lowdraglib.syncdata.ISubscription; - -import net.minecraft.world.item.crafting.Ingredient; -import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferPartMachine; -import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferProxyPartMachine; - -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public final class ExpandedProxySlotRecipeHandler { - - @Getter - private final List proxySlotHandlers; - - public ExpandedProxySlotRecipeHandler(ExpandedPatternBufferProxyPartMachine machine, int slots) { - proxySlotHandlers = new ArrayList<>(slots); - for (int i = 0; i < slots; ++i) { - proxySlotHandlers.add(new ProxyRHL(machine)); - } - } - - public void updateProxy(ExpandedPatternBufferPartMachine patternBuffer) { - var slotHandlers = patternBuffer.getInternalRecipeHandler().getSlotHandlers(); - for (int i = 0; i < proxySlotHandlers.size(); ++i) { - ProxyRHL proxyRHL = (ProxyRHL) proxySlotHandlers.get(i); - ExpandedInternalSlotRecipeHandler.SlotRHL slotRHL = (ExpandedInternalSlotRecipeHandler.SlotRHL) slotHandlers - .get(i); - proxyRHL.setBuffer(patternBuffer, slotRHL); - } - } - - public void clearProxy() { - for (var slotHandler : proxySlotHandlers) { - ((ProxyRHL) slotHandler).clearBuffer(); - } - } - - private static class ProxyRHL extends RecipeHandlerList { - - private final ProxyItemRecipeHandler circuit; - private final ProxyItemRecipeHandler sharedItem; - private final ProxyItemRecipeHandler slotItem; - private final ProxyFluidRecipeHandler sharedFluid; - private final ProxyFluidRecipeHandler slotFluid; - - public ProxyRHL(ExpandedPatternBufferProxyPartMachine machine) { - super(IO.IN); - circuit = new ProxyItemRecipeHandler(machine); - sharedItem = new ProxyItemRecipeHandler(machine); - slotItem = new ProxyItemRecipeHandler(machine); - sharedFluid = new ProxyFluidRecipeHandler(machine); - slotFluid = new ProxyFluidRecipeHandler(machine); - addHandlers(circuit, sharedItem, slotItem, sharedFluid, slotFluid); - this.setGroup(RecipeHandlerGroupDistinctness.BUS_DISTINCT); - } - - public void setBuffer(ExpandedPatternBufferPartMachine buffer, - ExpandedInternalSlotRecipeHandler.SlotRHL slotRHL) { - circuit.setProxy(buffer.getCircuitInventory()); - sharedItem.setProxy(buffer.getShareInventory()); - sharedFluid.setProxy(buffer.getShareTank()); - slotItem.setProxy(slotRHL.getItemRecipeHandler()); - slotFluid.setProxy(slotRHL.getFluidRecipeHandler()); - } - - public void clearBuffer() { - circuit.setProxy(null); - sharedItem.setProxy(null); - sharedFluid.setProxy(null); - slotItem.setProxy(null); - slotFluid.setProxy(null); - } - - @Override - public boolean isDistinct() { - return true; - } - - @Override - public void setDistinct(boolean ignored, boolean notify) {} - } - - @Getter - private static class ProxyItemRecipeHandler extends NotifiableRecipeHandlerTrait { - - private IRecipeHandlerTrait proxy = null; - private ISubscription proxySub = null; - private final IO handlerIO = IO.IN; - private final RecipeCapability capability = ItemRecipeCapability.CAP; - private final boolean isDistinct = true; - - public ProxyItemRecipeHandler(MetaMachine machine) { - super(machine); - } - - public void setProxy(IRecipeHandlerTrait proxy) { - this.proxy = proxy; - if (proxySub != null) { - proxySub.unsubscribe(); - proxySub = null; - } - if (proxy != null) { - proxySub = proxy.addChangedListener(this::notifyListeners); - } - } - - @Override - public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { - if (proxy == null) return left; - return proxy.handleRecipeInner(io, recipe, left, simulate); - } - - @Override - public int getSize() { - return proxy == null ? 0 : proxy.getSize(); - } - - @Override - public @NotNull List getContents() { - return proxy == null ? Collections.emptyList() : proxy.getContents(); - } - - @Override - public double getTotalContentAmount() { - return proxy == null ? 0 : proxy.getTotalContentAmount(); - } - - public int getPriority() { - return proxy == null ? IFilteredHandler.LOW : proxy.getPriority(); - } - } - - @Getter - private static class ProxyFluidRecipeHandler extends NotifiableRecipeHandlerTrait { - - private IRecipeHandlerTrait proxy = null; - private ISubscription proxySub = null; - private final IO handlerIO = IO.IN; - private final RecipeCapability capability = FluidRecipeCapability.CAP; - private final boolean isDistinct = true; - - public ProxyFluidRecipeHandler(MetaMachine machine) { - super(machine); - } - - public void setProxy(IRecipeHandlerTrait proxy) { - this.proxy = proxy; - if (proxySub != null) { - proxySub.unsubscribe(); - proxySub = null; - } - if (proxy != null) { - proxySub = proxy.addChangedListener(this::notifyListeners); - } - } - - @Override - public List handleRecipeInner(IO io, GTRecipe recipe, List left, - boolean simulate) { - if (proxy == null) return left; - return proxy.handleRecipeInner(io, recipe, left, simulate); - } - - @Override - public int getSize() { - return proxy == null ? 0 : proxy.getSize(); - } - - @Override - public @NotNull List getContents() { - return proxy == null ? Collections.emptyList() : proxy.getContents(); - } - - @Override - public double getTotalContentAmount() { - return proxy == null ? 0 : proxy.getTotalContentAmount(); - } - - @Override - public int getPriority() { - return proxy == null ? IFilteredHandler.LOW : proxy.getPriority(); - } - } -} diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java b/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java deleted file mode 100644 index 83567ed..0000000 --- a/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.neganote.gtutilities.integration.jade; - -import com.gregtechceu.gtceu.GTCEu; - -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.neganote.gtutilities.integration.jade.provider.ExpandedMEPatternBufferProvider; -import net.neganote.gtutilities.integration.jade.provider.ExpandedMEPatternBufferProxyProvider; -import net.neganote.gtutilities.integration.jade.provider.PTERBInformationProvider; - -import snownee.jade.api.IWailaClientRegistration; -import snownee.jade.api.IWailaCommonRegistration; -import snownee.jade.api.IWailaPlugin; -import snownee.jade.api.WailaPlugin; - -@SuppressWarnings("unused") -@WailaPlugin -public class UtilJadePlugin implements IWailaPlugin { - - @Override - public void register(IWailaCommonRegistration registration) { - registration.registerBlockDataProvider(new PTERBInformationProvider(), BlockEntity.class); - if (GTCEu.Mods.isAE2Loaded()) { - registration.registerBlockDataProvider(new ExpandedMEPatternBufferProvider(), BlockEntity.class); - registration.registerBlockDataProvider(new ExpandedMEPatternBufferProxyProvider(), BlockEntity.class); - } - } - - @Override - public void registerClient(IWailaClientRegistration registration) { - registration.registerBlockComponent(new PTERBInformationProvider(), Block.class); - if (GTCEu.Mods.isAE2Loaded()) { - registration.registerBlockComponent(new ExpandedMEPatternBufferProvider(), Block.class); - registration.registerBlockComponent(new ExpandedMEPatternBufferProxyProvider(), Block.class); - } - } -} diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java deleted file mode 100644 index 08c3183..0000000 --- a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.neganote.gtutilities.integration.jade.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.client.util.TooltipHelper; -import com.gregtechceu.gtceu.integration.jade.GTElementHelper; -import com.gregtechceu.gtceu.utils.FormattingUtil; - -import net.minecraft.ChatFormatting; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; -import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferPartMachine; - -import snownee.jade.api.BlockAccessor; -import snownee.jade.api.IBlockComponentProvider; -import snownee.jade.api.IServerDataProvider; -import snownee.jade.api.ITooltip; -import snownee.jade.api.config.IPluginConfig; -import snownee.jade.api.fluid.JadeFluidObject; -import snownee.jade.api.ui.IElementHelper; - -public class ExpandedMEPatternBufferProvider implements IBlockComponentProvider, IServerDataProvider { - - @Override - public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferPartMachine) { - CompoundTag serverData = blockAccessor.getServerData(); - if (!serverData.getBoolean("formed")) return; - - iTooltip.add(Component.translatable("gtceu.top.proxies_bound", serverData.getInt("proxies")) - .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); - readBufferTag(iTooltip, serverData); - } - } - } - - @Override - public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferPartMachine buffer) { - if (!buffer.isFormed()) { - compoundTag.putBoolean("formed", false); - return; - } - compoundTag.putBoolean("formed", true); - compoundTag.putInt("proxies", buffer.getProxies().size()); - writeBufferTag(compoundTag, buffer); - } - } - } - - @Override - public ResourceLocation getUid() { - return GTCEu.id("me_pattern_buffer"); - } - - public static void writeBufferTag(CompoundTag compoundTag, ExpandedPatternBufferPartMachine buffer) { - var merged = buffer.mergeInternalSlots(); - var items = merged.items(); - var fluids = merged.fluids(); - - ListTag itemsTag = new ListTag(); - for (var entry : items.object2LongEntrySet()) { - var ct = entry.getKey().serializeNBT(); - ct.putLong("real", entry.getLongValue()); - itemsTag.add(ct); - } - if (!itemsTag.isEmpty()) compoundTag.put("items", itemsTag); - - ListTag fluidsTag = new ListTag(); - for (var entry : fluids.object2LongEntrySet()) { - var ct = entry.getKey().writeToNBT(new CompoundTag()); - ct.putLong("real", entry.getLongValue()); - fluidsTag.add(ct); - } - if (!fluidsTag.isEmpty()) compoundTag.put("fluids", fluidsTag); - } - - public static void readBufferTag(ITooltip iTooltip, CompoundTag serverData) { - IElementHelper helper = iTooltip.getElementHelper(); - - ListTag itemsTag = serverData.getList("items", Tag.TAG_COMPOUND); - for (Tag t : itemsTag) { - if (!(t instanceof CompoundTag ct)) continue; - var stack = ItemStack.of(ct); - var count = ct.getLong("real"); - if (!stack.isEmpty() && count > 0) { - iTooltip.add(helper.smallItem(stack)); - Component text = Component.literal(" ") - .append(Component.literal(FormattingUtil.formatNumbers(count)) - .withStyle(ChatFormatting.DARK_PURPLE)) - .append(Component.literal("× ").withStyle(ChatFormatting.WHITE)) - .append(stack.getHoverName().copy().withStyle(ChatFormatting.GOLD)); - iTooltip.append(text); - } - } - ListTag fluidsTag = serverData.getList("fluids", Tag.TAG_COMPOUND); - for (Tag t : fluidsTag) { - if (!(t instanceof CompoundTag ct)) continue; - var stack = FluidStack.loadFluidStackFromNBT(ct); - var amount = ct.getLong("real"); - if (!stack.isEmpty() && amount > 0) { - iTooltip.add(GTElementHelper.smallFluid(JadeFluidObject.of(stack.getFluid()))); - Component text = Component.literal(" ") - .append(Component.literal(FormattingUtil.formatBuckets(amount))) - .withStyle(ChatFormatting.DARK_PURPLE) - .append(Component.literal(" ").withStyle(ChatFormatting.WHITE)) - .append(stack.getDisplayName().copy().withStyle(ChatFormatting.DARK_AQUA)); - iTooltip.append(text); - } - } - } -} diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java deleted file mode 100644 index 3446be2..0000000 --- a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.neganote.gtutilities.integration.jade.provider; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.client.util.TooltipHelper; -import com.gregtechceu.gtceu.integration.jade.provider.MEPatternBufferProvider; - -import net.minecraft.ChatFormatting; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferProxyPartMachine; - -import snownee.jade.api.BlockAccessor; -import snownee.jade.api.IBlockComponentProvider; -import snownee.jade.api.IServerDataProvider; -import snownee.jade.api.ITooltip; -import snownee.jade.api.config.IPluginConfig; - -public class ExpandedMEPatternBufferProxyProvider implements IBlockComponentProvider, - IServerDataProvider { - - @Override - public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferProxyPartMachine) { - CompoundTag serverData = blockAccessor.getServerData(); - if (!serverData.getBoolean("formed")) return; - if (!serverData.getBoolean("bound")) { - iTooltip.add(Component.translatable("gtceu.top.buffer_not_bound").withStyle(ChatFormatting.RED)); - return; - } - - int[] pos = serverData.getIntArray("pos"); - iTooltip.add(Component.translatable("gtceu.top.buffer_bound_pos", pos[0], pos[1], pos[2]) - .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); - - MEPatternBufferProvider.readBufferTag(iTooltip, - serverData); - } - } - } - - @Override - public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { - if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferProxyPartMachine proxy) { - if (!proxy.isFormed()) { - compoundTag.putBoolean("formed", false); - return; - } - compoundTag.putBoolean("formed", true); - var buffer = proxy.getBuffer(); - if (buffer == null) { - compoundTag.putBoolean("bound", false); - return; - } - compoundTag.putBoolean("bound", true); - - var pos = buffer.getPos(); - compoundTag.putIntArray("pos", new int[] { pos.getX(), pos.getY(), pos.getZ() }); - ExpandedMEPatternBufferProvider.writeBufferTag(compoundTag, buffer); - } - } - } - - @Override - public ResourceLocation getUid() { - return GTCEu.id("me_pattern_buffer_proxy"); - } -} From ebf38540b805834b077053ca3796959a972eb9f1 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Tue, 6 Jan 2026 23:32:59 -0500 Subject: [PATCH 04/12] Please just work. --- .../ExpandedPatternBufferPartMachine.java | 621 ++++++++++++++++++ ...ExpandedPatternBufferProxyPartMachine.java | 133 ++++ .../ExpandedInternalSlotRecipeHandler.java | 130 ++++ .../trait/ExpandedProxySlotRecipeHandler.java | 199 ++++++ .../integration/jade/UtilJadePlugin.java | 37 ++ .../ExpandedMEPatternBufferProvider.java | 119 ++++ .../ExpandedMEPatternBufferProxyProvider.java | 71 ++ 7 files changed, 1310 insertions(+) create mode 100644 src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java create mode 100644 src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java create mode 100644 src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedInternalSlotRecipeHandler.java create mode 100644 src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java create mode 100644 src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java create mode 100644 src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java create mode 100644 src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java new file mode 100644 index 0000000..c1e67e0 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java @@ -0,0 +1,621 @@ +package net.neganote.gtutilities.integration.ae2.machine; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.ButtonConfigurator; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.FancyInvConfigurator; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.FancyTankConfigurator; +import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; +import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.common.data.machines.GTAEMachines; +import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; +import com.gregtechceu.gtceu.integration.ae2.gui.widget.AETextInputButtonWidget; +import com.gregtechceu.gtceu.integration.ae2.gui.widget.slot.AEPatternViewSlotWidget; +import com.gregtechceu.gtceu.integration.ae2.machine.MEBusPartMachine; +import com.gregtechceu.gtceu.utils.GTMath; +import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; + +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.util.ClickData; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.IContentChangeAware; +import com.lowdragmc.lowdraglib.syncdata.ITagSerializable; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.TickTask; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidType; +import net.neganote.gtutilities.integration.ae2.machine.trait.ExpandedInternalSlotRecipeHandler; + +import appeng.api.crafting.IPatternDetails; +import appeng.api.crafting.PatternDetailsHelper; +import appeng.api.implementations.blockentities.PatternContainerGroup; +import appeng.api.inventories.InternalInventory; +import appeng.api.networking.IGrid; +import appeng.api.networking.IGridNodeListener; +import appeng.api.networking.crafting.ICraftingProvider; +import appeng.api.stacks.*; +import appeng.api.storage.MEStorage; +import appeng.api.storage.StorageHelper; +import appeng.crafting.pattern.EncodedPatternItem; +import appeng.crafting.pattern.ProcessingPatternItem; +import appeng.helpers.patternprovider.PatternContainer; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import it.unimi.dsi.fastutil.objects.*; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnmodifiableView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class ExpandedPatternBufferPartMachine extends MEBusPartMachine + implements ICraftingProvider, PatternContainer, IDataStickInteractable { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + ExpandedPatternBufferPartMachine.class, MEBusPartMachine.MANAGED_FIELD_HOLDER); + + protected static final int MAX_PATTERN_COUNT = 72; + + private final InternalInventory internalPatternInventory = new InternalInventory() { + + @Override + public int size() { + return MAX_PATTERN_COUNT; + } + + @Override + public ItemStack getStackInSlot(int slotIndex) { + return patternInventory.getStackInSlot(slotIndex); + } + + @Override + public void setItemDirect(int slotIndex, ItemStack stack) { + patternInventory.setStackInSlot(slotIndex, stack); + patternInventory.onContentsChanged(slotIndex); + onPatternChange(slotIndex); + } + }; + + @Getter + @Persisted + @DescSynced + private final CustomItemStackHandler patternInventory = new CustomItemStackHandler(MAX_PATTERN_COUNT); + + @Getter + @Persisted + protected final NotifiableItemStackHandler shareInventory; + + @Getter + @Persisted + protected final NotifiableFluidTank shareTank; + + @Getter + @Persisted + protected final InternalSlot[] internalInventory = new InternalSlot[MAX_PATTERN_COUNT]; + + private final BiMap detailsSlotMap = HashBiMap.create(MAX_PATTERN_COUNT); + + @DescSynced + @Persisted + @Setter + private String customName = ""; + + private boolean needPatternSync; + + @Persisted + private final Set proxies = new ObjectOpenHashSet<>(); + + private final Set proxyMachines = new ReferenceOpenHashSet<>(); + + @Getter + protected final ExpandedInternalSlotRecipeHandler internalRecipeHandler; + + @Nullable + protected TickableSubscription updateSubs; + + public ExpandedPatternBufferPartMachine(IMachineBlockEntity holder, Object... args) { + super(holder, IO.IN, args); + this.patternInventory.setFilter(stack -> stack.getItem() instanceof ProcessingPatternItem); + for (int i = 0; i < this.internalInventory.length; i++) { + this.internalInventory[i] = new InternalSlot(); + } + getMainNode().addService(ICraftingProvider.class, this); + this.shareInventory = new NotifiableItemStackHandler(this, 9, IO.IN, IO.NONE); + this.shareTank = new NotifiableFluidTank(this, 9, 8 * FluidType.BUCKET_VOLUME, IO.IN, IO.NONE); + this.internalRecipeHandler = new ExpandedInternalSlotRecipeHandler(this, internalInventory); + } + + @Override + public void onLoad() { + super.onLoad(); + if (getLevel() instanceof ServerLevel serverLevel) { + serverLevel.getServer().tell(new TickTask(1, () -> { + for (int i = 0; i < patternInventory.getSlots(); i++) { + var pattern = patternInventory.getStackInSlot(i); + var patternDetails = PatternDetailsHelper.decodePattern(pattern, getLevel()); + if (patternDetails != null) { + this.detailsSlotMap.put(patternDetails, this.internalInventory[i]); + } + } + needPatternSync = true; + })); + } + } + + @Override + public List getRecipeHandlers() { + return internalRecipeHandler.getSlotHandlers(); + } + + public void addProxy(ExpandedPatternBufferProxyPartMachine proxy) { + proxies.add(proxy.getPos()); + proxyMachines.add(proxy); + } + + public void removeProxy(ExpandedPatternBufferProxyPartMachine proxy) { + proxies.remove(proxy.getPos()); + proxyMachines.remove(proxy); + } + + @UnmodifiableView + public Set getProxies() { + if (proxyMachines.size() != proxies.size()) { + proxyMachines.clear(); + for (var pos : proxies) { + if (MetaMachine.getMachine(getLevel(), pos) instanceof ExpandedPatternBufferProxyPartMachine proxy) { + proxyMachines.add(proxy); + } + } + } + return Collections.unmodifiableSet(proxyMachines); + } + + @Override + public Widget createUIWidget() { + int rowSize = 9; + int colSize = 8; + var group = new WidgetGroup(0, 0, 18 * rowSize + 16, 18 * colSize + 16); + int index = 0; + for (int y = 0; y < colSize; ++y) { + for (int x = 0; x < rowSize; ++x) { + int finalI = index; + var slot = new AEPatternViewSlotWidget(patternInventory, index++, 8 + x * 18, 14 + y * 18) + .setOccupiedTexture(GuiTextures.SLOT) + .setItemHook(stack -> { + if (!stack.isEmpty() && stack.getItem() instanceof EncodedPatternItem iep) { + final ItemStack out = iep.getOutput(stack); + if (!out.isEmpty()) return out; + } + return stack; + }) + .setChangeListener(() -> onPatternChange(finalI)) + .setBackground(GuiTextures.SLOT, GuiTextures.PATTERN_OVERLAY); + group.addWidget(slot); + } + } + group.addWidget(new LabelWidget(8, 2, + () -> this.isOnline ? "gtceu.gui.me_network.online" : "gtceu.gui.me_network.offline")); + group.addWidget(new AETextInputButtonWidget(18 * rowSize + 8 - 70, 2, 70, 10) + .setText(customName) + .setOnConfirm(this::setCustomName) + .setButtonTooltips(Component.translatable("gui.gtceu.rename.desc"))); + return group; + } + + @Override + public boolean isWorkingEnabled() { + return true; + } + + @Override + public void setWorkingEnabled(boolean ignored) {} + + @Override + public boolean isDistinct() { + return true; + } + + @Override + public void setDistinct(boolean ignored) {} + + @Override + public void onMainNodeStateChanged(IGridNodeListener.State reason) { + super.onMainNodeStateChanged(reason); + this.updateSubscription(); + } + + protected void updateSubscription() { + if (getMainNode().isOnline()) { + updateSubs = subscribeServerTick(updateSubs, this::update); + } else if (updateSubs != null) { + updateSubs.unsubscribe(); + updateSubs = null; + } + } + + protected void update() { + if (needPatternSync) { + ICraftingProvider.requestUpdate(getMainNode()); + this.needPatternSync = false; + } + } + + private void refundAll(ClickData clickData) { + if (!clickData.isRemote) { + for (InternalSlot internalSlot : internalInventory) { + internalSlot.refund(); + } + } + } + + private void onPatternChange(int index) { + if (isRemote()) return; + var internalInv = internalInventory[index]; + var newPattern = patternInventory.getStackInSlot(index); + var newPatternDetails = PatternDetailsHelper.decodePattern(newPattern, getLevel()); + var oldPatternDetails = detailsSlotMap.inverse().get(internalInv); + detailsSlotMap.forcePut(newPatternDetails, internalInv); + if (oldPatternDetails != null && !oldPatternDetails.equals(newPatternDetails)) { + internalInv.refund(); + } + needPatternSync = true; + } + + @Override + public void attachConfigurators(ConfiguratorPanel configuratorPanel) { + configuratorPanel.attachConfigurators(new ButtonConfigurator( + new GuiTextureGroup(GuiTextures.BUTTON, GuiTextures.REFUND_OVERLAY), this::refundAll) + .setTooltips(List.of(Component.translatable("gui.gtceu.refund_all.desc")))); + if (isHasCircuitSlot() && isCircuitSlotEnabled()) { + configuratorPanel.attachConfigurators(new CircuitFancyConfigurator(circuitInventory.storage)); + } + configuratorPanel.attachConfigurators(new FancyInvConfigurator( + shareInventory.storage, Component.translatable("gui.gtceu.share_inventory.title")) + .setTooltips(List.of( + Component.translatable("gui.gtceu.share_inventory.desc.0"), + Component.translatable("gui.gtceu.share_inventory.desc.1")))); + configuratorPanel.attachConfigurators(new FancyTankConfigurator( + shareTank.getStorages(), Component.translatable("gui.gtceu.share_tank.title")) + .setTooltips(List.of( + Component.translatable("gui.gtceu.share_tank.desc.0"), + Component.translatable("gui.gtceu.share_inventory.desc.1")))); + } + + @Override + public List getAvailablePatterns() { + return detailsSlotMap.keySet().stream().filter(Objects::nonNull).toList(); + } + + @Override + public boolean pushPattern(IPatternDetails patternDetails, KeyCounter[] inputHolder) { + if (!isFormed() || !getMainNode().isActive() || !detailsSlotMap.containsKey(patternDetails) || + !checkInput(inputHolder)) { + return false; + } + var slot = detailsSlotMap.get(patternDetails); + if (slot != null) { + slot.pushPattern(patternDetails, inputHolder); + return true; + } + return false; + } + + @Override + public boolean isBusy() { + return false; + } + + private boolean checkInput(KeyCounter[] inputHolder) { + for (KeyCounter input : inputHolder) { + var illegal = input.keySet().stream() + .map(AEKey::getType) + .map(AEKeyType::getId) + .anyMatch(id -> !id.equals(AEKeyType.items().getId()) && !id.equals(AEKeyType.fluids().getId())); + if (illegal) return false; + } + return true; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public @Nullable IGrid getGrid() { + return getMainNode().getGrid(); + } + + @Override + public InternalInventory getTerminalPatternInventory() { + return internalPatternInventory; + } + + @Override + public PatternContainerGroup getTerminalGroup() { + if (isFormed()) { + IMultiController controller = getControllers().first(); + MultiblockMachineDefinition controllerDefinition = controller.self().getDefinition(); + if (!customName.isEmpty()) { + return new PatternContainerGroup(AEItemKey.of(controllerDefinition.asStack()), + Component.literal(customName), Collections.emptyList()); + } else { + ItemStack circuitStack = isHasCircuitSlot() ? circuitInventory.storage.getStackInSlot(0) : + ItemStack.EMPTY; + int circuitConfiguration = circuitStack.isEmpty() ? -1 : + IntCircuitBehaviour.getCircuitConfiguration(circuitStack); + Component groupName = circuitConfiguration != -1 ? + Component.translatable(controllerDefinition.getDescriptionId()) + .append(" - " + circuitConfiguration) : + Component.translatable(controllerDefinition.getDescriptionId()); + return new PatternContainerGroup(AEItemKey.of(controllerDefinition.asStack()), groupName, + Collections.emptyList()); + } + } else { + return new PatternContainerGroup(AEItemKey.of(GTAEMachines.ME_PATTERN_BUFFER.getItem()), + customName.isEmpty() ? + GTAEMachines.ME_PATTERN_BUFFER.get().getDefinition().getItem().getDescription() : + Component.literal(customName), + Collections.emptyList()); + } + } + + @Override + public void onMachineRemoved() { + clearInventory(patternInventory); + clearInventory(shareInventory); + } + + @Override + public InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { + dataStick.getOrCreateTag().putIntArray("pos", new int[] { getPos().getX(), getPos().getY(), getPos().getZ() }); + return InteractionResult.SUCCESS; + } + + public record BufferData(Object2LongMap items, Object2LongMap fluids) {} + + public BufferData mergeInternalSlots() { + var items = new Object2LongOpenCustomHashMap<>(ItemStackHashStrategy.comparingAllButCount()); + var fluids = new Object2LongOpenHashMap(); + for (InternalSlot slot : internalInventory) { + slot.itemInventory.object2LongEntrySet().fastForEach(e -> items.addTo(e.getKey(), e.getLongValue())); + slot.fluidInventory.object2LongEntrySet().fastForEach(e -> fluids.addTo(e.getKey(), e.getLongValue())); + } + return new BufferData(items, fluids); + } + + public class InternalSlot implements ITagSerializable, IContentChangeAware { + + @Getter + @Setter + private Runnable onContentsChanged = () -> {}; + private final Object2LongOpenCustomHashMap itemInventory = new Object2LongOpenCustomHashMap<>( + ItemStackHashStrategy.comparingAllButCount()); + private final Object2LongOpenHashMap fluidInventory = new Object2LongOpenHashMap<>(); + private List itemStacks = null; + private List fluidStacks = null; + + public InternalSlot() {} + + public boolean isItemEmpty() { + return itemInventory.isEmpty(); + } + + public boolean isFluidEmpty() { + return fluidInventory.isEmpty(); + } + + public void onContentsChanged() { + itemStacks = null; + fluidStacks = null; + onContentsChanged.run(); + } + + private void add(AEKey what, long amount) { + if (amount <= 0L) return; + if (what instanceof AEItemKey itemKey) { + itemInventory.addTo(itemKey.toStack(), amount); + } else if (what instanceof AEFluidKey fluidKey) { + fluidInventory.addTo(fluidKey.toStack(1), amount); + } + } + + public List getItems() { + if (itemStacks == null) { + itemStacks = new ArrayList<>(); + itemInventory.object2LongEntrySet().stream().map(e -> GTMath.splitStacks(e.getKey(), e.getLongValue())) + .forEach(itemStacks::addAll); + } + return itemStacks; + } + + public List getFluids() { + if (fluidStacks == null) { + fluidStacks = new ArrayList<>(); + fluidInventory.object2LongEntrySet().stream() + .map(e -> GTMath.splitFluidStacks(e.getKey(), e.getLongValue())).forEach(fluidStacks::addAll); + } + return fluidStacks; + } + + public void refund() { + var network = getMainNode().getGrid(); + if (network != null) { + MEStorage networkInv = network.getStorageService().getInventory(); + var energy = network.getEnergyService(); + for (var it = itemInventory.object2LongEntrySet().iterator(); it.hasNext();) { + var entry = it.next(); + var key = AEItemKey.of(entry.getKey()); + if (key == null) continue; + long inserted = StorageHelper.poweredInsert(energy, networkInv, key, entry.getLongValue(), + actionSource); + if (inserted > 0) { + long count = entry.getLongValue() - inserted; + if (count == 0) it.remove(); + else entry.setValue(count); + } + } + for (var it = fluidInventory.object2LongEntrySet().iterator(); it.hasNext();) { + var entry = it.next(); + var key = AEFluidKey.of(entry.getKey()); + if (key == null) continue; + long inserted = StorageHelper.poweredInsert(energy, networkInv, key, entry.getLongValue(), + actionSource); + if (inserted > 0) { + long amount = entry.getLongValue() - inserted; + if (amount == 0) it.remove(); + else entry.setValue(amount); + } + } + onContentsChanged(); + } + } + + public void pushPattern(IPatternDetails patternDetails, KeyCounter[] inputHolder) { + patternDetails.pushInputsToExternalInventory(inputHolder, this::add); + onContentsChanged(); + } + + public @Nullable List handleItemInternal(List left, boolean simulate) { + boolean changed = false; + for (var it = left.listIterator(); it.hasNext();) { + var ingredient = it.next(); + var items = ingredient.getItems(); + if (items.length == 0 || items[0].isEmpty()) { + it.remove(); + continue; + } + int amount = items[0].getCount(); + for (var it2 = itemInventory.object2LongEntrySet().iterator(); it2.hasNext();) { + var entry = it2.next(); + if (!ingredient.test(entry.getKey())) continue; + int extracted = Math.min(GTMath.saturatedCast(entry.getLongValue()), amount); + if (!simulate && extracted > 0) { + changed = true; + long count = entry.getLongValue() - extracted; + if (count == 0) it2.remove(); + else entry.setValue(count); + } + amount -= extracted; + if (amount <= 0) { + it.remove(); + break; + } + } + if (amount > 0) { + if (ingredient instanceof SizedIngredient si) si.setAmount(amount); + else items[0].setCount(amount); + } + } + if (changed) onContentsChanged(); + return left.isEmpty() ? null : left; + } + + public @Nullable List handleFluidInternal(List left, boolean simulate) { + boolean changed = false; + for (var it = left.listIterator(); it.hasNext();) { + var ingredient = it.next(); + var fluids = ingredient.getStacks(); + if (fluids.length == 0 || fluids[0].isEmpty()) { + it.remove(); + continue; + } + int amount = fluids[0].getAmount(); + for (var it2 = fluidInventory.object2LongEntrySet().iterator(); it2.hasNext();) { + var entry = it2.next(); + if (!ingredient.test(entry.getKey())) continue; + int extracted = Math.min(GTMath.saturatedCast(entry.getLongValue()), amount); + if (!simulate && extracted > 0) { + changed = true; + long count = entry.getLongValue() - extracted; + if (count == 0) it2.remove(); + else entry.setValue(count); + } + amount -= extracted; + if (amount <= 0) { + it.remove(); + break; + } + } + if (amount > 0) ingredient.setAmount(amount); + } + if (changed) onContentsChanged(); + return left.isEmpty() ? null : left; + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + ListTag itemsTag = new ListTag(); + for (var entry : itemInventory.object2LongEntrySet()) { + var ct = entry.getKey().serializeNBT(); + ct.putLong("real", entry.getLongValue()); + itemsTag.add(ct); + } + if (!itemsTag.isEmpty()) tag.put("inventory", itemsTag); + ListTag fluidsTag = new ListTag(); + for (var entry : fluidInventory.object2LongEntrySet()) { + var ct = entry.getKey().writeToNBT(new CompoundTag()); + ct.putLong("real", entry.getLongValue()); + fluidsTag.add(ct); + } + if (!fluidsTag.isEmpty()) tag.put("fluidInventory", fluidsTag); + return tag; + } + + @Override + public void deserializeNBT(CompoundTag tag) { + ListTag items = tag.getList("inventory", Tag.TAG_COMPOUND); + for (Tag t : items) { + if (!(t instanceof CompoundTag ct)) continue; + var stack = ItemStack.of(ct); + var count = ct.getLong("real"); + if (!stack.isEmpty() && count > 0) itemInventory.put(stack, count); + } + ListTag fluids = tag.getList("fluidInventory", Tag.TAG_COMPOUND); + for (Tag t : fluids) { + if (!(t instanceof CompoundTag ct)) continue; + var stack = FluidStack.loadFluidStackFromNBT(ct); + var amount = ct.getLong("real"); + if (!stack.isEmpty() && amount > 0) fluidInventory.put(stack, amount); + } + } + } +} diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java new file mode 100644 index 0000000..a536fe7 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java @@ -0,0 +1,133 @@ +package net.neganote.gtutilities.integration.ae2.machine; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.Tag; +import net.minecraft.server.TickTask; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.BlockHitResult; +import net.neganote.gtutilities.integration.ae2.machine.trait.ExpandedProxySlotRecipeHandler; + +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class ExpandedPatternBufferProxyPartMachine extends TieredIOPartMachine + implements IMachineLife, IDataStickInteractable { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + ExpandedPatternBufferProxyPartMachine.class, TieredIOPartMachine.MANAGED_FIELD_HOLDER); + + @Getter + private final ExpandedProxySlotRecipeHandler proxySlotRecipeHandler; + + @Persisted + @Getter + @DescSynced + private @Nullable BlockPos bufferPos; + + private @Nullable ExpandedPatternBufferPartMachine buffer = null; + private boolean bufferResolved = false; + + public ExpandedPatternBufferProxyPartMachine(IMachineBlockEntity holder) { + super(holder, GTValues.LuV, IO.IN); + this.proxySlotRecipeHandler = new ExpandedProxySlotRecipeHandler(this, 72); + } + + @Override + public void onLoad() { + super.onLoad(); + if (getLevel() instanceof ServerLevel level) { + level.getServer().tell(new TickTask(0, () -> this.setBuffer(bufferPos))); + } + } + + @Override + public List getRecipeHandlers() { + return proxySlotRecipeHandler.getProxySlotHandlers(); + } + + public void setBuffer(@Nullable BlockPos pos) { + this.bufferResolved = true; + var level = getLevel(); + if (level == null || pos == null) { + this.buffer = null; + } else if (MetaMachine.getMachine(level, pos) instanceof ExpandedPatternBufferPartMachine machine) { + bufferPos = pos; + buffer = machine; + machine.addProxy(this); + if (!isRemote()) proxySlotRecipeHandler.updateProxy(machine); + } else { + this.buffer = null; + } + } + + @Nullable + public ExpandedPatternBufferPartMachine getBuffer() { + if (!bufferResolved) setBuffer(bufferPos); + return buffer; + } + + @Override + public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + return getBuffer() != null; + } + + @Override + public ModularUI createUI(Player entityPlayer) { + var buf = getBuffer(); + assert buf != null; + return buf.createUI(entityPlayer); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public void onMachineRemoved() { + var buf = getBuffer(); + if (buf != null) { + buf.removeProxy(this); + proxySlotRecipeHandler.clearProxy(); + } + } + + @Override + public InteractionResult onDataStickUse(Player player, ItemStack dataStick) { + if (dataStick.hasTag()) { + assert dataStick.getTag() != null; + if (dataStick.getTag().contains("pos", Tag.TAG_INT_ARRAY)) { + var posArray = dataStick.getOrCreateTag().getIntArray("pos"); + var newBufferPos = new BlockPos(posArray[0], posArray[1], posArray[2]); + setBuffer(newBufferPos); + return InteractionResult.SUCCESS; + } + } + return InteractionResult.PASS; + } +} diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedInternalSlotRecipeHandler.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedInternalSlotRecipeHandler.java new file mode 100644 index 0000000..5dac071 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedInternalSlotRecipeHandler.java @@ -0,0 +1,130 @@ +package net.neganote.gtutilities.integration.ae2.machine.trait; + +import com.gregtechceu.gtceu.api.capability.recipe.*; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.fluids.FluidStack; +import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferPartMachine; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public final class ExpandedInternalSlotRecipeHandler { + + @Getter + private final List slotHandlers; + + public ExpandedInternalSlotRecipeHandler(ExpandedPatternBufferPartMachine buffer, + ExpandedPatternBufferPartMachine.InternalSlot[] slots) { + this.slotHandlers = new ArrayList<>(slots.length); + for (int i = 0; i < slots.length; i++) { + var rhl = new SlotRHL(buffer, slots[i], i); + slotHandlers.add(rhl); + } + } + + @Getter + protected static class SlotRHL extends RecipeHandlerList { + + private final SlotItemRecipeHandler itemRecipeHandler; + private final SlotFluidRecipeHandler fluidRecipeHandler; + + public SlotRHL(ExpandedPatternBufferPartMachine buffer, ExpandedPatternBufferPartMachine.InternalSlot slot, + int idx) { + super(IO.IN); + itemRecipeHandler = new SlotItemRecipeHandler(buffer, slot, idx); + fluidRecipeHandler = new SlotFluidRecipeHandler(buffer, slot, idx); + addHandlers(buffer.getCircuitInventory(), buffer.getShareInventory(), buffer.getShareTank(), + itemRecipeHandler, fluidRecipeHandler); + this.setGroup(RecipeHandlerGroupDistinctness.BUS_DISTINCT); + } + + @Override + public boolean isDistinct() { + return true; + } + + @Override + public void setDistinct(boolean ignored, boolean notify) {} + } + + @Getter + private static class SlotItemRecipeHandler extends NotifiableRecipeHandlerTrait { + + private final ExpandedPatternBufferPartMachine.InternalSlot slot; + private final int priority; + private final int size = 81; + private final RecipeCapability capability = ItemRecipeCapability.CAP; + private final IO handlerIO = IO.IN; + private final boolean isDistinct = true; + + private SlotItemRecipeHandler(ExpandedPatternBufferPartMachine buffer, + ExpandedPatternBufferPartMachine.InternalSlot slot, int index) { + super(buffer); + this.slot = slot; + this.priority = IFilteredHandler.HIGH + index + 1; + slot.setOnContentsChanged(this::notifyListeners); + } + + @Override + public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { + if (io != IO.IN || slot.isItemEmpty()) return left; + return slot.handleItemInternal(left, simulate); + } + + @Override + public @NotNull List getContents() { + return new ArrayList<>(slot.getItems()); + } + + @Override + public double getTotalContentAmount() { + return slot.getItems().stream().mapToLong(ItemStack::getCount).sum(); + } + } + + @Getter + private static class SlotFluidRecipeHandler extends NotifiableRecipeHandlerTrait { + + private final ExpandedPatternBufferPartMachine.InternalSlot slot; + private final int priority; + private final int size = 81; + private final RecipeCapability capability = FluidRecipeCapability.CAP; + private final IO handlerIO = IO.IN; + private final boolean isDistinct = true; + + private SlotFluidRecipeHandler(ExpandedPatternBufferPartMachine buffer, + ExpandedPatternBufferPartMachine.InternalSlot slot, int index) { + super(buffer); + this.slot = slot; + this.priority = IFilteredHandler.HIGH + index + 1; + slot.setOnContentsChanged(this::notifyListeners); + } + + @Override + public List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { + if (io != IO.IN || slot.isFluidEmpty()) return left; + return slot.handleFluidInternal(left, simulate); + } + + @Override + public @NotNull List getContents() { + return new ArrayList<>(slot.getFluids()); + } + + @Override + public double getTotalContentAmount() { + return slot.getFluids().stream().mapToLong(FluidStack::getAmount).sum(); + } + } +} diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java new file mode 100644 index 0000000..f3569ef --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/trait/ExpandedProxySlotRecipeHandler.java @@ -0,0 +1,199 @@ +package net.neganote.gtutilities.integration.ae2.machine.trait; + +import com.gregtechceu.gtceu.api.capability.recipe.*; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; + +import com.lowdragmc.lowdraglib.syncdata.ISubscription; + +import net.minecraft.world.item.crafting.Ingredient; +import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferPartMachine; +import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferProxyPartMachine; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public final class ExpandedProxySlotRecipeHandler { + + @Getter + private final List proxySlotHandlers; + + public ExpandedProxySlotRecipeHandler(ExpandedPatternBufferProxyPartMachine machine, int slots) { + proxySlotHandlers = new ArrayList<>(slots); + for (int i = 0; i < slots; ++i) { + proxySlotHandlers.add(new ProxyRHL(machine)); + } + } + + public void updateProxy(ExpandedPatternBufferPartMachine patternBuffer) { + var slotHandlers = patternBuffer.getInternalRecipeHandler().getSlotHandlers(); + for (int i = 0; i < proxySlotHandlers.size(); ++i) { + ProxyRHL proxyRHL = (ProxyRHL) proxySlotHandlers.get(i); + ExpandedInternalSlotRecipeHandler.SlotRHL slotRHL = (ExpandedInternalSlotRecipeHandler.SlotRHL) slotHandlers + .get(i); + proxyRHL.setBuffer(patternBuffer, slotRHL); + } + } + + public void clearProxy() { + for (var slotHandler : proxySlotHandlers) { + ((ProxyRHL) slotHandler).clearBuffer(); + } + } + + private static class ProxyRHL extends RecipeHandlerList { + + private final ProxyItemRecipeHandler circuit; + private final ProxyItemRecipeHandler sharedItem; + private final ProxyItemRecipeHandler slotItem; + private final ProxyFluidRecipeHandler sharedFluid; + private final ProxyFluidRecipeHandler slotFluid; + + public ProxyRHL(ExpandedPatternBufferProxyPartMachine machine) { + super(IO.IN); + circuit = new ProxyItemRecipeHandler(machine); + sharedItem = new ProxyItemRecipeHandler(machine); + slotItem = new ProxyItemRecipeHandler(machine); + sharedFluid = new ProxyFluidRecipeHandler(machine); + slotFluid = new ProxyFluidRecipeHandler(machine); + addHandlers(circuit, sharedItem, slotItem, sharedFluid, slotFluid); + this.setGroup(RecipeHandlerGroupDistinctness.BUS_DISTINCT); + } + + public void setBuffer(ExpandedPatternBufferPartMachine buffer, + ExpandedInternalSlotRecipeHandler.SlotRHL slotRHL) { + circuit.setProxy(buffer.getCircuitInventory()); + sharedItem.setProxy(buffer.getShareInventory()); + sharedFluid.setProxy(buffer.getShareTank()); + slotItem.setProxy(slotRHL.getItemRecipeHandler()); + slotFluid.setProxy(slotRHL.getFluidRecipeHandler()); + } + + public void clearBuffer() { + circuit.setProxy(null); + sharedItem.setProxy(null); + sharedFluid.setProxy(null); + slotItem.setProxy(null); + slotFluid.setProxy(null); + } + + @Override + public boolean isDistinct() { + return true; + } + + @Override + public void setDistinct(boolean ignored, boolean notify) {} + } + + @Getter + private static class ProxyItemRecipeHandler extends NotifiableRecipeHandlerTrait { + + private IRecipeHandlerTrait proxy = null; + private ISubscription proxySub = null; + private final IO handlerIO = IO.IN; + private final RecipeCapability capability = ItemRecipeCapability.CAP; + private final boolean isDistinct = true; + + public ProxyItemRecipeHandler(MetaMachine machine) { + super(machine); + } + + public void setProxy(IRecipeHandlerTrait proxy) { + this.proxy = proxy; + if (proxySub != null) { + proxySub.unsubscribe(); + proxySub = null; + } + if (proxy != null) { + proxySub = proxy.addChangedListener(this::notifyListeners); + } + } + + @Override + public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { + if (proxy == null) return left; + return proxy.handleRecipeInner(io, recipe, left, simulate); + } + + @Override + public int getSize() { + return proxy == null ? 0 : proxy.getSize(); + } + + @Override + public @NotNull List getContents() { + return proxy == null ? Collections.emptyList() : proxy.getContents(); + } + + @Override + public double getTotalContentAmount() { + return proxy == null ? 0 : proxy.getTotalContentAmount(); + } + + public int getPriority() { + return proxy == null ? IFilteredHandler.LOW : proxy.getPriority(); + } + } + + @Getter + private static class ProxyFluidRecipeHandler extends NotifiableRecipeHandlerTrait { + + private IRecipeHandlerTrait proxy = null; + private ISubscription proxySub = null; + private final IO handlerIO = IO.IN; + private final RecipeCapability capability = FluidRecipeCapability.CAP; + private final boolean isDistinct = true; + + public ProxyFluidRecipeHandler(MetaMachine machine) { + super(machine); + } + + public void setProxy(IRecipeHandlerTrait proxy) { + this.proxy = proxy; + if (proxySub != null) { + proxySub.unsubscribe(); + proxySub = null; + } + if (proxy != null) { + proxySub = proxy.addChangedListener(this::notifyListeners); + } + } + + @Override + public List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { + if (proxy == null) return left; + return proxy.handleRecipeInner(io, recipe, left, simulate); + } + + @Override + public int getSize() { + return proxy == null ? 0 : proxy.getSize(); + } + + @Override + public @NotNull List getContents() { + return proxy == null ? Collections.emptyList() : proxy.getContents(); + } + + @Override + public double getTotalContentAmount() { + return proxy == null ? 0 : proxy.getTotalContentAmount(); + } + + @Override + public int getPriority() { + return proxy == null ? IFilteredHandler.LOW : proxy.getPriority(); + } + } +} diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java b/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java new file mode 100644 index 0000000..83567ed --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java @@ -0,0 +1,37 @@ +package net.neganote.gtutilities.integration.jade; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neganote.gtutilities.integration.jade.provider.ExpandedMEPatternBufferProvider; +import net.neganote.gtutilities.integration.jade.provider.ExpandedMEPatternBufferProxyProvider; +import net.neganote.gtutilities.integration.jade.provider.PTERBInformationProvider; + +import snownee.jade.api.IWailaClientRegistration; +import snownee.jade.api.IWailaCommonRegistration; +import snownee.jade.api.IWailaPlugin; +import snownee.jade.api.WailaPlugin; + +@SuppressWarnings("unused") +@WailaPlugin +public class UtilJadePlugin implements IWailaPlugin { + + @Override + public void register(IWailaCommonRegistration registration) { + registration.registerBlockDataProvider(new PTERBInformationProvider(), BlockEntity.class); + if (GTCEu.Mods.isAE2Loaded()) { + registration.registerBlockDataProvider(new ExpandedMEPatternBufferProvider(), BlockEntity.class); + registration.registerBlockDataProvider(new ExpandedMEPatternBufferProxyProvider(), BlockEntity.class); + } + } + + @Override + public void registerClient(IWailaClientRegistration registration) { + registration.registerBlockComponent(new PTERBInformationProvider(), Block.class); + if (GTCEu.Mods.isAE2Loaded()) { + registration.registerBlockComponent(new ExpandedMEPatternBufferProvider(), Block.class); + registration.registerBlockComponent(new ExpandedMEPatternBufferProxyProvider(), Block.class); + } + } +} diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java new file mode 100644 index 0000000..08c3183 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java @@ -0,0 +1,119 @@ +package net.neganote.gtutilities.integration.jade.provider; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.client.util.TooltipHelper; +import com.gregtechceu.gtceu.integration.jade.GTElementHelper; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; +import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferPartMachine; + +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IBlockComponentProvider; +import snownee.jade.api.IServerDataProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; +import snownee.jade.api.fluid.JadeFluidObject; +import snownee.jade.api.ui.IElementHelper; + +public class ExpandedMEPatternBufferProvider implements IBlockComponentProvider, IServerDataProvider { + + @Override + public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferPartMachine) { + CompoundTag serverData = blockAccessor.getServerData(); + if (!serverData.getBoolean("formed")) return; + + iTooltip.add(Component.translatable("gtceu.top.proxies_bound", serverData.getInt("proxies")) + .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); + readBufferTag(iTooltip, serverData); + } + } + } + + @Override + public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferPartMachine buffer) { + if (!buffer.isFormed()) { + compoundTag.putBoolean("formed", false); + return; + } + compoundTag.putBoolean("formed", true); + compoundTag.putInt("proxies", buffer.getProxies().size()); + writeBufferTag(compoundTag, buffer); + } + } + } + + @Override + public ResourceLocation getUid() { + return GTCEu.id("me_pattern_buffer"); + } + + public static void writeBufferTag(CompoundTag compoundTag, ExpandedPatternBufferPartMachine buffer) { + var merged = buffer.mergeInternalSlots(); + var items = merged.items(); + var fluids = merged.fluids(); + + ListTag itemsTag = new ListTag(); + for (var entry : items.object2LongEntrySet()) { + var ct = entry.getKey().serializeNBT(); + ct.putLong("real", entry.getLongValue()); + itemsTag.add(ct); + } + if (!itemsTag.isEmpty()) compoundTag.put("items", itemsTag); + + ListTag fluidsTag = new ListTag(); + for (var entry : fluids.object2LongEntrySet()) { + var ct = entry.getKey().writeToNBT(new CompoundTag()); + ct.putLong("real", entry.getLongValue()); + fluidsTag.add(ct); + } + if (!fluidsTag.isEmpty()) compoundTag.put("fluids", fluidsTag); + } + + public static void readBufferTag(ITooltip iTooltip, CompoundTag serverData) { + IElementHelper helper = iTooltip.getElementHelper(); + + ListTag itemsTag = serverData.getList("items", Tag.TAG_COMPOUND); + for (Tag t : itemsTag) { + if (!(t instanceof CompoundTag ct)) continue; + var stack = ItemStack.of(ct); + var count = ct.getLong("real"); + if (!stack.isEmpty() && count > 0) { + iTooltip.add(helper.smallItem(stack)); + Component text = Component.literal(" ") + .append(Component.literal(FormattingUtil.formatNumbers(count)) + .withStyle(ChatFormatting.DARK_PURPLE)) + .append(Component.literal("× ").withStyle(ChatFormatting.WHITE)) + .append(stack.getHoverName().copy().withStyle(ChatFormatting.GOLD)); + iTooltip.append(text); + } + } + ListTag fluidsTag = serverData.getList("fluids", Tag.TAG_COMPOUND); + for (Tag t : fluidsTag) { + if (!(t instanceof CompoundTag ct)) continue; + var stack = FluidStack.loadFluidStackFromNBT(ct); + var amount = ct.getLong("real"); + if (!stack.isEmpty() && amount > 0) { + iTooltip.add(GTElementHelper.smallFluid(JadeFluidObject.of(stack.getFluid()))); + Component text = Component.literal(" ") + .append(Component.literal(FormattingUtil.formatBuckets(amount))) + .withStyle(ChatFormatting.DARK_PURPLE) + .append(Component.literal(" ").withStyle(ChatFormatting.WHITE)) + .append(stack.getDisplayName().copy().withStyle(ChatFormatting.DARK_AQUA)); + iTooltip.append(text); + } + } + } +} diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java new file mode 100644 index 0000000..3446be2 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java @@ -0,0 +1,71 @@ +package net.neganote.gtutilities.integration.jade.provider; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.client.util.TooltipHelper; +import com.gregtechceu.gtceu.integration.jade.provider.MEPatternBufferProvider; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferProxyPartMachine; + +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IBlockComponentProvider; +import snownee.jade.api.IServerDataProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +public class ExpandedMEPatternBufferProxyProvider implements IBlockComponentProvider, + IServerDataProvider { + + @Override + public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferProxyPartMachine) { + CompoundTag serverData = blockAccessor.getServerData(); + if (!serverData.getBoolean("formed")) return; + if (!serverData.getBoolean("bound")) { + iTooltip.add(Component.translatable("gtceu.top.buffer_not_bound").withStyle(ChatFormatting.RED)); + return; + } + + int[] pos = serverData.getIntArray("pos"); + iTooltip.add(Component.translatable("gtceu.top.buffer_bound_pos", pos[0], pos[1], pos[2]) + .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)); + + MEPatternBufferProvider.readBufferTag(iTooltip, + serverData); + } + } + } + + @Override + public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { + if (blockAccessor.getBlockEntity() instanceof IMachineBlockEntity blockEntity) { + if (blockEntity.getMetaMachine() instanceof ExpandedPatternBufferProxyPartMachine proxy) { + if (!proxy.isFormed()) { + compoundTag.putBoolean("formed", false); + return; + } + compoundTag.putBoolean("formed", true); + var buffer = proxy.getBuffer(); + if (buffer == null) { + compoundTag.putBoolean("bound", false); + return; + } + compoundTag.putBoolean("bound", true); + + var pos = buffer.getPos(); + compoundTag.putIntArray("pos", new int[] { pos.getX(), pos.getY(), pos.getZ() }); + ExpandedMEPatternBufferProvider.writeBufferTag(compoundTag, buffer); + } + } + } + + @Override + public ResourceLocation getUid() { + return GTCEu.id("me_pattern_buffer_proxy"); + } +} From 44580d7d85150ee553d38c095e70b51f4bd2b3df Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Tue, 6 Jan 2026 23:37:52 -0500 Subject: [PATCH 05/12] Please just work. --- .../ae2/machine/ExpandedPatternBufferProxyPartMachine.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java index a536fe7..638fa25 100644 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java @@ -41,6 +41,7 @@ public class ExpandedPatternBufferProxyPartMachine extends TieredIOPartMachine protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( ExpandedPatternBufferProxyPartMachine.class, TieredIOPartMachine.MANAGED_FIELD_HOLDER); + //The proxy seems to be working fine now. @Getter private final ExpandedProxySlotRecipeHandler proxySlotRecipeHandler; From 430135d3bf48e621f970e7f43a99b43e640b4d84 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Tue, 6 Jan 2026 23:43:19 -0500 Subject: [PATCH 06/12] Please just work. --- .../ae2/machine/ExpandedPatternBufferProxyPartMachine.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java index 638fa25..a536fe7 100644 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferProxyPartMachine.java @@ -41,7 +41,6 @@ public class ExpandedPatternBufferProxyPartMachine extends TieredIOPartMachine protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( ExpandedPatternBufferProxyPartMachine.class, TieredIOPartMachine.MANAGED_FIELD_HOLDER); - //The proxy seems to be working fine now. @Getter private final ExpandedProxySlotRecipeHandler proxySlotRecipeHandler; From 60c5c089c348cf9f9178afdd68bb7a633eff7486 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Wed, 7 Jan 2026 00:40:03 -0500 Subject: [PATCH 07/12] Requested changes. --- src/generated/resources/assets/gtmutils/lang/en_us.json | 1 - .../ae2/machine/ExpandedPatternBufferPartMachine.java | 6 +----- .../jade/provider/ExpandedMEPatternBufferProvider.java | 3 ++- .../jade/provider/ExpandedMEPatternBufferProxyProvider.java | 3 ++- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/generated/resources/assets/gtmutils/lang/en_us.json b/src/generated/resources/assets/gtmutils/lang/en_us.json index 167a0e1..bd3556d 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_us.json +++ b/src/generated/resources/assets/gtmutils/lang/en_us.json @@ -49,7 +49,6 @@ "config.gtmutils.option.omnibreakerEnabled": "omnibreakerEnabled", "config.gtmutils.option.omnibreakerEnergyCapacity": "omnibreakerEnergyCapacity", "config.gtmutils.option.omnibreakerTier": "omnibreakerTier", - "config.gtmutils.option.parallelHatchAutoConfigure": "parallelHatchAutoConfigure", "config.gtmutils.option.pterbCoolantBaseDrain": "pterbCoolantBaseDrain", "config.gtmutils.option.pterbCoolantIOMultiplier": "pterbCoolantIOMultiplier", "config.gtmutils.option.pterbEnabled": "pterbEnabled", diff --git a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java index c1e67e0..97a8995 100644 --- a/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java +++ b/src/main/java/net/neganote/gtutilities/integration/ae2/machine/ExpandedPatternBufferPartMachine.java @@ -75,11 +75,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java index 08c3183..f219979 100644 --- a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java +++ b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java @@ -14,6 +14,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import net.neganote.gtutilities.GregTechModernUtilities; import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferPartMachine; import snownee.jade.api.BlockAccessor; @@ -57,7 +58,7 @@ public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccesso @Override public ResourceLocation getUid() { - return GTCEu.id("me_pattern_buffer"); + return GregTechModernUtilities.id("me_expanded_pattern_buffer"); } public static void writeBufferTag(CompoundTag compoundTag, ExpandedPatternBufferPartMachine buffer) { diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java index 3446be2..fdfab99 100644 --- a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java +++ b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java @@ -9,6 +9,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.neganote.gtutilities.GregTechModernUtilities; import net.neganote.gtutilities.integration.ae2.machine.ExpandedPatternBufferProxyPartMachine; import snownee.jade.api.BlockAccessor; @@ -66,6 +67,6 @@ public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccesso @Override public ResourceLocation getUid() { - return GTCEu.id("me_pattern_buffer_proxy"); + return GregTechModernUtilities.id("me_expanded_pattern_buffer_proxy"); } } From 25f9ba874fe70fc7d4c097846643fcb94ffa6127 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Wed, 7 Jan 2026 00:43:07 -0500 Subject: [PATCH 08/12] Requested changes. --- src/generated/resources/assets/gtmutils/lang/en_ud.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/generated/resources/assets/gtmutils/lang/en_ud.json b/src/generated/resources/assets/gtmutils/lang/en_ud.json index 89b2648..7bcb3db 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_ud.json +++ b/src/generated/resources/assets/gtmutils/lang/en_ud.json @@ -49,7 +49,6 @@ "config.gtmutils.option.omnibreakerEnabled": "pǝןqɐuƎɹǝʞɐǝɹqıuɯo", "config.gtmutils.option.omnibreakerEnergyCapacity": "ʎʇıɔɐdɐƆʎbɹǝuƎɹǝʞɐǝɹqıuɯo", "config.gtmutils.option.omnibreakerTier": "ɹǝı⟘ɹǝʞɐǝɹqıuɯo", - "config.gtmutils.option.parallelHatchAutoConfigure": "ǝɹnbıɟuoƆoʇnⱯɥɔʇɐHןǝןןɐɹɐd", "config.gtmutils.option.pterbCoolantBaseDrain": "uıɐɹᗡǝsɐᗺʇuɐןooƆqɹǝʇd", "config.gtmutils.option.pterbCoolantIOMultiplier": "ɹǝıןdıʇןnWOIʇuɐןooƆqɹǝʇd", "config.gtmutils.option.pterbEnabled": "pǝןqɐuƎqɹǝʇd", From abcf98b2b5ae19d9f0d53b5096944e439dc46e4b Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Wed, 7 Jan 2026 00:47:53 -0500 Subject: [PATCH 09/12] I've found the spot, and now it's less. --- .../jade/provider/ExpandedMEPatternBufferProvider.java | 1 - .../jade/provider/ExpandedMEPatternBufferProxyProvider.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java index f219979..8a77be3 100644 --- a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java +++ b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProvider.java @@ -1,6 +1,5 @@ package net.neganote.gtutilities.integration.jade.provider; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.integration.jade.GTElementHelper; diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java index fdfab99..28e1763 100644 --- a/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java +++ b/src/main/java/net/neganote/gtutilities/integration/jade/provider/ExpandedMEPatternBufferProxyProvider.java @@ -1,6 +1,5 @@ package net.neganote.gtutilities.integration.jade.provider; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.integration.jade.provider.MEPatternBufferProvider; From 8e1ad10f6cd8594d0321f7fd811c292430170047 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 9 Feb 2026 13:33:27 -0500 Subject: [PATCH 10/12] 7.5.1 migration --- gradle.properties | 2 +- .../resources/assets/gtmutils/lang/en_ud.json | 6 +- .../resources/assets/gtmutils/lang/en_us.json | 6 +- .../common/machine/UtilMachines.java | 2 +- .../common/tools/UtilToolConnection.java | 12 ---- .../common/tools/UtilToolType.java | 64 ------------------- .../tools/recipe/UtilToolRecipeHelper.java | 8 +-- .../datagen/lang/UtilLangHandler.java | 8 +-- 8 files changed, 13 insertions(+), 95 deletions(-) diff --git a/gradle.properties b/gradle.properties index a3ded32..258dc95 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ org.gradle.jvmargs=-Xmx1G # Dependencies appeng_version=15.0.18 architectury_version=9.2.14 - gtceu_version=7.4.0 + gtceu_version=7.5.1 ldlib_version=1.0.40.b registrate_version=MC1.20-1.3.11 rhino_version=2001.2.3-build.6 diff --git a/src/generated/resources/assets/gtmutils/lang/en_ud.json b/src/generated/resources/assets/gtmutils/lang/en_ud.json index 7bcb3db..2120c36 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_ud.json +++ b/src/generated/resources/assets/gtmutils/lang/en_ud.json @@ -53,6 +53,8 @@ "config.gtmutils.option.pterbCoolantIOMultiplier": "ɹǝıןdıʇןnWOIʇuɐןooƆqɹǝʇd", "config.gtmutils.option.pterbEnabled": "pǝןqɐuƎqɹǝʇd", "config.gtmutils.option.sterileHatchEnabled": "pǝןqɐuƎɥɔʇɐHǝןıɹǝʇs", + "config.jade.plugin_gtmutils.me_expanded_pattern_buffer": "oɟuI ɹǝɟɟnᗺ uɹǝʇʇɐԀ ]sןıʇ∩ɯʇ⅁[", + "config.jade.plugin_gtmutils.me_expanded_pattern_buffer_proxy": "oɟuI ʎxoɹԀ ɹǝɟɟnᗺ uɹǝʇʇɐԀ ]sןıʇ∩ɯʇ⅁[", "config.jade.plugin_gtmutils.pterb_info": "oɟuI ⟘ⱯM", "gtceu.placeholder_info.watfrequency.0": "˙ɹǝɯɹoɟsuɐɹ⟘ ǝʌıʇɔⱯ ssǝןǝɹıM ɐ ʎq pǝsn ʎɔuǝnbǝɹɟ ʇuǝɹɹnɔ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.watfrequency.1": ":ǝbɐs∩", @@ -68,11 +70,7 @@ "item.gtceu.tool.ev_wirecutter": ")ΛƎ( ɹǝʇʇnƆ ǝɹıM %s", "item.gtceu.tool.ev_wrench": ")ΛƎ( ɥɔuǝɹM %s", "item.gtceu.tool.hv_buzzsaw": ")ΛH( ʍɐszznᗺ %s", - "item.gtceu.tool.hv_chainsaw": ")ΛH( ʍɐsuıɐɥƆ %s", - "item.gtceu.tool.hv_screwdriver": ")ΛH( ɹǝʌıɹpʍǝɹɔS ɔıɹʇɔǝןƎ %s", "item.gtceu.tool.iv_buzzsaw": ")ΛI( ʍɐszznᗺ %s", - "item.gtceu.tool.iv_chainsaw": ")ΛI( ʍɐsuıɐɥƆ %s", - "item.gtceu.tool.iv_screwdriver": ")ΛI( ɹǝʌıɹpʍǝɹɔS ɔıɹʇɔǝןƎ %s", "item.gtceu.tool.luv_buzzsaw": ")ΛnꞀ( ʍɐszznᗺ %s", "item.gtceu.tool.luv_chainsaw": ")ΛnꞀ( ʍɐsuıɐɥƆ %s", "item.gtceu.tool.luv_drill": ")ΛnꞀ( ןןıɹᗡ %s", diff --git a/src/generated/resources/assets/gtmutils/lang/en_us.json b/src/generated/resources/assets/gtmutils/lang/en_us.json index bd3556d..f5f8016 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_us.json +++ b/src/generated/resources/assets/gtmutils/lang/en_us.json @@ -53,6 +53,8 @@ "config.gtmutils.option.pterbCoolantIOMultiplier": "pterbCoolantIOMultiplier", "config.gtmutils.option.pterbEnabled": "pterbEnabled", "config.gtmutils.option.sterileHatchEnabled": "sterileHatchEnabled", + "config.jade.plugin_gtmutils.me_expanded_pattern_buffer": "[GtmUtils] Pattern Buffer Info", + "config.jade.plugin_gtmutils.me_expanded_pattern_buffer_proxy": "[GtmUtils] Pattern Buffer Proxy Info", "config.jade.plugin_gtmutils.pterb_info": "WAT Info", "gtceu.placeholder_info.watfrequency.0": "Returns the current frequency used by a Wireless Active Transformer.", "gtceu.placeholder_info.watfrequency.1": "Usage:", @@ -68,11 +70,7 @@ "item.gtceu.tool.ev_wirecutter": "%s Wire Cutter (EV)", "item.gtceu.tool.ev_wrench": "%s Wrench (EV)", "item.gtceu.tool.hv_buzzsaw": "%s Buzzsaw (HV)", - "item.gtceu.tool.hv_chainsaw": "%s Chainsaw (HV)", - "item.gtceu.tool.hv_screwdriver": "%s Electric Screwdriver (HV)", "item.gtceu.tool.iv_buzzsaw": "%s Buzzsaw (IV)", - "item.gtceu.tool.iv_chainsaw": "%s Chainsaw (IV)", - "item.gtceu.tool.iv_screwdriver": "%s Electric Screwdriver (IV)", "item.gtceu.tool.luv_buzzsaw": "%s Buzzsaw (LuV)", "item.gtceu.tool.luv_chainsaw": "%s Chainsaw (LuV)", "item.gtceu.tool.luv_drill": "%s Drill (LuV)", diff --git a/src/main/java/net/neganote/gtutilities/common/machine/UtilMachines.java b/src/main/java/net/neganote/gtutilities/common/machine/UtilMachines.java index 731b57c..9d0a619 100644 --- a/src/main/java/net/neganote/gtutilities/common/machine/UtilMachines.java +++ b/src/main/java/net/neganote/gtutilities/common/machine/UtilMachines.java @@ -136,7 +136,7 @@ public static MachineDefinition[] registerConverter(int amperage) { // Copied from GTMachineUtils public static MachineDefinition[] registerTieredMachines(String name, BiFunction factory, - BiFunction, MachineDefinition> builder, + BiFunction, MachineDefinition> builder, int... tiers) { MachineDefinition[] definitions = new MachineDefinition[GTValues.TIER_COUNT]; for (int tier : tiers) { diff --git a/src/main/java/net/neganote/gtutilities/common/tools/UtilToolConnection.java b/src/main/java/net/neganote/gtutilities/common/tools/UtilToolConnection.java index ff6c554..703e33f 100644 --- a/src/main/java/net/neganote/gtutilities/common/tools/UtilToolConnection.java +++ b/src/main/java/net/neganote/gtutilities/common/tools/UtilToolConnection.java @@ -42,15 +42,9 @@ public static void modifyMaterials() { // Custom HV Tools if (UtilConfig.INSTANCE.features.customHVToolsEnabled) { - if (toolProperty.hasType(GTToolType.SCREWDRIVER_LV)) { - toolProperty.addTypes(UtilToolType.SCREWDRIVER_HV); - } if (toolProperty.hasType(GTToolType.BUZZSAW)) { toolProperty.addTypes(UtilToolType.BUZZSAW_HV); } - if (toolProperty.hasType(GTToolType.CHAINSAW_LV)) { - toolProperty.addTypes(UtilToolType.CHAINSAW_HV); - } } // Custom EV Tools @@ -74,15 +68,9 @@ public static void modifyMaterials() { // Custom IV Tools if (UtilConfig.INSTANCE.features.customIVToolsEnabled) { - if (toolProperty.hasType(GTToolType.SCREWDRIVER_LV)) { - toolProperty.addTypes(UtilToolType.SCREWDRIVER_IV); - } if (toolProperty.hasType(GTToolType.BUZZSAW)) { toolProperty.addTypes(UtilToolType.BUZZSAW_IV); } - if (toolProperty.hasType(GTToolType.CHAINSAW_LV)) { - toolProperty.addTypes(UtilToolType.CHAINSAW_IV); - } } // Custom LuV Tools diff --git a/src/main/java/net/neganote/gtutilities/common/tools/UtilToolType.java b/src/main/java/net/neganote/gtutilities/common/tools/UtilToolType.java index 777a46c..8b1f6d3 100644 --- a/src/main/java/net/neganote/gtutilities/common/tools/UtilToolType.java +++ b/src/main/java/net/neganote/gtutilities/common/tools/UtilToolType.java @@ -36,19 +36,6 @@ public final class UtilToolType { .toolClasses(GTToolType.SCREWDRIVER) .defaultActions(GTToolActions.DEFAULT_SCREWDRIVER_ACTIONS) .build(); - public static final GTToolType SCREWDRIVER_HV = GTToolType.builder("hv_screwdriver") - .idFormat("hv_%s_screwdriver") - .toolTag(CustomTags.CRAFTING_SCREWDRIVERS) - .toolTag(CustomTags.SCREWDRIVERS) - .toolStats(b -> b.crafting().sneakBypassUse() - .attackDamage(-1.0F).attackSpeed(3.0F).durabilityMultiplier(3.0F) - .behaviors(new EntityDamageBehavior(3.0F, Spider.class)) - .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_HV)) - .sound(GTSoundEntries.SCREWDRIVER_TOOL) - .electric(GTValues.HV) - .toolClasses(GTToolType.SCREWDRIVER) - .defaultActions(GTToolActions.DEFAULT_SCREWDRIVER_ACTIONS) - .build(); public static final GTToolType SCREWDRIVER_EV = GTToolType.builder("ev_screwdriver") .idFormat("ev_%s_screwdriver") .toolTag(CustomTags.CRAFTING_SCREWDRIVERS) @@ -62,19 +49,6 @@ public final class UtilToolType { .toolClasses(GTToolType.SCREWDRIVER) .defaultActions(GTToolActions.DEFAULT_SCREWDRIVER_ACTIONS) .build(); - public static final GTToolType SCREWDRIVER_IV = GTToolType.builder("iv_screwdriver") - .idFormat("iv_%s_screwdriver") - .toolTag(CustomTags.CRAFTING_SCREWDRIVERS) - .toolTag(CustomTags.SCREWDRIVERS) - .toolStats(b -> b.crafting().sneakBypassUse() - .attackDamage(-1.0F).attackSpeed(3.0F).durabilityMultiplier(5.0F) - .behaviors(new EntityDamageBehavior(3.0F, Spider.class)) - .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_IV)) - .sound(GTSoundEntries.SCREWDRIVER_TOOL) - .electric(GTValues.IV) - .toolClasses(GTToolType.SCREWDRIVER) - .defaultActions(GTToolActions.DEFAULT_SCREWDRIVER_ACTIONS) - .build(); public static final GTToolType SCREWDRIVER_LuV = GTToolType.builder("luv_screwdriver") .idFormat("luv_%s_screwdriver") .toolTag(CustomTags.CRAFTING_SCREWDRIVERS) @@ -125,25 +99,6 @@ public final class UtilToolType { .defaultActions(ToolActions.AXE_DIG, ToolActions.SWORD_DIG, ToolActions.HOE_DIG, GTToolActions.SAW_DIG) .build(); - public static final GTToolType CHAINSAW_HV = GTToolType.builder("hv_chainsaw") - .idFormat("hv_%s_chainsaw") - .toolTag(ItemTags.AXES) - .toolTag(CustomTags.CHAINSAWS) - .harvestTag(BlockTags.MINEABLE_WITH_AXE) - .harvestTag(BlockTags.SWORD_EFFICIENT) - .harvestTag(BlockTags.MINEABLE_WITH_HOE) - .toolStats(b -> b.blockBreaking() - .efficiencyMultiplier(4.0F) - .attackDamage(5.0F).attackSpeed(-3.2F) - .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_HV) - .behaviors(HarvestIceBehavior.INSTANCE, DisableShieldBehavior.INSTANCE, - TreeFellingBehavior.INSTANCE)) - .sound(GTSoundEntries.CHAINSAW_TOOL, true) - .electric(GTValues.HV) - .toolClasses(GTToolType.AXE) - .defaultActions(ToolActions.AXE_DIG, ToolActions.SWORD_DIG, ToolActions.HOE_DIG, - GTToolActions.SAW_DIG) - .build(); public static final GTToolType CHAINSAW_EV = GTToolType.builder("ev_chainsaw") .idFormat("ev_%s_chainsaw") .toolTag(ItemTags.AXES) @@ -163,25 +118,6 @@ public final class UtilToolType { .defaultActions(ToolActions.AXE_DIG, ToolActions.SWORD_DIG, ToolActions.HOE_DIG, GTToolActions.SAW_DIG) .build(); - public static final GTToolType CHAINSAW_IV = GTToolType.builder("iv_chainsaw") - .idFormat("iv_%s_chainsaw") - .toolTag(ItemTags.AXES) - .toolTag(CustomTags.CHAINSAWS) - .harvestTag(BlockTags.MINEABLE_WITH_AXE) - .harvestTag(BlockTags.SWORD_EFFICIENT) - .harvestTag(BlockTags.MINEABLE_WITH_HOE) - .toolStats(b -> b.blockBreaking() - .efficiencyMultiplier(6.0F) - .attackDamage(5.0F).attackSpeed(-3.2F) - .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_IV) - .behaviors(HarvestIceBehavior.INSTANCE, DisableShieldBehavior.INSTANCE, - TreeFellingBehavior.INSTANCE)) - .sound(GTSoundEntries.CHAINSAW_TOOL, true) - .electric(GTValues.IV) - .toolClasses(GTToolType.AXE) - .defaultActions(ToolActions.AXE_DIG, ToolActions.SWORD_DIG, ToolActions.HOE_DIG, - GTToolActions.SAW_DIG) - .build(); public static final GTToolType CHAINSAW_LuV = GTToolType.builder("luv_chainsaw") .idFormat("luv_%s_chainsaw") .toolTag(ItemTags.AXES) diff --git a/src/main/java/net/neganote/gtutilities/common/tools/recipe/UtilToolRecipeHelper.java b/src/main/java/net/neganote/gtutilities/common/tools/recipe/UtilToolRecipeHelper.java index 3cbc4fa..99169b5 100644 --- a/src/main/java/net/neganote/gtutilities/common/tools/recipe/UtilToolRecipeHelper.java +++ b/src/main/java/net/neganote/gtutilities/common/tools/recipe/UtilToolRecipeHelper.java @@ -84,8 +84,8 @@ private static void processElectricTool(Consumer provider, ToolP 'R', steelRing); addElectricToolRecipe(provider, toolPrefix, - new GTToolType[] { UtilToolType.CHAINSAW_MV, UtilToolType.CHAINSAW_HV, - UtilToolType.CHAINSAW_EV, UtilToolType.CHAINSAW_IV, UtilToolType.CHAINSAW_LuV, + new GTToolType[] { UtilToolType.CHAINSAW_MV, + UtilToolType.CHAINSAW_EV, UtilToolType.CHAINSAW_LuV, UtilToolType.CHAINSAW_ZPM, }, material); } @@ -157,8 +157,8 @@ private static void processElectricTool(Consumer provider, ToolP if (material.hasFlag(GENERATE_LONG_ROD)) { toolPrefix = TagPrefix.toolHeadScrewdriver; addElectricToolRecipe(provider, toolPrefix, - new GTToolType[] { UtilToolType.SCREWDRIVER_MV, UtilToolType.SCREWDRIVER_HV, - UtilToolType.SCREWDRIVER_EV, UtilToolType.SCREWDRIVER_IV, + new GTToolType[] { UtilToolType.SCREWDRIVER_MV, + UtilToolType.SCREWDRIVER_EV, UtilToolType.SCREWDRIVER_LuV, UtilToolType.SCREWDRIVER_ZPM, }, material); diff --git a/src/main/java/net/neganote/gtutilities/datagen/lang/UtilLangHandler.java b/src/main/java/net/neganote/gtutilities/datagen/lang/UtilLangHandler.java index 53c6887..3c4f7eb 100644 --- a/src/main/java/net/neganote/gtutilities/datagen/lang/UtilLangHandler.java +++ b/src/main/java/net/neganote/gtutilities/datagen/lang/UtilLangHandler.java @@ -27,16 +27,12 @@ public static void init(RegistrateLangProvider provider) { provider.add("tooltip.omnibreaker.modern_vajra", "A Modern Vajra"); provider.add("item.gtceu.tool.mv_screwdriver", "%s Electric Screwdriver (MV)"); - provider.add("item.gtceu.tool.hv_screwdriver", "%s Electric Screwdriver (HV)"); provider.add("item.gtceu.tool.ev_screwdriver", "%s Electric Screwdriver (EV)"); - provider.add("item.gtceu.tool.iv_screwdriver", "%s Electric Screwdriver (IV)"); provider.add("item.gtceu.tool.luv_screwdriver", "%s Electric Screwdriver (LuV)"); provider.add("item.gtceu.tool.zpm_screwdriver", "%s Electric Screwdriver (ZPM)"); provider.add("item.gtceu.tool.mv_chainsaw", "%s Chainsaw (MV)"); - provider.add("item.gtceu.tool.hv_chainsaw", "%s Chainsaw (HV)"); provider.add("item.gtceu.tool.ev_chainsaw", "%s Chainsaw (EV)"); - provider.add("item.gtceu.tool.iv_chainsaw", "%s Chainsaw (IV)"); provider.add("item.gtceu.tool.luv_chainsaw", "%s Chainsaw (LuV)"); provider.add("item.gtceu.tool.zpm_chainsaw", "%s Chainsaw (ZPM)"); @@ -82,7 +78,9 @@ public static void init(RegistrateLangProvider provider) { "Returns the current frequency used by a Wireless Active Transformer.", "Usage:", " {watfrequency} -> Current frequency: (insert frequency here)"); - + provider.add("config.jade.plugin_gtmutils.me_expanded_pattern_buffer", "[GtmUtils] Pattern Buffer Info"); + provider.add("config.jade.plugin_gtmutils.me_expanded_pattern_buffer_proxy", + "[GtmUtils] Pattern Buffer Proxy Info"); provider.add("block.gtmutils.pattern_buffer.desc.0", "§fAllows expanded direct §6AE2 pattern storage §ffor GregTech Multiblocks."); provider.add("block.gtmutils.pattern_buffer.desc.2", From 82e4537bf29b91404cdc9e9fc9f320d872bd8ab6 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 9 Feb 2026 17:54:31 -0500 Subject: [PATCH 11/12] Removing old assets. --- .../gtceu/models/item/tools/hv_chainsaw.json | 9 --------- .../gtceu/models/item/tools/hv_screwdriver.json | 8 -------- .../gtceu/models/item/tools/iv_chainsaw.json | 9 --------- .../gtceu/models/item/tools/iv_screwdriver.json | 8 -------- .../textures/item/tools/chainsaw_body_hv.png | Bin 309 -> 0 bytes .../textures/item/tools/chainsaw_body_iv.png | Bin 327 -> 0 bytes .../item/tools/handle_electric_screwdriver_hv.png | Bin 264 -> 0 bytes .../item/tools/handle_electric_screwdriver_iv.png | Bin 264 -> 0 bytes 8 files changed, 34 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/models/item/tools/hv_chainsaw.json delete mode 100644 src/main/resources/assets/gtceu/models/item/tools/hv_screwdriver.json delete mode 100644 src/main/resources/assets/gtceu/models/item/tools/iv_chainsaw.json delete mode 100644 src/main/resources/assets/gtceu/models/item/tools/iv_screwdriver.json delete mode 100644 src/main/resources/assets/gtmutils/textures/item/tools/chainsaw_body_hv.png delete mode 100644 src/main/resources/assets/gtmutils/textures/item/tools/chainsaw_body_iv.png delete mode 100644 src/main/resources/assets/gtmutils/textures/item/tools/handle_electric_screwdriver_hv.png delete mode 100644 src/main/resources/assets/gtmutils/textures/item/tools/handle_electric_screwdriver_iv.png diff --git a/src/main/resources/assets/gtceu/models/item/tools/hv_chainsaw.json b/src/main/resources/assets/gtceu/models/item/tools/hv_chainsaw.json deleted file mode 100644 index 3b86d4c..0000000 --- a/src/main/resources/assets/gtceu/models/item/tools/hv_chainsaw.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "item/handheld", - "textures": { - "layer0": "gtceu:item/tools/power_unit_hv", - "layer1": "gtceu:item/tools/chainsaw", - "layer2": "gtceu:item/void", - "layer3": "gtmutils:item/tools/chainsaw_body_hv" - } -} diff --git a/src/main/resources/assets/gtceu/models/item/tools/hv_screwdriver.json b/src/main/resources/assets/gtceu/models/item/tools/hv_screwdriver.json deleted file mode 100644 index 58fab2e..0000000 --- a/src/main/resources/assets/gtceu/models/item/tools/hv_screwdriver.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "item/handheld", - "textures": { - "layer0": "gtmutils:item/tools/handle_electric_screwdriver_hv", - "layer1": "gtceu:item/tools/screwdriver_short", - "layer2": "gtceu:item/tools/screwdriver_overlay" - } -} diff --git a/src/main/resources/assets/gtceu/models/item/tools/iv_chainsaw.json b/src/main/resources/assets/gtceu/models/item/tools/iv_chainsaw.json deleted file mode 100644 index 99d1625..0000000 --- a/src/main/resources/assets/gtceu/models/item/tools/iv_chainsaw.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "item/handheld", - "textures": { - "layer0": "gtceu:item/tools/power_unit_iv", - "layer1": "gtceu:item/tools/chainsaw", - "layer2": "gtceu:item/void", - "layer3": "gtmutils:item/tools/chainsaw_body_iv" - } -} diff --git a/src/main/resources/assets/gtceu/models/item/tools/iv_screwdriver.json b/src/main/resources/assets/gtceu/models/item/tools/iv_screwdriver.json deleted file mode 100644 index 805da93..0000000 --- a/src/main/resources/assets/gtceu/models/item/tools/iv_screwdriver.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "item/handheld", - "textures": { - "layer0": "gtmutils:item/tools/handle_electric_screwdriver_iv", - "layer1": "gtceu:item/tools/screwdriver_short", - "layer2": "gtceu:item/tools/screwdriver_overlay" - } -} diff --git a/src/main/resources/assets/gtmutils/textures/item/tools/chainsaw_body_hv.png b/src/main/resources/assets/gtmutils/textures/item/tools/chainsaw_body_hv.png deleted file mode 100644 index 1158880a904fa394c69ffd2bd49996b5517844f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmV-50m}Y~P)Px#?@2^KR5(w?lT8bPKoEv!l!~H5{Q}c#(NV7j`me>iLLyRU>(r$nB8m!~n5Dvx zY>N)h^bUS zL<8QdX_^!SL1q10K_2#fA1up)vP7Cd*L9kOp-A8F^}sL;NRs5qRRp$elk2)-p5b`D zfa~Q9)5!#)C=#N)q#)pZa#Y80#6r*WV6)wdexuofZl^6z@Q@siCjm0VjmP8Bun=E7 zrdKafQ51U2r)dhRs)D9z6}VQAm$EF&vf9Iz-h%9}{9kYbffx zSrX@tXEAt8=wa#&mY^3{@0o<0ry!#7!7qC?>@(DwFVSx07$r&Alv85owW WD;8eUbG98AG7O%selF{r5}E*4V~K$P diff --git a/src/main/resources/assets/gtmutils/textures/item/tools/handle_electric_screwdriver_hv.png b/src/main/resources/assets/gtmutils/textures/item/tools/handle_electric_screwdriver_hv.png deleted file mode 100644 index 4aec88e2cae2a63a9ef4ccbd68fbbf139f26d268..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|4tcsbhFJI~ zrz{XK2wE{eafh^mw)XG;7ZT2lG!%uJrp&`_S|=jR{KLLBmmAyE{gGH5wWjGm5aefMoM5=bQ{)&BAaMBG+uM?T^7efT<(7*(w4FG4(y*na z#bAy_Vbj6OmxWg=vRrO#X*u%$#0if%Z2~3?Q-VH9I!$4G(Kf?WKHb8gwejI2Hnuw- zyLI~;VubcRVLiOKn1|G1(^=F7XsO1_THk{`U5^WS_i!-$J?N;tp*lDJKnE zT3QU|SQIuLynI=BwIa*q#+H^N|4*FonA0X;!Z0Q1qomUm#usffOy$!p3|bo>K4N3L z^RZjEzad6w-xJoui;H=9zV}T`WH=GerihuSUf9Ywkf?_I+MJ0?Hh2J{Vs Mr>mdKI;Vst0I`W`f&c&j From 5b5f9a381b9129202e94750570f409f135f75928 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Mon, 9 Feb 2026 23:32:33 -0500 Subject: [PATCH 12/12] Removing old assets. --- src/generated/resources/assets/gtmutils/lang/en_ud.json | 2 -- src/generated/resources/assets/gtmutils/lang/en_us.json | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/generated/resources/assets/gtmutils/lang/en_ud.json b/src/generated/resources/assets/gtmutils/lang/en_ud.json index 2120c36..f3a62fb 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_ud.json +++ b/src/generated/resources/assets/gtmutils/lang/en_ud.json @@ -53,8 +53,6 @@ "config.gtmutils.option.pterbCoolantIOMultiplier": "ɹǝıןdıʇןnWOIʇuɐןooƆqɹǝʇd", "config.gtmutils.option.pterbEnabled": "pǝןqɐuƎqɹǝʇd", "config.gtmutils.option.sterileHatchEnabled": "pǝןqɐuƎɥɔʇɐHǝןıɹǝʇs", - "config.jade.plugin_gtmutils.me_expanded_pattern_buffer": "oɟuI ɹǝɟɟnᗺ uɹǝʇʇɐԀ ]sןıʇ∩ɯʇ⅁[", - "config.jade.plugin_gtmutils.me_expanded_pattern_buffer_proxy": "oɟuI ʎxoɹԀ ɹǝɟɟnᗺ uɹǝʇʇɐԀ ]sןıʇ∩ɯʇ⅁[", "config.jade.plugin_gtmutils.pterb_info": "oɟuI ⟘ⱯM", "gtceu.placeholder_info.watfrequency.0": "˙ɹǝɯɹoɟsuɐɹ⟘ ǝʌıʇɔⱯ ssǝןǝɹıM ɐ ʎq pǝsn ʎɔuǝnbǝɹɟ ʇuǝɹɹnɔ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.watfrequency.1": ":ǝbɐs∩", diff --git a/src/generated/resources/assets/gtmutils/lang/en_us.json b/src/generated/resources/assets/gtmutils/lang/en_us.json index f5f8016..cb224a6 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_us.json +++ b/src/generated/resources/assets/gtmutils/lang/en_us.json @@ -53,8 +53,6 @@ "config.gtmutils.option.pterbCoolantIOMultiplier": "pterbCoolantIOMultiplier", "config.gtmutils.option.pterbEnabled": "pterbEnabled", "config.gtmutils.option.sterileHatchEnabled": "sterileHatchEnabled", - "config.jade.plugin_gtmutils.me_expanded_pattern_buffer": "[GtmUtils] Pattern Buffer Info", - "config.jade.plugin_gtmutils.me_expanded_pattern_buffer_proxy": "[GtmUtils] Pattern Buffer Proxy Info", "config.jade.plugin_gtmutils.pterb_info": "WAT Info", "gtceu.placeholder_info.watfrequency.0": "Returns the current frequency used by a Wireless Active Transformer.", "gtceu.placeholder_info.watfrequency.1": "Usage:",