From a49c77e81b4e4f45dfa768847b97751d36fd6640 Mon Sep 17 00:00:00 2001 From: Spicierspace153 Date: Fri, 11 Oct 2024 16:19:26 -0600 Subject: [PATCH] Add Storage Cover (#1990) Co-authored-by: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Co-authored-by: JuiceyBeans <75553966+JuiceyBeans@users.noreply.github.com> Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- .../compass/nodes/covers/storage_cover.json | 18 +++ .../gtceu/compass/nodes/materials/frame.json | 1 - .../resources/assets/gtceu/lang/en_ud.json | 4 + .../resources/assets/gtceu/lang/en_us.json | 4 + .../gtceu/models/item/storage_cover.json | 6 + .../gtceu/api/cover/CoverBehavior.java | 5 + .../api/machine/feature/IFancyUIMachine.java | 11 ++ .../gregtechceu/gtceu/api/tag/TagPrefix.java | 1 - .../gtceu/common/cover/StorageCover.java | 124 ++++++++++++++++++ .../gtceu/data/cover/GTCovers.java | 3 + .../gregtechceu/gtceu/data/item/GTItems.java | 6 + .../gtceu/data/lang/LangHandler.java | 1 + .../data/recipe/misc/MachineRecipeLoader.java | 27 ++-- .../textures/block/cover/storage_cover.png | Bin 0 -> 821 bytes .../gtceu/textures/item/storage_cover.png | Bin 0 -> 862 bytes 15 files changed, 191 insertions(+), 20 deletions(-) create mode 100644 src/generated/resources/assets/gtceu/compass/nodes/covers/storage_cover.json create mode 100644 src/generated/resources/assets/gtceu/models/item/storage_cover.json create mode 100644 src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java create mode 100644 src/main/resources/assets/gtceu/textures/block/cover/storage_cover.png create mode 100644 src/main/resources/assets/gtceu/textures/item/storage_cover.png diff --git a/src/generated/resources/assets/gtceu/compass/nodes/covers/storage_cover.json b/src/generated/resources/assets/gtceu/compass/nodes/covers/storage_cover.json new file mode 100644 index 0000000000..64b589ad73 --- /dev/null +++ b/src/generated/resources/assets/gtceu/compass/nodes/covers/storage_cover.json @@ -0,0 +1,18 @@ +{ + "button_texture": { + "type": "item", + "res": "gtceu:storage_cover" + }, + "items": [ + "gtceu:storage_cover" + ], + "page": "gtceu:covers/storage_cover", + "position": [ + -300, + 150 + ], + "pre_nodes": [ + "gtceu:covers/cover" + ], + "section": "gtceu:covers" +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json b/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json index 39cfd375c8..c21b6fad61 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json @@ -4,7 +4,6 @@ "res": "gtceu:aluminium_frame" }, "items": [ - "#minecraft:climbable", "#forge:frames" ], "page": "gtceu:materials/frame", diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 6a16e69d59..64695f056b 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1836,6 +1836,7 @@ "compass.node.gtceu.covers/robot_arm": "ɯɹⱯ ʇoqoᴚ", "compass.node.gtceu.covers/shutter_module_cover": "ɹǝʌoƆ ǝןnpoW ɹǝʇʇnɥS", "compass.node.gtceu.covers/solar_panel": "ןǝuɐԀ ɹɐןoS", + "compass.node.gtceu.covers/storage_cover": "ɹǝʌoƆ ǝbɐɹoʇS", "compass.node.gtceu.ev/cracker": "ɹǝʞɔɐɹƆ", "compass.node.gtceu.ev/distillation_tower": "ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ", "compass.node.gtceu.ev/large_combustion": "uoıʇsnqɯoƆ ǝbɹɐꞀ", @@ -2265,6 +2266,7 @@ "config.gtceu.option.hardGlassRecipes": "sǝdıɔǝᴚssɐן⅁pɹɐɥ", "config.gtceu.option.hardIronRecipes": "sǝdıɔǝᴚuoɹIpɹɐɥ", "config.gtceu.option.hardMiscRecipes": "sǝdıɔǝᴚɔsıWpɹɐɥ", + "config.gtceu.option.hardMultiRecipes": "sǝdıɔǝᴚıʇןnWpɹɐɥ", "config.gtceu.option.hardRedstoneRecipes": "sǝdıɔǝᴚǝuoʇspǝᴚpɹɐɥ", "config.gtceu.option.hardToolArmorRecipes": "sǝdıɔǝᴚɹoɯɹⱯןoo⟘pɹɐɥ", "config.gtceu.option.hardWoodRecipes": "sǝdıɔǝᴚpooMpɹɐɥ", @@ -2519,6 +2521,7 @@ "cover.smart_item_filter.filtering_mode.electrolyzer": "ɹǝzʎןoɹʇɔǝןƎ", "cover.smart_item_filter.filtering_mode.sifter": "ɹǝʇɟıS", "cover.smart_item_filter.title": "ɹǝʇןıℲ ɯǝʇI ʇɹɐɯS", + "cover.storage.title": "ɹǝʌoƆ ǝbɐɹoʇS", "cover.universal.manual_import_export.mode.description.0": " ˙ɹǝʇןıɟ sʇı puɐ ɹǝʌoɔ ǝɥʇ ʎq pǝıɟıɔǝds sɐ ǝʌoɯ ʎןuo ןןıʍ spınןɟ/sɯǝʇI - ɹ§pǝןqɐsıᗡǝ§", "cover.universal.manual_import_export.mode.description.1": " ˙)ʎuɐ ɟı( sǝɥɔʇɐɯ ɹǝʇןıɟ sʇı sɐ buoן sɐ 'ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʇɹǝsuı puɐ pǝʇɔɐɹʇxǝ ǝq uɐɔ spınןɟ/sɯǝʇI - ɹ§pǝɹǝʇןıℲ ʍoןןⱯǝ§", "cover.universal.manual_import_export.mode.description.2": "ɹǝʌoɔ sıɥʇ ʎq pǝʇɔɐɹʇxǝ ɹo pǝʇɹǝsuı sɯǝʇı ǝɥʇ oʇ sǝıןddɐ ɹǝʇןıℲ ˙ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʌoɯ ǝq uɐɔ spınןɟ/sɯǝʇI - ɹ§pǝɹǝʇןıɟu∩ ʍoןןⱯǝ§", @@ -4743,6 +4746,7 @@ "item.gtceu.stem_cells": "sןןǝƆ ɯǝʇS", "item.gtceu.stem_cells.tooltip": "ǝɔuǝbıןןǝʇuI ʍɐᴚㄥ§", "item.gtceu.sticky_resin": "uısǝᴚ ʎʞɔıʇS", + "item.gtceu.storage_cover": "ɹǝʌoƆ ǝbɐɹoʇS", "item.gtceu.sugar_gem": "ǝqnƆ ɹɐbnS", "item.gtceu.sus_record": "ɔsıᗡ ɔısnW", "item.gtceu.sus_record.desc": "¡ʎssns", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index f79e5a97a1..7dc702a571 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1836,6 +1836,7 @@ "compass.node.gtceu.covers/robot_arm": "Robot Arm", "compass.node.gtceu.covers/shutter_module_cover": "Shutter Module Cover", "compass.node.gtceu.covers/solar_panel": "Solar Panel", + "compass.node.gtceu.covers/storage_cover": "Storage Cover", "compass.node.gtceu.ev/cracker": "Cracker", "compass.node.gtceu.ev/distillation_tower": "Distillation Tower", "compass.node.gtceu.ev/large_combustion": "Large Combustion", @@ -2265,6 +2266,7 @@ "config.gtceu.option.hardGlassRecipes": "hardGlassRecipes", "config.gtceu.option.hardIronRecipes": "hardIronRecipes", "config.gtceu.option.hardMiscRecipes": "hardMiscRecipes", + "config.gtceu.option.hardMultiRecipes": "hardMultiRecipes", "config.gtceu.option.hardRedstoneRecipes": "hardRedstoneRecipes", "config.gtceu.option.hardToolArmorRecipes": "hardToolArmorRecipes", "config.gtceu.option.hardWoodRecipes": "hardWoodRecipes", @@ -2519,6 +2521,7 @@ "cover.smart_item_filter.filtering_mode.electrolyzer": "Electrolyzer", "cover.smart_item_filter.filtering_mode.sifter": "Sifter", "cover.smart_item_filter.title": "Smart Item Filter", + "cover.storage.title": "Storage Cover", "cover.universal.manual_import_export.mode.description.0": "§eDisabled§r - Items/fluids will only move as specified by the cover and its filter. ", "cover.universal.manual_import_export.mode.description.1": "§eAllow Filtered§r - Items/fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any). ", "cover.universal.manual_import_export.mode.description.2": "§eAllow Unfiltered§r - Items/fluids can be moved independently of the cover mode. Filter applies to the items inserted or extracted by this cover", @@ -4743,6 +4746,7 @@ "item.gtceu.stem_cells": "Stem Cells", "item.gtceu.stem_cells.tooltip": "§7Raw Intelligence", "item.gtceu.sticky_resin": "Sticky Resin", + "item.gtceu.storage_cover": "Storage Cover", "item.gtceu.sugar_gem": "Sugar Cube", "item.gtceu.sus_record": "Music Disc", "item.gtceu.sus_record.desc": "sussy!", diff --git a/src/generated/resources/assets/gtceu/models/item/storage_cover.json b/src/generated/resources/assets/gtceu/models/item/storage_cover.json new file mode 100644 index 0000000000..cd96978a8d --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/storage_cover.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/storage_cover" + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 827cacf987..e7b3ef1916 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.factory.CoverUIFactory; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighLight; import com.gregtechceu.gtceu.client.renderer.cover.ICoverRenderer; @@ -180,6 +181,10 @@ public ICoverRenderer getCoverRenderer() { return coverDefinition.getCoverRenderer(); } + public @Nullable IFancyConfigurator getConfigurator() { + return null; + } + @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java index 6d258b00e3..ca6b065ce4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.*; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CombinedDirectionalFancyConfigurator; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.MachineModeFancyConfigurator; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.OverclockFancyConfigurator; @@ -19,6 +20,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; @@ -126,6 +128,15 @@ default void attachConfigurators(ConfiguratorPanel configuratorPanel) { if (this instanceof IOverclockMachine overclockMachine) { configuratorPanel.attachConfigurators(new OverclockFancyConfigurator(overclockMachine)); } + if (this instanceof MetaMachine machine) { + for (var direction : Direction.values()) { + if (machine.getCoverContainer().hasCover(direction)) { + var configurator = machine.getCoverContainer().getCoverAtSide(direction).getConfigurator(); + if (configurator != null) + configuratorPanel.attachConfigurators(configurator); + } + } + } } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/tag/TagPrefix.java b/src/main/java/com/gregtechceu/gtceu/api/tag/TagPrefix.java index f8578d1cc6..0a7f9005fc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/tag/TagPrefix.java +++ b/src/main/java/com/gregtechceu/gtceu/api/tag/TagPrefix.java @@ -719,7 +719,6 @@ public static TagPrefix get(String name) { public static final TagPrefix frameGt = new TagPrefix("frame") .defaultTagPath("frames/%s") .unformattedTagPath("frames") - .unformattedTagPath("climbable", true) .langValue("%s Frame") .materialAmount(GTValues.M * 2) .materialIconType(MaterialIconType.frameGt) diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java new file mode 100644 index 0000000000..fe999bf818 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java @@ -0,0 +1,124 @@ +package com.gregtechceu.gtceu.common.cover; + +import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.cover.IUICover; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; + +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.lowdragmc.lowdraglib.utils.LocalizationUtils; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class StorageCover extends CoverBehavior implements IUICover { + + @Persisted + @DescSynced + public final CustomItemStackHandler inventory; + private final int SIZE = 18; + + public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(StorageCover.class, + CoverBehavior.MANAGED_FIELD_HOLDER); + + public StorageCover(@NotNull CoverDefinition definition, @NotNull ICoverable coverableView, + @NotNull Direction attachedSide) { + super(definition, coverableView, attachedSide); + inventory = new CustomItemStackHandler(SIZE) { + + @Override + public int getSlotLimit(int slot) { + return 1; + } + }; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public List getAdditionalDrops() { + var list = super.getAdditionalDrops(); + for (int slot = 0; slot < SIZE; slot++) { + list.add(inventory.getStackInSlot(slot)); + } + return list; + } + + @Override + public boolean canAttach() { + for (var dir : Direction.values()) { + if (coverHolder.hasCover(dir) && coverHolder.getCoverAtSide(dir) instanceof StorageCover) + return false; + } + return super.canAttach(); + } + + @Override + public Widget createUIWidget() { + final var group = new WidgetGroup(0, 0, 126, 87); + + group.addWidget(new LabelWidget(10, 5, LocalizationUtils.format(getUITitle()))); + + for (int slot = 0; slot < SIZE; slot++) { + group.addWidget(new SlotWidget(inventory, slot, 7 + (slot % 6) * 18, 21 + (slot / 6) * 18)); + } + + return group; + } + + private String getUITitle() { + return "cover.storage.title"; + } + + @Override + public @Nullable IFancyConfigurator getConfigurator() { + return new StorageCoverConfigurator(); + } + + private class StorageCoverConfigurator implements IFancyConfigurator { + + @Override + public Component getTitle() { + return Component.translatable("cover.storage.title"); + } + + @Override + public IGuiTexture getIcon() { + return GuiTextures.MAINTENANCE_ICON; + } + + @Override + public Widget createConfigurator() { + final var group = new WidgetGroup(0, 0, 126, 87); + + for (int slot = 0; slot < SIZE; slot++) { + group.addWidget(new SlotWidget(inventory, slot, 7 + (slot % 6) * 18, 21 + (slot / 6) * 18)); + } + + return group; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/cover/GTCovers.java b/src/main/java/com/gregtechceu/gtceu/data/cover/GTCovers.java index 6726f27339..e6bee5fde2 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/cover/GTCovers.java +++ b/src/main/java/com/gregtechceu/gtceu/data/cover/GTCovers.java @@ -55,6 +55,9 @@ public class GTCovers { public final static CoverDefinition SHUTTER = register( "shutter", ShutterCover::new, new SimpleCoverRenderer(GTCEu.id("block/cover/overlay_shutter"))); + public final static CoverDefinition COVER_STORAGE = register( + "storage", StorageCover::new, + new SimpleCoverRenderer(GTCEu.id("block/cover/storage_cover"))); public final static CoverDefinition[] CONVEYORS = registerTiered( "conveyor", ConveyorCover::new, diff --git a/src/main/java/com/gregtechceu/gtceu/data/item/GTItems.java b/src/main/java/com/gregtechceu/gtceu/data/item/GTItems.java index 5616e7daba..e6051d8522 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/item/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/data/item/GTItems.java @@ -2265,6 +2265,12 @@ public Component getItemName(ItemStack stack) { .onRegister(attach(new CoverPlaceBehavior(GTCovers.COMPUTER_MONITOR))) .onRegister(compassNode(GTCompassSections.COVERS, GTCompassNodes.COVER)) .register(); + public static ItemEntry COVER_STORAGE = REGISTRATE + .item("storage_cover", ComponentItem::create) + .lang("Storage Cover") + .onRegister(compassNode(GTCompassSections.COVERS, GTCompassNodes.COVER)) + .onRegister(attach(new CoverPlaceBehavior(GTCovers.COVER_STORAGE))) + .register(); public static ItemEntry COVER_SHUTTER = REGISTRATE .item("shutter_module_cover", ComponentItem::create) .lang("Shutter Module") diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index d843ab7aca..991a0adf04 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -338,6 +338,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("cover.fluid_filter.mode.filter_drain", "Filter Drain"); provider.add("cover.fluid_filter.mode.filter_both", "Filter Fill & Drain"); provider.add("cover.item_filter.title", "Item Filter"); + provider.add("cover.storage.title", "Storage Cover"); provider.add("cover.filter.mode.filter_insert", "Filter Insert"); provider.add("cover.filter.mode.filter_extract", "Filter Extract"); provider.add("cover.filter.mode.filter_both", "Filter Insert/Extract"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java index bbfecdf721..cf3af1ba6b 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java @@ -506,14 +506,6 @@ private static void registerAssemblerRecipes(RecipeOutput provider) { .EUt(16).duration(100) .save(provider); - // TODO Crafting station, crafting cover - // ASSEMBLER_RECIPES.recipeBuilder("cover_crafting") - // .inputItems(WORKBENCH) - // .inputItems(plate, material) - // .outputItems(COVER_CRAFTING) - // .EUt(16).duration(100) - // .save(provider); - FluidStack solder = SolderingAlloy.getFluid(L / 2); ASSEMBLER_RECIPES.recipeBuilder("cover_machine_controller") @@ -626,16 +618,15 @@ private static void registerAssemblerRecipes(RecipeOutput provider) { .EUt(VA[HV]).duration(320) .save(provider); - // TODO Storage cover - // ASSEMBLER_RECIPES.recipeBuilder() - // .inputItems(OreDictNames.chestWood.toString()) - // .inputItems(ELECTRIC_PISTON_LV) - // .inputItems(plate, Iron) - // .inputFluids(SolderingAlloy.getFluid(72)) - // .outputItems(COVER_STORAGE) - // .EUt(16) - // .duration(100) - // .save(provider); + ASSEMBLER_RECIPES.recipeBuilder("cover_storage") + .inputItems(Tags.Blocks.CHESTS_WOODEN) + .inputItems(ELECTRIC_PISTON_LV) + .inputItems(plate, Iron) + .inputFluids(SolderingAlloy.getFluid(72)) + .outputItems(COVER_STORAGE) + .EUt(16) + .duration(100) + .save(provider); ASSEMBLER_RECIPES.recipeBuilder("casing_ulv").EUt(16).inputItems(plate, WroughtIron, 8) .outputItems(GTBlocks.MACHINE_CASING_ULV.asStack()).circuitMeta(8).duration(25).save(provider); diff --git a/src/main/resources/assets/gtceu/textures/block/cover/storage_cover.png b/src/main/resources/assets/gtceu/textures/block/cover/storage_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3eddc72fd27e4c697cd3f072754055e0d1affa GIT binary patch literal 821 zcmV-51Iqk~P)EX>4Tx04R}tkv&MmKpe$iQ>7{u2Rn!;W~eS&5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|?BJy6A|?JWEwqU7;J6>}?mh0_0YbING^=eK&~)2O z#G+yN)r`depGZ8*4AUmwAfDc| z4bJ<-A(od_;&b9LlP*a7$aSU8Z=7>33p_JqCKL0-A!0Gt!b%IXyr~gS5rteDHam6ANBC}yMBpW3b_hk zk6|FN3)Cu(^L^|%wG+Vq3|#3=f2j)0e3D*i zYT+ZGXB)VeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{009k2L_t(I%iWT_N&`U<$A9;=d%@(uAeI(_g=N6b%4hHi zd;`TtNMmg++S&OSc0%k#6bnIAg2*P>>~VK{YjJRx1kbcO%`nV=e#3mgpEvJ&u+!Ui z%M{%V?&`X5KDpl$P>xC3ZAOzx?OP(o6cJa0Y(~ETkj}8S;(^n26ALK134rExEPzv037a>0H{oIah*2sVWdQo0!cFf>!7tU5_47@8?TkoTn;Mts) z4@;UwJQ@u|yxZ!GjgPdoxv|tEJv=>o{2%)Qc!OZJz|Nso00000NkvXXu0mjf9g$@U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/item/storage_cover.png b/src/main/resources/assets/gtceu/textures/item/storage_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..a5726cfe95cfe3fb1f85981120c9b05ab478a6ad GIT binary patch literal 862 zcmV-k1EKthP)EX>4Tx04R}tkv&MmKpe$iQ>7{u2Rn!;W~eS&5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|?BJy6A|?JWEwqU7;J6>}?mh0_0YbING^=eK&~)2O z#G+yN)r`depGZ8*4AUmwAfDc| z4bJ<-A(od_;&b9LlP*a7$aSU8Z=7>33p_JqCKL0-A!0Gt!b%IXyr~gS5rteDHam6ANBC}yMBpW3b_hk zk6|FN3)Cu(^L^|%wG+Vq3|#3=f2j)0e3D*i zYT+ZGXB)VeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00A~hL_t(I%dL{VN&`U@g}?layBlVf5D-bVR(SxcU~8Ma zg0+<(K7!x_Sc_%)KprBcg{BWe(pb38EE_ioV-a@AlHC=>Q_b9S_~zc>!hb3V0viN@ z{f%D(==b~fFAq+q(^@mV42Q$gpw=1yr4(9gwAM@}69Ag~!Np>c8D$y_1{p91*e_mP zwDDV(Ph;?2>Jjok zqj)!KR*B#(UgI6PP`E|(mva@GD< oX+EFVas?rT6+)E4e)9jMZ{kIGMuJH$BLDyZ07*qoM6N<$f}3G()c^nh literal 0 HcmV?d00001