From 7c6db7ffaf451bf3526b255bde9046e2a14d5a69 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 5 Mar 2025 21:24:12 -0700 Subject: [PATCH 1/5] initial work on ender item cover 2.0, the sequel --- .../gregtech/api/util/GTTransferUtils.java | 7 +- .../api/util/virtualregistry/EntryTypes.java | 2 +- .../util/virtualregistry/VirtualChest.java | 66 ++++++++++ .../covers/ender/CoverAbstractEnderLink.java | 15 ++- .../covers/ender/CoverEnderFluidLink.java | 21 ++- .../covers/ender/CoverEnderItemLink.java | 122 ++++++++++++++++++ .../covers/filter/BaseFilterContainer.java | 16 +-- 7 files changed, 221 insertions(+), 28 deletions(-) create mode 100644 src/main/java/gregtech/api/util/virtualregistry/VirtualChest.java create mode 100644 src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java diff --git a/src/main/java/gregtech/api/util/GTTransferUtils.java b/src/main/java/gregtech/api/util/GTTransferUtils.java index d79024f844b..c265aa73941 100644 --- a/src/main/java/gregtech/api/util/GTTransferUtils.java +++ b/src/main/java/gregtech/api/util/GTTransferUtils.java @@ -83,9 +83,14 @@ public static boolean transferExactFluidStack(@NotNull IFluidHandler sourceHandl } public static void moveInventoryItems(IItemHandler sourceInventory, IItemHandler targetInventory) { + moveInventoryItems(sourceInventory, targetInventory, stack -> true); + } + + public static void moveInventoryItems(IItemHandler sourceInventory, IItemHandler targetInventory, + Predicate predicate) { for (int srcIndex = 0; srcIndex < sourceInventory.getSlots(); srcIndex++) { ItemStack sourceStack = sourceInventory.extractItem(srcIndex, Integer.MAX_VALUE, true); - if (sourceStack.isEmpty()) { + if (sourceStack.isEmpty() || !predicate.test(sourceStack)) { continue; } ItemStack remainder = insertItem(targetInventory, sourceStack, true); diff --git a/src/main/java/gregtech/api/util/virtualregistry/EntryTypes.java b/src/main/java/gregtech/api/util/virtualregistry/EntryTypes.java index 6324958b8c7..24e450de7d2 100644 --- a/src/main/java/gregtech/api/util/virtualregistry/EntryTypes.java +++ b/src/main/java/gregtech/api/util/virtualregistry/EntryTypes.java @@ -18,7 +18,7 @@ public final class EntryTypes { private static final Map> TYPES_MAP = new Object2ObjectOpenHashMap<>(); public static final EntryTypes ENDER_FLUID = addEntryType(gregtechId("ender_fluid"), VirtualTank::new); - // ENDER_ITEM("ender_item", null), + public static final EntryTypes ENDER_ITEM = addEntryType(gregtechId("ender_item"), VirtualChest::new); // ENDER_ENERGY("ender_energy", null), // ENDER_REDSTONE("ender_redstone", null); private final ResourceLocation location; diff --git a/src/main/java/gregtech/api/util/virtualregistry/VirtualChest.java b/src/main/java/gregtech/api/util/virtualregistry/VirtualChest.java new file mode 100644 index 00000000000..9aef5e1120f --- /dev/null +++ b/src/main/java/gregtech/api/util/virtualregistry/VirtualChest.java @@ -0,0 +1,66 @@ +package gregtech.api.util.virtualregistry; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; + +import org.jetbrains.annotations.NotNull; + +public class VirtualChest extends VirtualEntry implements IItemHandler { + + public static final int DEFAULT_SIZE = 9; + + private final ItemStackHandler handler; + + public VirtualChest() { + this(DEFAULT_SIZE); + } + + public VirtualChest(int size) { + this.handler = new ItemStackHandler(size); + } + + @Override + public EntryTypes getType() { + return EntryTypes.ENDER_ITEM; + } + + @Override + public int getSlots() { + return handler.getSlots(); + } + + @Override + public @NotNull ItemStack getStackInSlot(int slot) { + return handler.getStackInSlot(slot); + } + + @Override + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + return handler.insertItem(slot, stack, simulate); + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + return handler.extractItem(slot, amount, simulate); + } + + @Override + public int getSlotLimit(int slot) { + return handler.getSlotLimit(slot); + } + + @Override + public NBTTagCompound serializeNBT() { + NBTTagCompound tag = super.serializeNBT(); + tag.setTag("handler", this.handler.serializeNBT()); + return tag; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) { + this.handler.deserializeNBT(nbt.getCompoundTag("handler")); + super.deserializeNBT(nbt); + } +} diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 3bde5ee79d9..83ae0344f51 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -29,7 +29,6 @@ import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.GuiTextures; import com.cleanroommc.modularui.drawable.Rectangle; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularPanel; @@ -142,11 +141,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan this.playerUUID = guiData.getPlayer().getUniqueID(); return panel.child(CoverWithUI.createTitleRow(getPickItem())) - .child(createWidgets(guiData, guiSyncManager)) + .child(createWidgets(panel, guiSyncManager)) .bindPlayerInventory(); } - protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { + protected Flow createWidgets(ModularPanel modularPanel, PanelSyncManager syncManager) { var name = new StringSyncValue(this::getColorStr, this::updateColor); var entrySelectorSH = syncManager.panel("entry_selector", entrySelector(getType()), true); @@ -163,7 +162,7 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { .setPattern(COLOR_INPUT_PATTERN) .widthRel(0.5f) .marginRight(2)) - .child(createEntrySlot()) + .child(createEntrySlot(modularPanel, syncManager)) .child(new ButtonWidget<>() .overlay(GTGuiTextures.MENU_OVERLAY) .background(GTGuiTextures.MC_BUTTON) @@ -181,7 +180,7 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { .child(createIoRow()); } - protected abstract IWidget createEntrySlot(); + protected abstract IWidget createEntrySlot(ModularPanel panel, PanelSyncManager syncManager); protected IWidget createColorIcon() { return new DynamicDrawable(() -> new Rectangle() @@ -402,7 +401,11 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage protected abstract IWidget createSlotWidget(T entry); - protected abstract void deleteEntry(UUID player, String name); + protected void deleteEntry(UUID player, String name) { + VirtualEnderRegistry.deleteEntry(player, getType(), name, this::shouldDeleteEntry); + } + + protected abstract boolean shouldDeleteEntry(T activeEntry); private final class EnderCoverSyncHandler extends SyncHandler { diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java index 4c373dfd41c..ff26f1c4f2d 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java @@ -9,7 +9,6 @@ import gregtech.api.util.FluidTankSwitchShim; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.virtualregistry.EntryTypes; -import gregtech.api.util.virtualregistry.VirtualEnderRegistry; import gregtech.api.util.virtualregistry.entries.VirtualTank; import gregtech.client.renderer.texture.Textures; import gregtech.common.covers.CoverPump; @@ -29,14 +28,12 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.factory.GuiData; +import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; -import java.util.UUID; - public class CoverEnderFluidLink extends CoverAbstractEnderLink implements CoverWithUI, ITickable, IControllable { @@ -101,9 +98,9 @@ protected void transferFluids() { IFluidHandler fluidHandler = getCoverableView().getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, getAttachedSide()); if (fluidHandler == null) return; - if (pumpMode == CoverPump.PumpMode.IMPORT) { + if (pumpMode.isImport()) { GTTransferUtils.transferFluids(fluidHandler, activeEntry, TRANSFER_RATE, fluidFilter::test); - } else if (pumpMode == CoverPump.PumpMode.EXPORT) { + } else { GTTransferUtils.transferFluids(activeEntry, fluidHandler, TRANSFER_RATE, fluidFilter::test); } } @@ -130,12 +127,12 @@ protected IWidget createSlotWidget(VirtualTank entry) { } @Override - protected void deleteEntry(UUID uuid, String name) { - VirtualEnderRegistry.deleteEntry(uuid, getType(), name, tank -> tank.getFluidAmount() == 0); + protected boolean shouldDeleteEntry(VirtualTank activeEntry) { + return activeEntry.getFluidAmount() == 0; } @Override - protected IWidget createEntrySlot() { + protected IWidget createEntrySlot(ModularPanel panel, PanelSyncManager syncManager) { return new GTFluidSlot() .size(18) .background(GTGuiTextures.FLUID_SLOT) @@ -143,15 +140,15 @@ protected IWidget createEntrySlot() { .marginRight(2); } - protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { + protected Flow createWidgets(ModularPanel modularPanel, PanelSyncManager syncManager) { getFluidFilterContainer().setMaxTransferSize(1); var pumpMode = new EnumSyncValue<>(CoverPump.PumpMode.class, this::getPumpMode, this::setPumpMode); syncManager.syncValue("pump_mode", pumpMode); pumpMode.updateCacheFromSource(true); - return super.createWidgets(data, syncManager) - .child(getFluidFilterContainer().initUI(data, syncManager)) + return super.createWidgets(modularPanel, syncManager) + .child(getFluidFilterContainer().initUI(modularPanel, syncManager)) .child(new EnumRowBuilder<>(CoverPump.PumpMode.class) .value(pumpMode) .overlay(GTGuiTextures.CONVEYOR_MODE_OVERLAY) diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java new file mode 100644 index 00000000000..74a9e415ac4 --- /dev/null +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java @@ -0,0 +1,122 @@ +package gregtech.common.covers.ender; + +import gregtech.api.cover.CoverDefinition; +import gregtech.api.cover.CoverableView; +import gregtech.api.mui.GTGuis; +import gregtech.api.util.GTTransferUtils; +import gregtech.api.util.virtualregistry.EntryTypes; +import gregtech.api.util.virtualregistry.VirtualChest; +import gregtech.client.renderer.texture.Textures; +import gregtech.common.covers.filter.ItemFilterContainer; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; + +import codechicken.lib.render.CCRenderState; +import codechicken.lib.render.pipeline.IVertexOperation; +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.IPanelHandler; +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class CoverEnderItemLink extends CoverAbstractEnderLink { + + protected final ItemFilterContainer container; + @Nullable + private IPanelHandler chestPanel; + + public CoverEnderItemLink(@NotNull CoverDefinition definition, @NotNull CoverableView coverableView, + @NotNull EnumFacing attachedSide) { + super(definition, coverableView, attachedSide); + container = new ItemFilterContainer(this); + } + + private ModularPanel createChestPanel(ModularPanel parentPanel, EntityPlayer player) { + return GTGuis.createPopupPanel(getDefinition().getResourceLocation().getPath(), 100, 100); + } + + @Override + protected EntryTypes getType() { + return EntryTypes.ENDER_ITEM; + } + + @Override + protected String identifier() { + return "EILink#"; + } + + @Override + protected IWidget createEntrySlot(ModularPanel panel, PanelSyncManager syncManager) { + IPanelHandler panelHandler = getChestPanel(panel); + return new ButtonWidget<>() + .onMousePressed(mouseButton -> { + if (panelHandler.isPanelOpen()) { + panelHandler.closePanel(); + } else { + panelHandler.openPanel(); + } + return true; + }); + } + + @NotNull + private IPanelHandler getChestPanel(ModularPanel modularPanel) { + if (chestPanel == null) { + chestPanel = IPanelHandler.simple(modularPanel, this::createChestPanel, true); + } + return chestPanel; + } + + @Override + protected IWidget createSlotWidget(VirtualChest entry) { + return null; + } + + @Override + protected boolean shouldDeleteEntry(VirtualChest activeEntry) { + for (int i = 0; i < activeEntry.getSlots(); i++) { + if (!activeEntry.getStackInSlot(i).isEmpty()) return false; + } + return true; + } + + @Override + public boolean canAttach(@NotNull CoverableView coverable, @NotNull EnumFacing side) { + return coverable.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side); + } + + @Override + public void renderCover(@NotNull CCRenderState renderState, @NotNull Matrix4 translation, + @NotNull IVertexOperation[] pipeline, @NotNull Cuboid6 plateBox, + @NotNull BlockRenderLayer layer) { + // todo new texture + Textures.ENDER_FLUID_LINK.renderSided(getAttachedSide(), plateBox, renderState, pipeline, translation); + } + + @Override + public void onRemoval() { + dropInventoryContents(this.container); + } + + @Override + public void update() { + if (isWorkingEnabled() && isIoEnabled()) { + transferItems(); + } + } + + private void transferItems() { + IItemHandler handler = getCoverableView().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, + getAttachedSide()); + if (handler == null) return; + GTTransferUtils.moveInventoryItems(handler, this.activeEntry, this.container::test); + } +} diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 524998ec460..c64b043e7ef 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -14,8 +14,8 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.GuiTextures; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; @@ -211,8 +211,8 @@ public void handleLegacyNBT(NBTTagCompound nbt) { } /** Uses Cleanroom MUI */ - public IWidget initUI(GuiData data, PanelSyncManager manager) { - IPanelHandler panel = manager.panel("filter_panel", (syncManager, syncHandler) -> { + public IWidget initUI(ModularPanel mainPanel, PanelSyncManager manager) { + IPanelHandler filterPanel = manager.panel("filter_panel", (syncManager, syncHandler) -> { var filter = hasFilter() ? getFilter() : BaseFilter.ERROR_FILTER; filter.setMaxTransferSize(getMaxTransferSize()); return filter.createPopupPanel(syncManager); @@ -225,8 +225,8 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { .filter(this::isItemValid) .singletonSlotGroup(101) .changeListener((newItem, onlyAmountChanged, client, init) -> { - if (!isItemValid(newItem) && panel.isPanelOpen()) { - panel.closePanel(); + if (!isItemValid(newItem) && filterPanel.isPanelOpen()) { + filterPanel.closePanel(); } })) .size(18).marginRight(2) @@ -237,10 +237,10 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { GTGuiTextures.FILTER_SETTINGS_OVERLAY.asIcon().size(16)) .setEnabledIf(w -> hasFilter()) .onMousePressed(i -> { - if (!panel.isPanelOpen()) { - panel.openPanel(); + if (!filterPanel.isPanelOpen()) { + filterPanel.openPanel(); } else { - panel.closePanel(); + filterPanel.closePanel(); } return true; })) From b42cb4df5d44ab459709faa19c907bf02c902aac Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 6 Mar 2025 20:04:47 -0700 Subject: [PATCH 2/5] ender item cover now exists and can be tested replace guidata with main panel --- .../common/covers/CoverBehaviors.java | 2 + .../gregtech/common/covers/CoverConveyor.java | 7 ++- .../common/covers/CoverFluidRegulator.java | 5 +- .../common/covers/CoverFluidVoiding.java | 5 +- .../covers/CoverFluidVoidingAdvanced.java | 5 +- .../common/covers/CoverItemVoiding.java | 5 +- .../covers/CoverItemVoidingAdvanced.java | 5 +- .../gregtech/common/covers/CoverPump.java | 7 ++- .../common/covers/CoverRoboticArm.java | 5 +- .../covers/ender/CoverEnderItemLink.java | 47 +++++++++++++------ .../java/gregtech/common/items/MetaItem1.java | 1 + .../java/gregtech/common/items/MetaItems.java | 1 + 12 files changed, 54 insertions(+), 41 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverBehaviors.java b/src/main/java/gregtech/common/covers/CoverBehaviors.java index 72168861ac5..91dfbbe79e3 100644 --- a/src/main/java/gregtech/common/covers/CoverBehaviors.java +++ b/src/main/java/gregtech/common/covers/CoverBehaviors.java @@ -9,6 +9,7 @@ import gregtech.client.renderer.texture.Textures; import gregtech.common.covers.detector.*; import gregtech.common.covers.ender.CoverEnderFluidLink; +import gregtech.common.covers.ender.CoverEnderItemLink; import gregtech.common.items.MetaItems; import gregtech.common.items.behaviors.CoverDigitalInterfaceWirelessPlaceBehaviour; @@ -118,6 +119,7 @@ public static void init() { CoverDetectorMaintenance::new); registerBehavior(gregtechId("infinite_water"), MetaItems.COVER_INFINITE_WATER, CoverInfiniteWater::new); registerBehavior(gregtechId("ender_fluid_link"), MetaItems.COVER_ENDER_FLUID_LINK, CoverEnderFluidLink::new); + registerBehavior(gregtechId("ender_fluid_link"), MetaItems.COVER_ENDER_ITEM_LINK, CoverEnderItemLink::new); registerBehavior(gregtechId("cover.digital"), MetaItems.COVER_DIGITAL_INTERFACE, CoverDigitalInterface::new); // Custom cover behaviour diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index b037492f993..aedd39ebadf 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -44,7 +44,6 @@ import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.drawable.DynamicDrawable; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -509,11 +508,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan getItemFilterContainer().setMaxTransferSize(getMaxStackSize()); return panel.child(CoverWithUI.createTitleRow(getPickItem())) - .child(createUI(guiData, guiSyncManager)) + .child(createUI(panel, guiSyncManager)) .bindPlayerInventory(); } - protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(ModularPanel panel, PanelSyncManager guiSyncManager) { var column = Flow.column().top(24).margin(7, 0) .widthRel(1f).coverChildrenHeight(); @@ -563,7 +562,7 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); if (createFilterRow()) - column.child(getItemFilterContainer().initUI(data, guiSyncManager)); + column.child(getItemFilterContainer().initUI(panel, guiSyncManager)); if (createManualIOModeRow()) column.child(new EnumRowBuilder<>(ManualImportExportMode.class) diff --git a/src/main/java/gregtech/common/covers/CoverFluidRegulator.java b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java index 141b51e0552..0b2836c45c5 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidRegulator.java +++ b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java @@ -20,7 +20,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -248,7 +247,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { + protected ParentWidget createUI(ModularPanel panel, PanelSyncManager syncManager) { var transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode); transferMode.updateCacheFromSource(true); syncManager.syncValue("transfer_mode", transferMode); @@ -260,7 +259,7 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { var filterTransferSize = new StringSyncValue(this::getStringTransferRate, this::setStringTransferRate); filterTransferSize.updateCacheFromSource(true); - return super.createUI(data, syncManager) + return super.createUI(panel, syncManager) .child(new EnumRowBuilder<>(TransferMode.class) .value(transferMode) .lang("cover.generic.transfer_mode") diff --git a/src/main/java/gregtech/common/covers/CoverFluidVoiding.java b/src/main/java/gregtech/common/covers/CoverFluidVoiding.java index 4bd8472b55f..293a3ce912a 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidVoiding.java +++ b/src/main/java/gregtech/common/covers/CoverFluidVoiding.java @@ -25,7 +25,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -77,10 +76,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { + protected ParentWidget createUI(ModularPanel panel, PanelSyncManager syncManager) { var isWorking = new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled); - return super.createUI(data, syncManager) + return super.createUI(panel, syncManager) .child(Flow.row().height(18).widthRel(1f) .marginBottom(2) .child(new ToggleButton() diff --git a/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java b/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java index b6a9e1cd1e5..6459f111768 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java +++ b/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java @@ -20,7 +20,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -106,7 +105,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { + protected ParentWidget createUI(ModularPanel panel, PanelSyncManager syncManager) { var voidingMode = new EnumSyncValue<>(VoidingMode.class, this::getVoidingMode, this::setVoidingMode); syncManager.syncValue("voiding_mode", voidingMode); @@ -119,7 +118,7 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { transferTextField.setEnabled(this.fluidFilterContainer.showGlobalTransferLimitSlider() && this.voidingMode == VoidingMode.VOID_OVERFLOW); - return super.createUI(data, syncManager) + return super.createUI(panel, syncManager) .child(new EnumRowBuilder<>(VoidingMode.class) .value(voidingMode) .lang("cover.voiding.voiding_mode") diff --git a/src/main/java/gregtech/common/covers/CoverItemVoiding.java b/src/main/java/gregtech/common/covers/CoverItemVoiding.java index e8129ec11f3..e621934e18b 100644 --- a/src/main/java/gregtech/common/covers/CoverItemVoiding.java +++ b/src/main/java/gregtech/common/covers/CoverItemVoiding.java @@ -22,7 +22,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -78,10 +77,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(ModularPanel panel, PanelSyncManager guiSyncManager) { var isWorking = new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled); - return super.createUI(data, guiSyncManager) + return super.createUI(panel, guiSyncManager) .child(Flow.row().height(18).widthRel(1f) .marginBottom(2) .child(new ToggleButton() diff --git a/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java b/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java index b739e7e6e1f..1dcf4c53e16 100644 --- a/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java +++ b/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java @@ -17,7 +17,6 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -94,7 +93,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(ModularPanel panel, PanelSyncManager guiSyncManager) { var voidingMode = new EnumSyncValue<>(VoidingMode.class, this::getVoidingMode, this::setVoidingMode); guiSyncManager.syncValue("voiding_mode", voidingMode); @@ -106,7 +105,7 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana transferTextField.setEnabled(this.itemFilterContainer.showGlobalTransferLimitSlider() && this.voidingMode == VoidingMode.VOID_OVERFLOW); - return super.createUI(data, guiSyncManager) + return super.createUI(panel, guiSyncManager) .child(new EnumRowBuilder<>(VoidingMode.class) .value(voidingMode) .lang("cover.voiding.voiding_mode") diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 659b916e80b..8e41b1bf55f 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -42,7 +42,6 @@ import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.drawable.DynamicDrawable; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -195,11 +194,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan getFluidFilterContainer().setMaxTransferSize(getMaxTransferRate()); return panel.child(CoverWithUI.createTitleRow(getPickItem())) - .child(createUI(guiData, guiSyncManager)) + .child(createUI(panel, guiSyncManager)) .bindPlayerInventory(); } - protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { + protected ParentWidget createUI(ModularPanel panel, PanelSyncManager syncManager) { var manualIOmode = new EnumSyncValue<>(ManualImportExportMode.class, this::getManualImportExportMode, this::setManualImportExportMode); @@ -244,7 +243,7 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); if (createFilterRow()) - column.child(getFluidFilterContainer().initUI(data, syncManager)); + column.child(getFluidFilterContainer().initUI(panel, syncManager)); if (createManualIOModeRow()) column.child(new EnumRowBuilder<>(ManualImportExportMode.class) diff --git a/src/main/java/gregtech/common/covers/CoverRoboticArm.java b/src/main/java/gregtech/common/covers/CoverRoboticArm.java index b1b99657adf..f19af971f8a 100644 --- a/src/main/java/gregtech/common/covers/CoverRoboticArm.java +++ b/src/main/java/gregtech/common/covers/CoverRoboticArm.java @@ -19,7 +19,6 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -197,7 +196,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(ModularPanel panel, PanelSyncManager guiSyncManager) { EnumSyncValue transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode); guiSyncManager.syncValue("transfer_mode", transferMode); @@ -207,7 +206,7 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana s -> this.itemFilterContainer.setTransferSize(Integer.parseInt(s))); filterTransferSize.updateCacheFromSource(true); - return super.createUI(data, guiSyncManager) + return super.createUI(panel, guiSyncManager) .child(new EnumRowBuilder<>(TransferMode.class) .value(transferMode) .lang("cover.generic.transfer_mode") diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java index 74a9e415ac4..da4eaec8370 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java @@ -1,7 +1,10 @@ package gregtech.common.covers.ender; +import com.cleanroommc.modularui.utils.Alignment; + import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverableView; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.virtualregistry.EntryTypes; @@ -10,6 +13,7 @@ import gregtech.common.covers.filter.ItemFilterContainer; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraftforge.items.CapabilityItemHandler; @@ -21,17 +25,20 @@ import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.drawable.DynamicDrawable; +import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.layout.Grid; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; + +import java.util.function.IntFunction; public class CoverEnderItemLink extends CoverAbstractEnderLink { protected final ItemFilterContainer container; - @Nullable - private IPanelHandler chestPanel; public CoverEnderItemLink(@NotNull CoverDefinition definition, @NotNull CoverableView coverableView, @NotNull EnumFacing attachedSide) { @@ -39,10 +46,6 @@ public CoverEnderItemLink(@NotNull CoverDefinition definition, @NotNull Coverabl container = new ItemFilterContainer(this); } - private ModularPanel createChestPanel(ModularPanel parentPanel, EntityPlayer player) { - return GTGuis.createPopupPanel(getDefinition().getResourceLocation().getPath(), 100, 100); - } - @Override protected EntryTypes getType() { return EntryTypes.ENDER_ITEM; @@ -55,11 +58,12 @@ protected String identifier() { @Override protected IWidget createEntrySlot(ModularPanel panel, PanelSyncManager syncManager) { - IPanelHandler panelHandler = getChestPanel(panel); + IPanelHandler panelHandler = IPanelHandler.simple(panel, this::createChestPanel, true); return new ButtonWidget<>() .onMousePressed(mouseButton -> { if (panelHandler.isPanelOpen()) { panelHandler.closePanel(); + panelHandler.deleteCachedPanel(); } else { panelHandler.openPanel(); } @@ -67,17 +71,30 @@ protected IWidget createEntrySlot(ModularPanel panel, PanelSyncManager syncManag }); } - @NotNull - private IPanelHandler getChestPanel(ModularPanel modularPanel) { - if (chestPanel == null) { - chestPanel = IPanelHandler.simple(modularPanel, this::createChestPanel, true); - } - return chestPanel; + private ModularPanel createChestPanel(ModularPanel parentPanel, EntityPlayer player) { + IntFunction getStack = activeEntry::getStackInSlot; + return GTGuis.createPopupPanel("chest_panel", 100, 100) + .padding(16, 4) + .coverChildren() + .child(new Grid().coverChildren() + .mapTo(3, activeEntry.getSlots(), value -> { + var item = new ItemDrawable(); + // fake item slot because i don't want to deal with syncing + return new Widget<>() + .size(18) + .background(GTGuiTextures.SLOT) + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> tooltip.addFromItem(getStack.apply(value))) + .overlay(new DynamicDrawable(() -> item.setItem(getStack.apply(value))) + .asIcon() + .alignment(Alignment.Center) + .size(16)); + })); } @Override protected IWidget createSlotWidget(VirtualChest entry) { - return null; + return GTGuiTextures.FILTER_SETTINGS_OVERLAY.asWidget(); } @Override diff --git a/src/main/java/gregtech/common/items/MetaItem1.java b/src/main/java/gregtech/common/items/MetaItem1.java index cae98881402..35cc5f06ef4 100644 --- a/src/main/java/gregtech/common/items/MetaItem1.java +++ b/src/main/java/gregtech/common/items/MetaItem1.java @@ -616,6 +616,7 @@ public void registerSubItems() { COVER_ENERGY_DETECTOR_ADVANCED = addItem(318, "cover.energy.detector.advanced"); COVER_SCREEN = addItem(307, "cover.screen"); // FREE ID 308 + COVER_ENDER_ITEM_LINK = addItem(308, "cover.ender_item_link"); COVER_SHUTTER = addItem(309, "cover.shutter"); COVER_INFINITE_WATER = addItem(310, "cover.infinite_water").addComponents(new TooltipBehavior(lines -> { lines.add(I18n.format("metaitem.cover.infinite_water.tooltip.1")); diff --git a/src/main/java/gregtech/common/items/MetaItems.java b/src/main/java/gregtech/common/items/MetaItems.java index eaa75bc932f..5e2bda0aa58 100644 --- a/src/main/java/gregtech/common/items/MetaItems.java +++ b/src/main/java/gregtech/common/items/MetaItems.java @@ -440,6 +440,7 @@ private MetaItems() {} public static MetaItem.MetaValueItem COVER_SCREEN; public static MetaItem.MetaValueItem COVER_INFINITE_WATER; public static MetaItem.MetaValueItem COVER_ENDER_FLUID_LINK; + public static MetaItem.MetaValueItem COVER_ENDER_ITEM_LINK; public static MetaItem.MetaValueItem COVER_DIGITAL_INTERFACE; public static MetaItem.MetaValueItem COVER_DIGITAL_INTERFACE_WIRELESS; public static MetaItem.MetaValueItem COVER_FLUID_VOIDING; From 84f58169551307062856bb01b928b078cdee4c10 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 6 Mar 2025 21:33:09 -0700 Subject: [PATCH 3/5] seperate active popup from list popup cleanup ender link pass in panel and sync manager cleanup lang slightly --- .../gregtech/common/covers/CoverPump.java | 2 +- .../covers/ender/CoverAbstractEnderLink.java | 43 +++++----- .../covers/ender/CoverEnderFluidLink.java | 20 ++--- .../covers/ender/CoverEnderItemLink.java | 83 +++++++++++++++++-- .../resources/assets/gregtech/lang/en_us.lang | 1 - 5 files changed, 108 insertions(+), 41 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 8e41b1bf55f..8daa9fd3433 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -262,7 +262,7 @@ protected ParentWidget createUI(ModularPanel panel, PanelSyncManager syncMana if (createPumpModeRow()) column.child(new EnumRowBuilder<>(PumpMode.class) .value(pumpMode) - .lang("cover.pump.mode") + .lang("cover.generic.io") .overlay(GTGuiTextures.CONVEYOR_MODE_OVERLAY) // todo pump mode overlays .build()); diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 83ae0344f51..e46e4e1ae70 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -39,18 +39,19 @@ import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widgets.ButtonWidget; -import com.cleanroommc.modularui.widgets.ListWidget; +import com.cleanroommc.modularui.widgets.ListValueWidget; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Row; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.input.Keyboard; -import java.util.ArrayList; -import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import java.util.regex.Pattern; @@ -157,7 +158,7 @@ protected Flow createWidgets(ModularPanel modularPanel, PanelSyncManager syncMan .child(createPrivateButton()) .child(createColorIcon()) .child(new TextFieldWidget() - .height(18) + .height(16) // todo height is actually 20 for some reason? .value(name) .setPattern(COLOR_INPUT_PATTERN) .widthRel(0.5f) @@ -283,19 +284,20 @@ public void writeToNBT(@NotNull NBTTagCompound nbt) { protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { return (syncManager, syncHandler) -> { - List rows = new ArrayList<>(); - for (String name : VirtualEnderRegistry.getEntryNames(getOwner(), type)) { - rows.add(createRow(name, syncManager, type)); - } - return GTGuis.createPopupPanel("entry_selector", 168, 112, true) - .child(IKey.lang("cover.generic.ender.known_channels") - .color(UI_TITLE_COLOR) - .asWidget() - .top(6) - .left(4)) - .child(new ListWidget<>() - .children(rows) - // .builder(names, name -> createRow(name, syncManager, type)) + Set names = VirtualEnderRegistry.getEntryNames(getOwner(), type); + Map reverse = new Reference2ObjectArrayMap<>(names.size()); + var panel = GTGuis.createPopupPanel("entry_selector", 168, 112, true); + return panel.child(IKey.lang("cover.generic.ender.known_channels") + .color(UI_TITLE_COLOR) + .asWidget() + .top(6) + .left(4)) + .child(new ListValueWidget<>(reverse::get) + .children(names, name -> { + IWidget row = createRow(name, panel, syncManager, type); + reverse.put(row, name); + return row; + }) .background(GTGuiTextures.DISPLAY.asIcon() .width(168 - 8) .height(112 - 20)) @@ -338,7 +340,8 @@ protected PanelSyncHandler.IPanelBuilder entryDescription(String key, T entry) { }; } - protected IWidget createRow(final String name, final PanelSyncManager syncManager, final EntryTypes type) { + protected IWidget createRow(final String name, final ModularPanel mainPanel, + final PanelSyncManager syncManager, final EntryTypes type) { final T entry = VirtualEnderRegistry.getEntry(getOwner(), type, name); var key = String.format("entry#%s_description", entry.getColorStr()); var syncKey = PanelSyncManager.makeSyncKey(key, isPrivate ? 1 : 0); @@ -382,7 +385,7 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage } return true; })) - .child(createSlotWidget(entry)) + .child(createSlotWidget(entry, mainPanel, syncManager)) .child(new ButtonWidget<>() .overlay(GTGuiTextures.BUTTON_CROSS) .setEnabledIf(w -> !Objects.equals(entry.getColor(), activeEntry.getColor())) @@ -399,7 +402,7 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage })); } - protected abstract IWidget createSlotWidget(T entry); + protected abstract IWidget createSlotWidget(T entry, ModularPanel panel, PanelSyncManager syncManager); protected void deleteEntry(UUID player, String name) { VirtualEnderRegistry.deleteEntry(player, getType(), name, this::shouldDeleteEntry); diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java index ff26f1c4f2d..228a772346a 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java @@ -11,7 +11,7 @@ import gregtech.api.util.virtualregistry.EntryTypes; import gregtech.api.util.virtualregistry.entries.VirtualTank; import gregtech.client.renderer.texture.Textures; -import gregtech.common.covers.CoverPump; +import gregtech.common.covers.CoverPump.PumpMode; import gregtech.common.covers.filter.FluidFilterContainer; import gregtech.common.mui.widget.GTFluidSlot; @@ -39,7 +39,7 @@ public class CoverEnderFluidLink extends CoverAbstractEnderLink public static final int TRANSFER_RATE = 8000; // mB/t - protected CoverPump.PumpMode pumpMode = CoverPump.PumpMode.IMPORT; + protected PumpMode pumpMode = PumpMode.IMPORT; private final FluidTankSwitchShim linkedTank; protected final FluidFilterContainer fluidFilter; @@ -105,17 +105,17 @@ protected void transferFluids() { } } - public void setPumpMode(CoverPump.PumpMode pumpMode) { + public void setPumpMode(PumpMode pumpMode) { this.pumpMode = pumpMode; markDirty(); } - public CoverPump.PumpMode getPumpMode() { + public PumpMode getPumpMode() { return pumpMode; } @Override - protected IWidget createSlotWidget(VirtualTank entry) { + protected IWidget createSlotWidget(VirtualTank entry, ModularPanel panel, PanelSyncManager syncManager) { var fluidTank = GTFluidSlot.sync(entry) .accessibility(false, false); @@ -143,16 +143,16 @@ protected IWidget createEntrySlot(ModularPanel panel, PanelSyncManager syncManag protected Flow createWidgets(ModularPanel modularPanel, PanelSyncManager syncManager) { getFluidFilterContainer().setMaxTransferSize(1); - var pumpMode = new EnumSyncValue<>(CoverPump.PumpMode.class, this::getPumpMode, this::setPumpMode); + var pumpMode = new EnumSyncValue<>(PumpMode.class, this::getPumpMode, this::setPumpMode); syncManager.syncValue("pump_mode", pumpMode); - pumpMode.updateCacheFromSource(true); return super.createWidgets(modularPanel, syncManager) .child(getFluidFilterContainer().initUI(modularPanel, syncManager)) - .child(new EnumRowBuilder<>(CoverPump.PumpMode.class) + .child(new EnumRowBuilder<>(PumpMode.class) .value(pumpMode) + // todo pump mode overlay? .overlay(GTGuiTextures.CONVEYOR_MODE_OVERLAY) - .lang("cover.pump.mode") + .lang("cover.generic.io") .build()); } @@ -166,7 +166,7 @@ public void writeToNBT(NBTTagCompound tagCompound) { @Override public void readFromNBT(NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); - this.pumpMode = CoverPump.PumpMode.values()[tagCompound.getInteger("PumpMode")]; + this.pumpMode = PumpMode.values()[tagCompound.getInteger("PumpMode")]; this.fluidFilter.deserializeNBT(tagCompound.getCompoundTag("Filter")); } diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java index da4eaec8370..8340135132e 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java @@ -1,7 +1,5 @@ package gregtech.common.covers.ender; -import com.cleanroommc.modularui.utils.Alignment; - import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverableView; import gregtech.api.mui.GTGuiTextures; @@ -10,9 +8,11 @@ import gregtech.api.util.virtualregistry.EntryTypes; import gregtech.api.util.virtualregistry.VirtualChest; import gregtech.client.renderer.texture.Textures; +import gregtech.common.covers.CoverConveyor.ConveyorMode; import gregtech.common.covers.filter.ItemFilterContainer; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; @@ -24,13 +24,18 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.IPanelHandler; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Grid; import org.jetbrains.annotations.NotNull; @@ -38,7 +43,9 @@ public class CoverEnderItemLink extends CoverAbstractEnderLink { + private static final IDrawable CHEST = new ItemDrawable(new ItemStack(Blocks.CHEST)).asIcon(); protected final ItemFilterContainer container; + private ConveyorMode conveyorMode = ConveyorMode.IMPORT; public CoverEnderItemLink(@NotNull CoverDefinition definition, @NotNull CoverableView coverableView, @NotNull EnumFacing attachedSide) { @@ -60,10 +67,13 @@ protected String identifier() { protected IWidget createEntrySlot(ModularPanel panel, PanelSyncManager syncManager) { IPanelHandler panelHandler = IPanelHandler.simple(panel, this::createChestPanel, true); return new ButtonWidget<>() + // todo lang + .addTooltipLine(IKey.str("Open Active Entry View")) + .overlay(CHEST) .onMousePressed(mouseButton -> { if (panelHandler.isPanelOpen()) { - panelHandler.closePanel(); panelHandler.deleteCachedPanel(); + panelHandler.closePanel(); } else { panelHandler.openPanel(); } @@ -72,19 +82,28 @@ protected IWidget createEntrySlot(ModularPanel panel, PanelSyncManager syncManag } private ModularPanel createChestPanel(ModularPanel parentPanel, EntityPlayer player) { + return createChestPanel("active", parentPanel, player); + } + + private ModularPanel createChestPanel(String color, ModularPanel parentPanel, EntityPlayer player) { IntFunction getStack = activeEntry::getStackInSlot; - return GTGuis.createPopupPanel("chest_panel", 100, 100) + return GTGuis.createPopupPanel("chest_panel#" + color, 100, 100) .padding(16, 4) .coverChildren() .child(new Grid().coverChildren() .mapTo(3, activeEntry.getSlots(), value -> { - var item = new ItemDrawable(); + var item = new ItemDrawable(); // todo this doesn't draw amount until next mui2 version // fake item slot because i don't want to deal with syncing return new Widget<>() .size(18) .background(GTGuiTextures.SLOT) .tooltipAutoUpdate(true) - .tooltipBuilder(tooltip -> tooltip.addFromItem(getStack.apply(value))) + .tooltipBuilder(tooltip -> { + ItemStack stack = getStack.apply(value); + if (stack.isEmpty()) return; + tooltip.addFromItem(stack); + tooltip.add(IKey.lang("gregtech.item_list.item_stored", stack.getCount())); + }) .overlay(new DynamicDrawable(() -> item.setItem(getStack.apply(value))) .asIcon() .alignment(Alignment.Center) @@ -93,8 +112,50 @@ private ModularPanel createChestPanel(ModularPanel parentPanel, EntityPlayer pla } @Override - protected IWidget createSlotWidget(VirtualChest entry) { - return GTGuiTextures.FILTER_SETTINGS_OVERLAY.asWidget(); + protected IWidget createSlotWidget(VirtualChest entry, ModularPanel panel, PanelSyncManager syncManager) { + IPanelHandler panelHandler = IPanelHandler.simple(panel, + (parentPanel, player) -> createChestPanel(entry.getColorStr(), parentPanel, player), true); + return new ButtonWidget<>() + // todo lang + .addTooltipLine(IKey.str("Open Entry [#%s]'s View", entry.getColorStr())) + .overlay(CHEST) + .onMousePressed(mouseButton -> { + if (panelHandler.isPanelOpen()) { + panelHandler.deleteCachedPanel(); + panelHandler.closePanel(); + } else { + panelHandler.openPanel(); + } + return true; + }); + } + + @Override + protected Flow createWidgets(ModularPanel modularPanel, PanelSyncManager syncManager) { + getItemFilterContainer().setMaxTransferSize(1); + + var conveyorMode = new EnumSyncValue<>(ConveyorMode.class, this::getConveyorMode, this::setConveyorMode); + syncManager.syncValue("conveyor_mode", conveyorMode); + + return super.createWidgets(modularPanel, syncManager) + .child(getItemFilterContainer().initUI(modularPanel, syncManager)) + .child(new EnumRowBuilder<>(ConveyorMode.class) + .value(conveyorMode) + .overlay(GTGuiTextures.CONVEYOR_MODE_OVERLAY) + .lang("cover.generic.io") + .build()); + } + + public ConveyorMode getConveyorMode() { + return conveyorMode; + } + + private void setConveyorMode(ConveyorMode mode) { + this.conveyorMode = mode; + } + + public ItemFilterContainer getItemFilterContainer() { + return container; } @Override @@ -134,6 +195,10 @@ private void transferItems() { IItemHandler handler = getCoverableView().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, getAttachedSide()); if (handler == null) return; - GTTransferUtils.moveInventoryItems(handler, this.activeEntry, this.container::test); + if (getConveyorMode().isImport()) { + GTTransferUtils.moveInventoryItems(handler, this.activeEntry, this.container::test); + } else { + GTTransferUtils.moveInventoryItems(this.activeEntry, handler, this.container::test); + } } } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index c29313c2c1f..7841d55a68b 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -1328,7 +1328,6 @@ cover.generic.enabled=Enabled cover.generic.transfer_mode=Transfer Mode cover.generic.manual_io=Manual IO Mode cover.generic.io=IO Mode -cover.pump.mode=Pump Mode cover.conveyor.title=Conveyor Cover Settings (%s) cover.conveyor.transfer_rate=ยง7items/sec cover.conveyor.mode.export=Mode: Export From 1084b5f8958566db4b83f82c19271e9a4a431bd1 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 6 Mar 2025 21:55:09 -0700 Subject: [PATCH 4/5] fix missing io button on ender covers serialize nbt for item ender cover --- .../covers/ender/CoverAbstractEnderLink.java | 24 ++++++++++++------- .../covers/ender/CoverEnderFluidLink.java | 2 +- .../covers/ender/CoverEnderItemLink.java | 18 +++++++++++++- .../resources/assets/gregtech/lang/en_us.lang | 4 ++-- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index e46e4e1ae70..3279e12b492 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -22,6 +22,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.ITickable; +import net.minecraft.util.text.TextFormatting; import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.drawable.IKey; @@ -42,7 +43,6 @@ import com.cleanroommc.modularui.widgets.ListValueWidget; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.layout.Row; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import org.jetbrains.annotations.NotNull; @@ -153,7 +153,8 @@ protected Flow createWidgets(ModularPanel modularPanel, PanelSyncManager syncMan return Flow.column().coverChildrenHeight().top(24) .margin(7, 0).widthRel(1f) - .child(new Row().marginBottom(2) + .child(Flow.row() + .marginBottom(2) .coverChildrenHeight() .child(createPrivateButton()) .child(createColorIcon()) @@ -208,16 +209,21 @@ protected IWidget createPrivateButton() { } protected IWidget createIoRow() { - return Flow.row().marginBottom(2) + return Flow.row() + .marginBottom(2) .coverChildrenHeight() + .child(new ToggleButton() + .value(new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled)) + .overlay(true, IKey.lang("behaviour.soft_hammer.enabled").style(TextFormatting.WHITE)) + .overlay(false, IKey.lang("behaviour.soft_hammer.disabled").style(TextFormatting.WHITE)) + .widthRel(0.525f) + .left(0)) .child(new ToggleButton() .value(new BooleanSyncValue(this::isIoEnabled, this::setIoEnabled)) - .overlay(IKey.dynamic(() -> IKey.lang(this.ioEnabled ? - "behaviour.soft_hammer.enabled" : - "behaviour.soft_hammer.disabled").get()) - .color(Color.WHITE.darker(1))) - .widthRel(0.6f) - .left(0)); + .overlay(true, IKey.lang("cover.generic.ender.iomode.enabled").style(TextFormatting.WHITE)) + .overlay(false, IKey.lang("cover.generic.ender.iomode.disabled").style(TextFormatting.WHITE)) + .widthRel(0.425f) + .right(0)); } @Override diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java index 228a772346a..656e5e418d6 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java @@ -166,7 +166,7 @@ public void writeToNBT(NBTTagCompound tagCompound) { @Override public void readFromNBT(NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); - this.pumpMode = PumpMode.values()[tagCompound.getInteger("PumpMode")]; + this.pumpMode = PumpMode.VALUES[tagCompound.getInteger("PumpMode")]; this.fluidFilter.deserializeNBT(tagCompound.getCompoundTag("Filter")); } diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java index 8340135132e..ea4d09caf2f 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java @@ -14,6 +14,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraftforge.items.CapabilityItemHandler; @@ -88,7 +89,8 @@ private ModularPanel createChestPanel(ModularPanel parentPanel, EntityPlayer pla private ModularPanel createChestPanel(String color, ModularPanel parentPanel, EntityPlayer player) { IntFunction getStack = activeEntry::getStackInSlot; return GTGuis.createPopupPanel("chest_panel#" + color, 100, 100) - .padding(16, 4) + .padding(4) + .paddingRight(16) .coverChildren() .child(new Grid().coverChildren() .mapTo(3, activeEntry.getSlots(), value -> { @@ -201,4 +203,18 @@ private void transferItems() { GTTransferUtils.moveInventoryItems(this.activeEntry, handler, this.container::test); } } + + @Override + public void writeToNBT(@NotNull NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("ConveyorMode", this.conveyorMode.ordinal()); + nbt.setTag("Filter", this.container.serializeNBT()); + } + + @Override + public void readFromNBT(@NotNull NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.conveyorMode = ConveyorMode.VALUES[nbt.getInteger("ConveyorMode")]; + this.container.deserializeNBT(nbt.getCompoundTag("Filter")); + } } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 7841d55a68b..c684829ca6a 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -1383,8 +1383,6 @@ cover.machine_controller.enable_with_redstone=Enable with Redstone cover.machine_controller.disable_with_redstone=Disable with Redstone cover.ender_fluid_link.title=Ender Fluid Link -cover.ender_fluid_link.iomode.enabled=I/O Enabled -cover.ender_fluid_link.iomode.disabled=I/O Disabled cover.ender_fluid_link.private.tooltip.disabled=Switch to private tank mode\nPrivate mode uses the player who originally placed the cover cover.ender_fluid_link.private.tooltip.enabled=Switch to public tank mode cover.ender_fluid_link.incomplete_hex=Inputted color is incomplete!/nIt will be applied once complete (all 8 hex digits)/nClosing the gui will lose edits! @@ -1395,6 +1393,8 @@ cover.generic.ender.open_selector=Open Entry Selector cover.generic.ender.set_description.tooltip=Set Description cover.generic.ender.set_description.title=Set Description [%s] cover.generic.ender.delete_entry=Delete Entry +cover.generic.ender.iomode.enabled=I/O Enabled +cover.generic.ender.iomode.disabled=I/O Disabled cover.generic.advanced_detector.latched=Latched cover.generic.advanced_detector.continuous=Continuous From ad91282bc5ff0cb0c2f6aa458b0d283c8c4f3203 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 6 Mar 2025 22:24:31 -0700 Subject: [PATCH 5/5] fix conveyer name clash cleanup abstract ender link cover copy ender fluid overlay texture for ender item --- .../client/renderer/texture/Textures.java | 2 ++ .../gregtech/common/covers/CoverBehaviors.java | 2 +- .../covers/ender/CoverAbstractEnderLink.java | 6 ++---- .../common/covers/ender/CoverEnderItemLink.java | 4 ++-- .../item/metaitems/cover.ender_item_link.json | 6 ++++++ .../blocks/cover/overlay_ender_item_link.png | Bin 0 -> 1382 bytes .../cover/overlay_ender_item_link.png.mcmeta | 5 +++++ .../cover/overlay_ender_item_link_emissive.png | Bin 0 -> 1188 bytes .../overlay_ender_item_link_emissive.png.mcmeta | 5 +++++ .../items/metaitems/cover.ender_item_link.png | Bin 0 -> 574 bytes 10 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/gregtech/models/item/metaitems/cover.ender_item_link.json create mode 100644 src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link.png.mcmeta create mode 100644 src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link_emissive.png create mode 100644 src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link_emissive.png.mcmeta create mode 100644 src/main/resources/assets/gregtech/textures/items/metaitems/cover.ender_item_link.png diff --git a/src/main/java/gregtech/client/renderer/texture/Textures.java b/src/main/java/gregtech/client/renderer/texture/Textures.java index 76f91891093..e971ca038cc 100644 --- a/src/main/java/gregtech/client/renderer/texture/Textures.java +++ b/src/main/java/gregtech/client/renderer/texture/Textures.java @@ -323,6 +323,8 @@ public class Textures { "cover/overlay_item_voiding_advanced"); public static final SimpleOverlayRenderer ENDER_FLUID_LINK = new SimpleOverlayRenderer( "cover/overlay_ender_fluid_link"); + public static final SimpleOverlayRenderer ENDER_ITEM_LINK = new SimpleOverlayRenderer( + "cover/overlay_ender_item_link"); public static final SimpleOverlayRenderer STORAGE = new SimpleOverlayRenderer("cover/overlay_storage"); public static final SimpleOverlayRenderer PIPE_OUT_OVERLAY = new SimpleOverlayRenderer( "overlay/machine/overlay_pipe_out"); diff --git a/src/main/java/gregtech/common/covers/CoverBehaviors.java b/src/main/java/gregtech/common/covers/CoverBehaviors.java index 91dfbbe79e3..deca3e8f9ae 100644 --- a/src/main/java/gregtech/common/covers/CoverBehaviors.java +++ b/src/main/java/gregtech/common/covers/CoverBehaviors.java @@ -119,7 +119,7 @@ public static void init() { CoverDetectorMaintenance::new); registerBehavior(gregtechId("infinite_water"), MetaItems.COVER_INFINITE_WATER, CoverInfiniteWater::new); registerBehavior(gregtechId("ender_fluid_link"), MetaItems.COVER_ENDER_FLUID_LINK, CoverEnderFluidLink::new); - registerBehavior(gregtechId("ender_fluid_link"), MetaItems.COVER_ENDER_ITEM_LINK, CoverEnderItemLink::new); + registerBehavior(gregtechId("ender_item_link"), MetaItems.COVER_ENDER_ITEM_LINK, CoverEnderItemLink::new); registerBehavior(gregtechId("cover.digital"), MetaItems.COVER_DIGITAL_INTERFACE, CoverDigitalInterface::new); // Custom cover behaviour diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 3279e12b492..99e2d810476 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -197,14 +197,12 @@ protected IWidget createColorIcon() { protected IWidget createPrivateButton() { return new ToggleButton() .value(new BooleanSyncValue(this::isPrivate, this::setPrivate)) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .background(GTGuiTextures.PRIVATE_MODE_BUTTON[0]) .hoverBackground(GTGuiTextures.PRIVATE_MODE_BUTTON[0]) .selectedBackground(GTGuiTextures.PRIVATE_MODE_BUTTON[1]) .selectedHoverBackground(GTGuiTextures.PRIVATE_MODE_BUTTON[1]) - .tooltipBuilder(tooltip -> tooltip.addLine(IKey.lang(this.isPrivate ? - "cover.ender_fluid_link.private.tooltip.enabled" : - "cover.ender_fluid_link.private.tooltip.disabled"))) + .addTooltip(true, IKey.lang("cover.ender_fluid_link.private.tooltip.enabled")) + .addTooltip(false, IKey.lang("cover.ender_fluid_link.private.tooltip.disabled")) .marginRight(2); } diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java index ea4d09caf2f..ef8178a19bb 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java @@ -177,8 +177,8 @@ public boolean canAttach(@NotNull CoverableView coverable, @NotNull EnumFacing s public void renderCover(@NotNull CCRenderState renderState, @NotNull Matrix4 translation, @NotNull IVertexOperation[] pipeline, @NotNull Cuboid6 plateBox, @NotNull BlockRenderLayer layer) { - // todo new texture - Textures.ENDER_FLUID_LINK.renderSided(getAttachedSide(), plateBox, renderState, pipeline, translation); + // todo work on new texture + Textures.ENDER_ITEM_LINK.renderSided(getAttachedSide(), plateBox, renderState, pipeline, translation); } @Override diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/cover.ender_item_link.json b/src/main/resources/assets/gregtech/models/item/metaitems/cover.ender_item_link.json new file mode 100644 index 00000000000..8c7fadcc966 --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/metaitems/cover.ender_item_link.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gregtech:items/metaitems/cover.ender_item_link" + } +} diff --git a/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link.png b/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link.png new file mode 100644 index 0000000000000000000000000000000000000000..cfce61c0157513514fb451f4b913215bf69be042 GIT binary patch literal 1382 zcmV-s1)2JZP)Px)AW1|)RA_c4-Htu6nT}^51STOuNIZlHB0{W?@*UXl zCGuIa4_lUmEFzI8BcUWx(B#34nZe_+yX|(r>Roj&i%}M&+esnhUH_L?r%s)FZ`H5< z_Y`a-UmrMl?WYzch*F?5q6Cyev<4+S`tx7^>l$Yzr4knQ2h>T*otJ-y3UqvNGc} z2?RVZ#Ep6=$Hyp*txD4A>9ckC)+uPsc6*PiyGOo%m&NfvFm*|pFVM+3x-8&;q-u9I>2>H&k{tGMkR z64ofU2EDolYjV9%?X5jrdv7&- zbwtrRc*#ix^5l|YF{aEGeE;R&tmVP#$5m-+ET&AU7Uzg4_6}ab_1xw>Xzv_S*A=En zK?GwA@#)E09<0`+HGW-F=P}9)(0-f3l#E7SHs`^`VuWZ1ud_=y7~(32ps1Sjfb<=9 z_Z3zI(J^RYx#7V^-=OQ^K{)(Xl`bn|bKlFB6O0oZrHq7fv2w$;JaBur99wt1`Q;Om zY(|kORTwRed5}JuFgdwT6;BXRD8G$E7g`N@@bvM=RPhCv3dd`)H5f8{@#oF`f$j*7 z`yAF9y8T<+Jh)4^9}<7s@VwC8>S7}oZMX5gHl{qY*^>;kTFJ0>7XnUDj>5_@Xw5Vc z+4zHvzDd`^1G=wcgNW~b?`OC-T0H*nJ?zt?D(@Yw#IHRsEM}*aPiNeF^a-7V9}=L@ zJI^~}9<7A0<$>#VDW+$X>6FXMW4!)%2%_u1W>`h&Up0F^5)&IHk#-JyVF8y;+Q zrT%XotoghP%00B%)+@~NJH+-!?Ed5ryz$33Ez;;wR@l~_m_qqC5SFTiy%sGc(Bn`x*mTp z2wrFESZY5cP3IKJC0aC{&e2NvS{}qvM4C>?Mqg4SGcX1>>NW2t2Au(Q5mU@BsFxG! zB1J3bfB3)Px1r3b%NSD^Xsz-3!{+^iczI5lr+`NJ5jyDNeU<&&)Ve^7x=K*k$?u+f#e9v(b*_xHpLLprZ9Wd=@+*ripRH0vMO zu#d@o;^mmd;*2zb#CpyB!SunH+4v#Z@*Go@07*qoM6N<$f|k#(^#A|> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link.png.mcmeta new file mode 100644 index 00000000000..5e86a7cd5fb --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link_emissive.png b/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link_emissive.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c74dab4d4bc1b15ffabd78861ab288431dcce5 GIT binary patch literal 1188 zcmV;V1Y7%wP)Px(UP(kjRA_>`Gs1MSb>%}XvxHOU-obHvMhDvjlQBQv{Or(p$0X2FQcQ+Cxcv?G%sfGBk%n70 zR$vrh+n^OiyoXGNs4S*->f-bQ&#R-tHaZ)l09_U&2iwyNW}8ct%_XwsvqT%eqGUml zMbit)opqeWHO{>D7JBqL_wV1qN+X6wMMcF?z}OGkSKn1-VF@`Z@Pm+NuUsZ{ZEk(~ z(RBU5(yk!Ul*tg4j2PbQleYt71(xYz!|wtbolj7COn>_~M!V)T8U>Ey(dcxsygFJ~ z$Sg*dnNeVzLUXyztTRv4dxXp;_~AUlji;}`byC*OuQ1;|kK1S?>JrP9MnOfz(ZJXb zj$eAepcXob&?v0{Xtb8t{Pv4O7 zAuN_wUc&WUqrluy7S@omMCAzxfl`Widvkh$FC{XIvAh7=Z;-2kUhm=bQ`n1o2;0G% zStOWU#I+oPyfg|bDvk!mesJc4Pl{w*DxLXWHr_`$v9dfR`rmzhC_Bb1xb0PEGVC)N ztRrQP<#?9m81H2kB#-ym-@Hc|?<0hT8U@BUZ#}t78SjBAal9I>`7YfvuTEcq zJtJ`3XV6;F?5uKZZEyG~A}x8gl3HPt2^mNPvaCaNIc7+)#oh`N0lFa=>7) zf!8@f5O$1HFt1RW3kcW6QW8~W6ypJTJ~0Z+Tb?wbzHpM%Yfwae5Ee-Da^Jk+z{YDH zquG6#G@Gz~?|X!88wC{=M+0L&Sbh6Fm4r=^?Pj<^$jOTrxqRt_{_@(J)2$D5ZAqvo zCm(H4BqP$@oI7`)7;k3YFG!zkyopLj2e6t1oal9frHi(ij;hRg9J-Y zEoiNV$owQ*qaGkos$`OG8XJPKBh9WYV9g0^Kg0{?P(i9iv1eW+Ra6`ajF0DqtJn2` zqmh1{G#Qak2H3)8|A!mXohQa&NRk|o_8yW?hM*K~*fv&R3{x;OkIZB8(H?TVkIWNn z%ls+ADDeCS6dAIJQ8LH2ZM;r*dO2)RKQIdV8^2Jd5i%Qt)(BMt-<(F{6r?i&+eWxPP7qS- zoFH7An_gfyJZ&`{g4Pn@;%UNDD=c3ye=@E3ANULQY|>%lp??(s0000S->P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!Tf}6S!1)m#*;!kkVov66cjfz?kgcf&#iqLiOKL}YGaHCKP zJ{DTJTB}CmJCLhMJZJ9Z;@wE>2g8{;bH4A)%sC?pg#s8t2zyc_h$q-;0VePNInf)% z;$yr{i?E7I-u$(vZ80$aUEu3*KMZHB$zyY)kV--+1z|{JaxsX!Kvl&V`E8$+24)8) z92OuQtDy{~$r&S#Og@Ha-vnwp2XU7U;r2WTp$te8c@58svoP7$(1w-7Pn3O*BlUY7 zC9w{aMA~t4SWPkRp*6e$q|UWiTpq#l&I5L47GR~0VWm%zy*Z`paFRC!9`jMu_l;wP z$h*@-zBKWCZ6cdCA#wu#P$yE`0Vmpq_d=B6@%|3GocW5$$5bQR4-!C*tX+N=9)ar0 zOQaJ&^ilm)QTQrolt&RLkD>MZ6s*5Vgu9(!2Oa^g0>6R3tPbK?5YZ;Le4E5lb3h9# zshnsV-bbV=1nVF0bdZF+Izr$>7^S6QYz+>ft?3IQJ-)XeQSb?9gc`G`{ba#1ldw)U z5b2VL^imH{lS$ft4Y!rw+r|uTW%o19udZolv0$?POf10ozwZpZ0PT{b=T(m^_y7O^ M07*qoM6N<$f(^CyQ~&?~ literal 0 HcmV?d00001