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/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 72168861ac5..deca3e8f9ae 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_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/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..8daa9fd3433 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) @@ -263,7 +262,7 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { 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/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/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 3bde5ee79d9..99e2d810476 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; @@ -29,7 +30,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; @@ -40,18 +40,18 @@ 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; @@ -142,28 +142,29 @@ 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); 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()) .child(new TextFieldWidget() - .height(18) + .height(16) // todo height is actually 20 for some reason? .value(name) .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 +182,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() @@ -196,28 +197,31 @@ 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); } 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 @@ -284,19 +288,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)) @@ -339,7 +344,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); @@ -383,7 +389,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())) @@ -400,9 +406,13 @@ 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); + } - protected abstract void deleteEntry(UUID player, String name); + 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..656e5e418d6 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java @@ -9,10 +9,9 @@ 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; +import gregtech.common.covers.CoverPump.PumpMode; import gregtech.common.covers.filter.FluidFilterContainer; import gregtech.common.mui.widget.GTFluidSlot; @@ -29,20 +28,18 @@ 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 { 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; @@ -101,24 +98,24 @@ 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); } } - 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); @@ -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,19 +140,19 @@ 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); + var pumpMode = new EnumSyncValue<>(PumpMode.class, this::getPumpMode, this::setPumpMode); syncManager.syncValue("pump_mode", pumpMode); - pumpMode.updateCacheFromSource(true); - return super.createWidgets(data, syncManager) - .child(getFluidFilterContainer().initUI(data, syncManager)) - .child(new EnumRowBuilder<>(CoverPump.PumpMode.class) + return super.createWidgets(modularPanel, syncManager) + .child(getFluidFilterContainer().initUI(modularPanel, syncManager)) + .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()); } @@ -169,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 new file mode 100644 index 00000000000..ef8178a19bb --- /dev/null +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderItemLink.java @@ -0,0 +1,220 @@ +package gregtech.common.covers.ender; + +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; +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.nbt.NBTTagCompound; +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.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; + +import java.util.function.IntFunction; + +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) { + super(definition, coverableView, attachedSide); + container = new ItemFilterContainer(this); + } + + @Override + protected EntryTypes getType() { + return EntryTypes.ENDER_ITEM; + } + + @Override + protected String identifier() { + return "EILink#"; + } + + @Override + 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.deleteCachedPanel(); + panelHandler.closePanel(); + } else { + panelHandler.openPanel(); + } + return true; + }); + } + + 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#" + color, 100, 100) + .padding(4) + .paddingRight(16) + .coverChildren() + .child(new Grid().coverChildren() + .mapTo(3, activeEntry.getSlots(), value -> { + 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 -> { + 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) + .size(16)); + })); + } + + @Override + 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 + 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 work on new texture + Textures.ENDER_ITEM_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; + if (getConveyorMode().isImport()) { + GTTransferUtils.moveInventoryItems(handler, this.activeEntry, this.container::test); + } else { + 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/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; })) 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; diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index c29313c2c1f..c684829ca6a 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 @@ -1384,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! @@ -1396,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 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 00000000000..cfce61c0157 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link.png differ 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 00000000000..d5c74dab4d4 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link_emissive.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link_emissive.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link_emissive.png.mcmeta new file mode 100644 index 00000000000..5e86a7cd5fb --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/cover/overlay_ender_item_link_emissive.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/cover.ender_item_link.png b/src/main/resources/assets/gregtech/textures/items/metaitems/cover.ender_item_link.png new file mode 100644 index 00000000000..201f7e4090a Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/items/metaitems/cover.ender_item_link.png differ