From b35632ef3130047073181159a528074a84a9ef74 Mon Sep 17 00:00:00 2001 From: Neeve Date: Fri, 14 Jun 2024 20:53:42 +1100 Subject: [PATCH] Add Dense & Void Gas Cells (MekEng) (#76) --- .../neeve/nae2/common/features/Features.java | 6 ++ .../subfeatures/VoidCellFeatures.java | 11 ++- .../integration/jei/JEICellCategory.java | 19 +++- .../nae2/common/items/cells/DenseGasCell.java | 25 +++++ .../items/cells/handlers/VoidCellHandler.java | 11 +-- .../nae2/common/items/cells/vc/VoidCell.java | 8 +- .../items/cells/vc/VoidCellInventory.java | 21 +--- .../common/items/cells/vc/VoidFluidCell.java | 21 ++++ .../common/items/cells/vc/VoidGasCell.java | 34 +++++++ .../common/items/cells/vc/VoidItemCell.java | 13 +++ .../recipes/handlers/DisassembleRecipe.java | 38 ++++---- .../handlers/VoidConversionRecipe.java | 60 ++++++++++++ .../registration/definitions/Items.java | 90 ++++++++++++++---- .../registration/definitions/Materials.java | 32 ++++++- .../resources/assets/nae2/lang/en_us.lang | 9 ++ .../models/item/gas_storage_cell_void.json | 6 ++ .../item/material/cell_part_gas_1024k.json | 6 ++ .../item/material/cell_part_gas_16384k.json | 6 ++ .../item/material/cell_part_gas_256k.json | 6 ++ .../item/material/cell_part_gas_4096k.json | 6 ++ .../models/item/storage_cell_gas_1024k.json | 6 ++ .../models/item/storage_cell_gas_16384k.json | 6 ++ .../models/item/storage_cell_gas_256k.json | 6 ++ .../models/item/storage_cell_gas_4096k.json | 6 ++ .../recipes/item/cell/storage_cell_void.json | 35 +++++++ .../item/cell/storage_cell_gas_1024k.png | Bin 0 -> 519 bytes .../item/cell/storage_cell_gas_16384k.png | Bin 0 -> 524 bytes .../item/cell/storage_cell_gas_256k.png | Bin 0 -> 508 bytes .../item/cell/storage_cell_gas_4096k.png | Bin 0 -> 532 bytes .../item/cell/storage_cell_gas_void.png | Bin 0 -> 1554 bytes .../item/material/cell_part_gas_1024k.png | Bin 0 -> 474 bytes .../item/material/cell_part_gas_16384k.png | Bin 0 -> 554 bytes .../item/material/cell_part_gas_256k.png | Bin 0 -> 474 bytes .../item/material/cell_part_gas_4096k.png | Bin 0 -> 514 bytes 34 files changed, 419 insertions(+), 68 deletions(-) create mode 100644 src/main/java/co/neeve/nae2/common/items/cells/DenseGasCell.java create mode 100644 src/main/java/co/neeve/nae2/common/items/cells/vc/VoidGasCell.java create mode 100644 src/main/java/co/neeve/nae2/common/recipes/handlers/VoidConversionRecipe.java create mode 100644 src/main/resources/assets/nae2/models/item/gas_storage_cell_void.json create mode 100644 src/main/resources/assets/nae2/models/item/material/cell_part_gas_1024k.json create mode 100644 src/main/resources/assets/nae2/models/item/material/cell_part_gas_16384k.json create mode 100644 src/main/resources/assets/nae2/models/item/material/cell_part_gas_256k.json create mode 100644 src/main/resources/assets/nae2/models/item/material/cell_part_gas_4096k.json create mode 100644 src/main/resources/assets/nae2/models/item/storage_cell_gas_1024k.json create mode 100644 src/main/resources/assets/nae2/models/item/storage_cell_gas_16384k.json create mode 100644 src/main/resources/assets/nae2/models/item/storage_cell_gas_256k.json create mode 100644 src/main/resources/assets/nae2/models/item/storage_cell_gas_4096k.json create mode 100644 src/main/resources/assets/nae2/recipes/item/cell/storage_cell_void.json create mode 100644 src/main/resources/assets/nae2/textures/item/cell/storage_cell_gas_1024k.png create mode 100644 src/main/resources/assets/nae2/textures/item/cell/storage_cell_gas_16384k.png create mode 100644 src/main/resources/assets/nae2/textures/item/cell/storage_cell_gas_256k.png create mode 100644 src/main/resources/assets/nae2/textures/item/cell/storage_cell_gas_4096k.png create mode 100644 src/main/resources/assets/nae2/textures/item/cell/storage_cell_gas_void.png create mode 100644 src/main/resources/assets/nae2/textures/item/material/cell_part_gas_1024k.png create mode 100644 src/main/resources/assets/nae2/textures/item/material/cell_part_gas_16384k.png create mode 100644 src/main/resources/assets/nae2/textures/item/material/cell_part_gas_256k.png create mode 100644 src/main/resources/assets/nae2/textures/item/material/cell_part_gas_4096k.png diff --git a/src/main/java/co/neeve/nae2/common/features/Features.java b/src/main/java/co/neeve/nae2/common/features/Features.java index 63956e1..cacb8db 100644 --- a/src/main/java/co/neeve/nae2/common/features/Features.java +++ b/src/main/java/co/neeve/nae2/common/features/Features.java @@ -33,6 +33,12 @@ public boolean isEnabled() { } }, DENSE_CELLS(EnumSet.allOf(DenseCellFeatures.class)), + DENSE_GAS_CELLS() { + @Override + public boolean isEnabled() { + return Platform.isModLoaded("mekeng") && super.isEnabled(); + } + }, DENSE_CPU_COPROCESSORS("dense.coprocessor"), DENSE_FLUID_CELLS(), EXPOSER(), diff --git a/src/main/java/co/neeve/nae2/common/features/subfeatures/VoidCellFeatures.java b/src/main/java/co/neeve/nae2/common/features/subfeatures/VoidCellFeatures.java index 0a58217..5161563 100644 --- a/src/main/java/co/neeve/nae2/common/features/subfeatures/VoidCellFeatures.java +++ b/src/main/java/co/neeve/nae2/common/features/subfeatures/VoidCellFeatures.java @@ -3,7 +3,12 @@ import org.jetbrains.annotations.Nullable; public enum VoidCellFeatures implements ISubFeature { - CONDENSER_POWER("Enable Matter Condenser power", "void.condenser"); + CONDENSER_POWER("Enable Matter Condenser power", "void.condenser"), + CONVERSION_RECIPES( + """ + Enable conversion recipes. Useful if you want to add custom recipes. + HOWEVER, disassembling the Cells will still pop out a Void Component and a Housing! + You might want to disable disassembling as a feature in the AE2 config, which Void Cells respect."""); private final String description; private final String mixins; @@ -14,6 +19,10 @@ public enum VoidCellFeatures implements ISubFeature { this.mixins = mixins; } + VoidCellFeatures(String description) { + this(description, null); + } + public String getDescription() { return this.description; } diff --git a/src/main/java/co/neeve/nae2/common/integration/jei/JEICellCategory.java b/src/main/java/co/neeve/nae2/common/integration/jei/JEICellCategory.java index 89c0aa2..8bd32e7 100644 --- a/src/main/java/co/neeve/nae2/common/integration/jei/JEICellCategory.java +++ b/src/main/java/co/neeve/nae2/common/integration/jei/JEICellCategory.java @@ -11,10 +11,12 @@ import appeng.api.storage.data.IItemList; import appeng.client.render.StackSizeRenderer; import appeng.fluids.client.render.FluidStackSizeRenderer; +import appeng.util.Platform; import appeng.util.item.AEItemStack; import co.neeve.nae2.Tags; import com.github.bsideup.jabel.Desugar; import com.google.common.collect.ImmutableList; +import com.mekeng.github.common.me.storage.IGasStorageChannel; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import mezz.jei.Internal; @@ -81,6 +83,8 @@ private static String getStorageChannelUnits(IStorageChannel storageChannel) return "items"; } else if (storageChannel instanceof IFluidStorageChannel) { return "buckets"; + } else if (Platform.isModLoaded("mekeng") && storageChannel instanceof IGasStorageChannel) { + return "buckets"; } else { return "units"; } @@ -187,7 +191,8 @@ public void drawExtras(@NotNull Minecraft minecraft) { var format = NumberFormat.getInstance(); var storedItemCount = this.cellInfo.cellInv.getStoredItemCount(); - var transferFactor = this.cellInfo.channel().transferFactor(); + var transferFactor = this.getTransferFactor(); + var capacity = (this.cellInfo.cellInv.getRemainingItemCount() + storedItemCount) / transferFactor; var byteLoss = this.cellInfo.cellInv.getBytesPerType() * this.cellInfo.cellInv.getStoredItemTypes(); var capacityLoss = byteLoss * this.cellInfo.channel.getUnitsPerByte() / transferFactor; @@ -211,6 +216,16 @@ public void drawExtras(@NotNull Minecraft minecraft) { } } + private int getTransferFactor() { + final int transferFactor; + if (Platform.isModLoaded("mekeng") && this.cellInfo.channel instanceof IGasStorageChannel) { + transferFactor = 1000; + } else { + transferFactor = this.cellInfo.channel().transferFactor(); + } + return transferFactor; + } + @Override public @NotNull List getTooltipStrings(int mouseX, int mouseY) { if (this.cellInfo != null && mouseX > 0 && mouseY > 0 && mouseX < WIDTH && mouseY < TOTAL_HEIGHT - GRID_HEIGHT - 2) { @@ -243,7 +258,7 @@ private ITooltipCallback getCallBack(CellInfo> cell var unitName = I18n.format("nae2.jei.cellview." + getStorageChannelUnits(cellInfo.channel())); tooltip.add(I18n.format("nae2.jei.cellview.hover.stored", - format.format(stackSize / (double) this.cellInfo.channel.transferFactor()), unitName)); + format.format(stackSize / (double) this.getTransferFactor()), unitName)); tooltip.add(I18n.format("nae2.jei.cellview.used", format.format(cellInfo.cellInv().getBytesPerType() + Math.ceil(stackSize / (double) cellInfo.channel().getUnitsPerByte())))); } diff --git a/src/main/java/co/neeve/nae2/common/items/cells/DenseGasCell.java b/src/main/java/co/neeve/nae2/common/items/cells/DenseGasCell.java new file mode 100644 index 0000000..37c3b35 --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/items/cells/DenseGasCell.java @@ -0,0 +1,25 @@ +package co.neeve.nae2.common.items.cells; + +import appeng.core.Api; +import co.neeve.nae2.common.registration.definitions.Materials; +import com.mekeng.github.common.me.data.IAEGasStack; +import com.mekeng.github.common.me.storage.IGasStorageChannel; +import net.minecraft.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class DenseGasCell extends DenseCell { + public DenseGasCell(Materials.MaterialType whichCell, int kilobytes) { + super(whichCell, kilobytes); + } + + @NotNull + @Override + public IGasStorageChannel getChannel() { + return Api.INSTANCE.storage().getStorageChannel(IGasStorageChannel.class); + } + + @Override + public int getTotalTypes(@NotNull ItemStack cellItem) { + return 15; + } +} diff --git a/src/main/java/co/neeve/nae2/common/items/cells/handlers/VoidCellHandler.java b/src/main/java/co/neeve/nae2/common/items/cells/handlers/VoidCellHandler.java index a74095d..6791b96 100644 --- a/src/main/java/co/neeve/nae2/common/items/cells/handlers/VoidCellHandler.java +++ b/src/main/java/co/neeve/nae2/common/items/cells/handlers/VoidCellHandler.java @@ -3,14 +3,10 @@ import appeng.api.storage.ICellInventoryHandler; import appeng.api.storage.ISaveProvider; import appeng.api.storage.IStorageChannel; -import appeng.api.storage.channels.IFluidStorageChannel; -import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEStack; import co.neeve.nae2.common.interfaces.IVoidingCellHandler; import co.neeve.nae2.common.items.cells.vc.VoidCell; import co.neeve.nae2.common.items.cells.vc.VoidCellInventory; -import co.neeve.nae2.common.items.cells.vc.VoidFluidCell; -import co.neeve.nae2.common.items.cells.vc.VoidItemCell; import net.minecraft.item.ItemStack; public final class VoidCellHandler implements IVoidingCellHandler { @@ -26,11 +22,8 @@ public boolean isCell(ItemStack is) { public > ICellInventoryHandler getCellInventory(ItemStack itemStack, ISaveProvider iSaveProvider, IStorageChannel iStorageChannel) { - return !itemStack.isEmpty() - && ( - (itemStack.getItem() instanceof VoidItemCell && iStorageChannel instanceof IItemStorageChannel) - || (itemStack.getItem() instanceof VoidFluidCell && iStorageChannel instanceof IFluidStorageChannel) - ) ? new VoidCellInventory<>(itemStack, iSaveProvider) : null; + return this.isCell(itemStack) && ((VoidCell) itemStack.getItem()).getStorageChannel() == iStorageChannel + ? new VoidCellInventory<>(itemStack, iSaveProvider) : null; } @Override diff --git a/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidCell.java b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidCell.java index 7cdfa43..5428d9c 100644 --- a/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidCell.java +++ b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidCell.java @@ -30,6 +30,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.text.NumberFormat; import java.util.List; @@ -53,7 +54,7 @@ public CellUpgrades getUpgradesInventory(ItemStack is) { @Override public IItemHandler getConfigInventory(ItemStack is) { - return this.getCellInventory(is).getCellConfig(); + return this.getCellConfig(is); } public VoidCellInventory getCellInventory(ItemStack stack) { @@ -208,4 +209,9 @@ protected IncludeExclude getIncludeExcludeMode(ItemStack itemStack) { protected boolean isFuzzy(ItemStack itemStack) { return this.getCellInventory(itemStack).isFuzzy(); } + + public abstract CellConfig getCellConfig(ItemStack o); + + @Nullable + public abstract T handleConfigStack(ItemStack stack); } diff --git a/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidCellInventory.java b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidCellInventory.java index 33d97af..2546e19 100644 --- a/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidCellInventory.java +++ b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidCellInventory.java @@ -9,12 +9,8 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IItemList; -import appeng.fluids.helper.FluidCellConfig; -import appeng.fluids.items.FluidDummyItem; -import appeng.fluids.util.AEFluidStack; import appeng.items.contents.CellConfig; import appeng.util.Platform; -import appeng.util.item.AEItemStack; import co.neeve.nae2.common.features.subfeatures.VoidCellFeatures; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -40,13 +36,12 @@ public VoidCellInventory(ItemStack o, ISaveProvider iSaveProvider) { this.itemListCache = this.getChannel().createList(); this.saveProvider = iSaveProvider; - this.cellConfig = this.isFluid() ? new FluidCellConfig(o) : new CellConfig(o); + this.cellConfig = this.item.getCellConfig(o); for (final var is : this.cellConfig) { if (!is.isEmpty()) { - if (this.isFluid() && is.getItem() instanceof FluidDummyItem fdi) { - this.itemListCache.add((T) AEFluidStack.fromFluidStack(fdi.getFluidStack(is))); - } else if (!this.isFluid()) { - this.itemListCache.add((T) AEItemStack.fromItemStack(is)); + var aeStack = this.item.handleConfigStack(is); + if (aeStack != null) { + this.itemListCache.add(aeStack); } } } @@ -70,10 +65,6 @@ public VoidCellInventory(ItemStack o, ISaveProvider iSaveProvider) { } } - public CellConfig getCellConfig() { - return this.cellConfig; - } - @Override public T injectItems(T input, Actionable mode, IActionSource src) { if (!this.isValidInput(input)) return input; @@ -112,10 +103,6 @@ public IStorageChannel getChannel() { return this.channel; } - private boolean isFluid() { - return this.itemStack.getItem() instanceof VoidFluidCell; - } - @Override public AccessRestriction getAccess() { return AccessRestriction.WRITE; diff --git a/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidFluidCell.java b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidFluidCell.java index 57c66c5..342a704 100644 --- a/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidFluidCell.java +++ b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidFluidCell.java @@ -4,10 +4,31 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; +import appeng.fluids.helper.FluidCellConfig; +import appeng.fluids.items.FluidDummyItem; +import appeng.fluids.util.AEFluidStack; +import appeng.items.contents.CellConfig; +import net.minecraft.item.ItemStack; +import org.jetbrains.annotations.Nullable; public class VoidFluidCell extends VoidCell { @Override public IStorageChannel getStorageChannel() { return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); } + + @Override + public CellConfig getCellConfig(ItemStack o) { + return new FluidCellConfig(o); + } + + @Override + @Nullable + public IAEFluidStack handleConfigStack(ItemStack stack) { + if (stack.getItem() instanceof FluidDummyItem fdi) { + return AEFluidStack.fromFluidStack(fdi.getFluidStack(stack)); + } + + return null; + } } diff --git a/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidGasCell.java b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidGasCell.java new file mode 100644 index 0000000..c3a192a --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidGasCell.java @@ -0,0 +1,34 @@ +package co.neeve.nae2.common.items.cells.vc; + +import appeng.api.AEApi; +import appeng.api.storage.IStorageChannel; +import appeng.items.contents.CellConfig; +import com.mekeng.github.common.item.ItemDummyGas; +import com.mekeng.github.common.me.data.IAEGasStack; +import com.mekeng.github.common.me.data.impl.AEGasStack; +import com.mekeng.github.common.me.storage.IGasStorageChannel; +import com.mekeng.github.util.helpers.GasCellConfig; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nullable; + +public class VoidGasCell extends VoidCell { + @Override + public IStorageChannel getStorageChannel() { + return AEApi.instance().storage().getStorageChannel(IGasStorageChannel.class); + } + + @Override + public CellConfig getCellConfig(ItemStack o) { + return new GasCellConfig(o); + } + + @Override + @Nullable + public IAEGasStack handleConfigStack(ItemStack stack) { + if (stack.getItem() instanceof ItemDummyGas gasItem) { + return AEGasStack.of(gasItem.getGasStack(stack)); + } + return null; + } +} diff --git a/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidItemCell.java b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidItemCell.java index dd4cc4e..ae0fb3f 100644 --- a/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidItemCell.java +++ b/src/main/java/co/neeve/nae2/common/items/cells/vc/VoidItemCell.java @@ -4,10 +4,23 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; +import appeng.items.contents.CellConfig; +import appeng.util.item.AEItemStack; +import net.minecraft.item.ItemStack; public class VoidItemCell extends VoidCell { @Override public IStorageChannel getStorageChannel() { return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class); } + + @Override + public CellConfig getCellConfig(ItemStack o) { + return new CellConfig(o); + } + + @Override + public IAEItemStack handleConfigStack(ItemStack stack) { + return AEItemStack.fromItemStack(stack); + } } diff --git a/src/main/java/co/neeve/nae2/common/recipes/handlers/DisassembleRecipe.java b/src/main/java/co/neeve/nae2/common/recipes/handlers/DisassembleRecipe.java index 8fb801d..0581203 100644 --- a/src/main/java/co/neeve/nae2/common/recipes/handlers/DisassembleRecipe.java +++ b/src/main/java/co/neeve/nae2/common/recipes/handlers/DisassembleRecipe.java @@ -2,10 +2,10 @@ import appeng.api.AEApi; import appeng.api.definitions.IItemDefinition; -import appeng.api.storage.IMEInventory; -import appeng.api.storage.channels.IItemStorageChannel; -import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IAEStack; +import appeng.api.storage.data.IItemList; import co.neeve.nae2.NAE2; +import co.neeve.nae2.common.items.cells.vc.VoidCell; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; @@ -33,8 +33,6 @@ public DisassembleRecipe() { this.cellMappings = new HashMap<>(6); this.nonCellMappings = new HashMap<>(4); - this.cellMappings.put(items.storageCellVoid(), mats.cellPartVoid()); - this.cellMappings.put(items.fluidStorageCellVoid(), mats.cellPartVoid()); this.cellMappings.put(items.storageCell256K(), mats.cellPart256K()); this.cellMappings.put(items.storageCell1024K(), mats.cellPart1024K()); this.cellMappings.put(items.storageCell4096K(), mats.cellPart4096K()); @@ -49,6 +47,21 @@ public DisassembleRecipe() { this.nonCellMappings.put(blocks.storageCrafting4096K(), mats.cellPart4096K()); this.nonCellMappings.put(blocks.storageCrafting16384K(), mats.cellPart16384K()); } + + @SuppressWarnings("unchecked") + private static > IItemList getStorageList(final ItemStack stack) { + var item = (VoidCell) stack.getItem(); + var channel = item.getStorageChannel(); + + // make sure the storage cell is empty... + var cellInv = AEApi.instance() + .registries() + .cell() + .getCellInventory(stack, null, channel); + + assert cellInv != null; + return cellInv.getAvailableItems(channel.createList()); + } @Override public boolean matches(final @NotNull InventoryCrafting inv, final @NotNull World w) { @@ -73,18 +86,9 @@ private ItemStack getOutput(final IInventory inventory) { var maybeCellOutput = this.getCellOutput(stackInSlot); if (maybeCellOutput.isPresent()) { var storageCellStack = maybeCellOutput.get(); - // make sure the storage cell stackInSlot empty... - final IMEInventory cellInv = AEApi.instance() - .registries() - .cell() - .getCellInventory(stackInSlot, null, - AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)); - if (cellInv != null) { - final var list = cellInv - .getAvailableItems(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList()); - if (!list.isEmpty()) { - return ItemStack.EMPTY; - } + var storageList = getStorageList(storageCellStack); + if (storageList.isEmpty()) { + return MISMATCHED_STACK; } output = storageCellStack; diff --git a/src/main/java/co/neeve/nae2/common/recipes/handlers/VoidConversionRecipe.java b/src/main/java/co/neeve/nae2/common/recipes/handlers/VoidConversionRecipe.java new file mode 100644 index 0000000..93f1faa --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/recipes/handlers/VoidConversionRecipe.java @@ -0,0 +1,60 @@ +package co.neeve.nae2.common.recipes.handlers; + +import co.neeve.nae2.common.items.cells.vc.VoidCell; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.util.NonNullList; +import net.minecraft.world.World; +import org.jetbrains.annotations.NotNull; + +public class VoidConversionRecipe extends ShapelessRecipes { + private final ItemStack from; + private final ItemStack to; + + public VoidConversionRecipe(ItemStack from, ItemStack to) { + super("", to, NonNullList.create()); + this.getIngredients().add(Ingredient.fromStacks(from)); + this.from = from; + this.to = to; + } + + @Override + public boolean matches(@NotNull InventoryCrafting inv, @NotNull World worldIn) { + return !this.getOutput(inv).isEmpty(); + } + + @Override + public @NotNull ItemStack getCraftingResult(@NotNull InventoryCrafting inv) { + return this.getOutput(inv); + } + + public ItemStack getOutput(InventoryCrafting inv) { + var output = ItemStack.EMPTY; + for (var i = 0; i < inv.getSizeInventory(); i++) { + var stack = inv.getStackInSlot(i); + if (stack.isEmpty()) { + continue; + } + + if (stack.isItemEqual(this.from)) { + output = this.to.copy(); + // Copy power over. + ((VoidCell) output.getItem()) + .setCondenserPower(output, ((VoidCell) stack.getItem()).getCondenserPower(stack)); + continue; + } + + if (!output.isEmpty()) { + return ItemStack.EMPTY; + } + } + return output; + } + + @Override + public @NotNull NonNullList getRemainingItems(@NotNull InventoryCrafting inv) { + return NonNullList.withSize(inv.getSizeInventory(), ItemStack.EMPTY); + } +} diff --git a/src/main/java/co/neeve/nae2/common/registration/definitions/Items.java b/src/main/java/co/neeve/nae2/common/registration/definitions/Items.java index 53215c2..2f17ef6 100644 --- a/src/main/java/co/neeve/nae2/common/registration/definitions/Items.java +++ b/src/main/java/co/neeve/nae2/common/registration/definitions/Items.java @@ -8,22 +8,26 @@ import appeng.bootstrap.components.IPostInitComponent; import appeng.bootstrap.components.IRecipeRegistrationComponent; import appeng.core.features.ItemDefinition; -import co.neeve.nae2.NAE2; +import co.neeve.nae2.Tags; import co.neeve.nae2.client.gui.PatternMultiToolButtonHandler; import co.neeve.nae2.common.features.Features; import co.neeve.nae2.common.features.subfeatures.VoidCellFeatures; import co.neeve.nae2.common.items.VirtualPattern; import co.neeve.nae2.common.items.WirelessTerminalUniversal; import co.neeve.nae2.common.items.cells.DenseFluidCell; +import co.neeve.nae2.common.items.cells.DenseGasCell; import co.neeve.nae2.common.items.cells.DenseItemCell; import co.neeve.nae2.common.items.cells.handlers.VoidCellHandler; import co.neeve.nae2.common.items.cells.vc.VoidFluidCell; +import co.neeve.nae2.common.items.cells.vc.VoidGasCell; import co.neeve.nae2.common.items.cells.vc.VoidItemCell; import co.neeve.nae2.common.items.patternmultitool.ToolPatternMultiTool; -import co.neeve.nae2.common.recipes.handlers.VoidCellRecipe; +import co.neeve.nae2.common.recipes.handlers.VoidConversionRecipe; import co.neeve.nae2.common.registration.registry.Registry; import co.neeve.nae2.common.registration.registry.interfaces.Definitions; import co.neeve.nae2.common.registration.registry.rendering.NoItemRendering; +import com.mekeng.github.common.ItemAndBlocks; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.item.ItemStack; import net.minecraftforge.common.MinecraftForge; @@ -31,6 +35,8 @@ import java.util.Arrays; import java.util.Map; import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; @SuppressWarnings("unused") public class Items implements Definitions { @@ -40,6 +46,7 @@ public class Items implements Definitions { private final IItemDefinition storageCellVoid; private final IItemDefinition fluidStorageCellVoid; + private final IItemDefinition gasStorageCellVoid; private final IItemDefinition storageCell256K; private final IItemDefinition storageCell1024K; private final IItemDefinition storageCell4096K; @@ -48,6 +55,10 @@ public class Items implements Definitions { private final IItemDefinition storageCellFluid1024K; private final IItemDefinition storageCellFluid4096K; private final IItemDefinition storageCellFluid16384K; + private final IItemDefinition storageCellGas256K; + private final IItemDefinition storageCellGas1024K; + private final IItemDefinition storageCellGas4096K; + private final IItemDefinition storageCellGas16384K; private final IItemDefinition virtualPattern; private final IItemDefinition universalWirelessTerminal; @@ -65,36 +76,53 @@ public Items(Registry registry) { if (r.isClient()) { MinecraftForge.EVENT_BUS.register(new PatternMultiToolButtonHandler()); } - - // Void Cells. - }) .build()); - this.storageCellVoid = this.registerById(registry.item("storage_cell_void", VoidItemCell::new) - .features(Features.VOID_CELLS) - .build()); + // Void Cells. + this.storageCellVoid = this.registerById( + registry.item("storage_cell_void", VoidItemCell::new) + .features(Features.VOID_CELLS) + .build()); this.fluidStorageCellVoid = this.registerById( registry.item("fluid_storage_cell_void", VoidFluidCell::new) .features(Features.VOID_CELLS) .build()); + this.gasStorageCellVoid = this.registerById( + registry.item("gas_storage_cell_void", VoidGasCell::new) + .features(Features.VOID_CELLS, Features.DENSE_GAS_CELLS) + .build()); + + var voidCells = new Object2ObjectArrayMap(); + if (this.storageCellVoid.isEnabled()) voidCells.put("item", this.storageCellVoid); + if (this.fluidStorageCellVoid.isEnabled()) voidCells.put("fluid", this.fluidStorageCellVoid); + if (this.gasStorageCellVoid.isEnabled()) voidCells.put("gas", this.gasStorageCellVoid); + registry.addBootstrapComponent((IPostInitComponent) r -> { - if (this.storageCellVoid.isEnabled() || this.fluidStorageCellVoid.isEnabled()) { + if (!voidCells.isEmpty()) { AEApi.instance().registries().cell().addCellHandler(new VoidCellHandler()); } }); - registry.addBootstrapComponent((IRecipeRegistrationComponent) (side, r) -> NAE2.definitions().materials().cellPartVoid().maybeStack( - 1).ifPresent(voidComponent -> - AEApi.instance().definitions().materials().emptyStorageCell().maybeStack(1).ifPresent(stack -> { - this.storageCellVoid.maybeStack(1).ifPresent((itemStack -> r.register(new VoidCellRecipe( - stack, voidComponent, itemStack).setRegistryName("storage_cell_void")))); - - this.fluidStorageCellVoid.maybeStack(1).ifPresent((itemStack -> r.register(new VoidCellRecipe( - voidComponent, stack, itemStack).setRegistryName("fluid_storage_cell_void")))); - }))); + registry.addBootstrapComponent((IRecipeRegistrationComponent) (side, r) -> { + if (!VoidCellFeatures.CONVERSION_RECIPES.isEnabled()) return; + + // Register circular conversion. + if (voidCells.size() > 1) { + var entrySet = voidCells.entrySet().stream().collect(Collectors.toList()); + for (var i = 0; i < entrySet.size(); i++) { + var from = entrySet.get(i); + var to = entrySet.get((i + 1) % voidCells.size()); + from.getValue().maybeStack(1).ifPresent(fromStack -> + to.getValue().maybeStack(1).ifPresent(toStack -> + r.register(new VoidConversionRecipe(fromStack, toStack) + .setRegistryName(Tags.MODID, "void_conversion_" + + from.getKey() + "_to_" + to.getKey())))); + } + } + }); this.storageCell256K = this.registerById(registry.item("storage_cell_256k", () -> new DenseItemCell(Materials.MaterialType.CELL_PART_256K, @@ -198,15 +226,25 @@ public Items(Registry registry) { this.fluidStorageCellVoid }); } + + if (Features.DENSE_GAS_CELLS.isEnabled()) { + mirrorCellUpgrades(new ItemStack(ItemAndBlocks.GAS_CELL_1k), new IItemDefinition[]{ + this.storageCellGas256K, + this.storageCellGas1024K, + this.storageCellGas4096K, + this.storageCellGas16384K, + this.storageCellVoid + }); + } }); } - private static void mirrorCellUpgrades(IItemDefinition cellDef, IItemDefinition[] cells) { + private static void mirrorCellUpgrades(Function predicate, IItemDefinition[] cells) { var supported = new java.util.HashMap(); Arrays.stream(Upgrades.values()) .forEach(upgrade -> upgrade.getSupported().entrySet().stream() - .filter(x -> cellDef.isSameAs(x.getKey())) + .filter(x -> predicate.apply(x.getKey())) .map(Map.Entry::getValue) .findFirst() .ifPresent(value -> supported.put(upgrade, value))); @@ -216,6 +254,14 @@ private static void mirrorCellUpgrades(IItemDefinition cellDef, IItemDefinition[ key.registerItem(iItemDefinition, value))); } + private static void mirrorCellUpgrades(IItemDefinition cellDef, IItemDefinition[] cells) { + mirrorCellUpgrades(cellDef::isSameAs, cells); + } + + private static void mirrorCellUpgrades(ItemStack itemStack, IItemDefinition[] cells) { + mirrorCellUpgrades(itemStack::isItemEqual, cells); + } + private IItemDefinition registerById(ItemDefinition item) { this.byId.put(item.identifier(), item); return item; @@ -238,6 +284,10 @@ public IItemDefinition fluidStorageCellVoid() { return this.fluidStorageCellVoid; } + public IItemDefinition gasStorageCellVoid() { + return this.gasStorageCellVoid; + } + public IItemDefinition virtualPattern() { return this.virtualPattern; } diff --git a/src/main/java/co/neeve/nae2/common/registration/definitions/Materials.java b/src/main/java/co/neeve/nae2/common/registration/definitions/Materials.java index f1a8cb2..ce5c97f 100644 --- a/src/main/java/co/neeve/nae2/common/registration/definitions/Materials.java +++ b/src/main/java/co/neeve/nae2/common/registration/definitions/Materials.java @@ -37,6 +37,11 @@ public class Materials implements DamagedDefinitions cachedValues; private final String id; diff --git a/src/main/resources/assets/nae2/lang/en_us.lang b/src/main/resources/assets/nae2/lang/en_us.lang index dfdba10..f265bfa 100644 --- a/src/main/resources/assets/nae2/lang/en_us.lang +++ b/src/main/resources/assets/nae2/lang/en_us.lang @@ -11,6 +11,7 @@ item.nae2.universal_wireless_terminal.name=Universal Wireless Terminal # Cells item.nae2.storage_cell_void.name=ME Void Storage Cell item.nae2.fluid_storage_cell_void.name=ME Fluid Void Storage Cell +item.nae2.gas_storage_cell_void.name=ME Gas Void Storage Cell item.nae2.storage_cell_256k.name=§c256k§r ME Storage Cell item.nae2.storage_cell_1024k.name=§61024k§r ME Storage Cell item.nae2.storage_cell_4096k.name=§e4096k§r ME Storage Cell @@ -19,6 +20,10 @@ item.nae2.storage_cell_fluid_256k.name=§c256k§r ME Fluid Storage Cell item.nae2.storage_cell_fluid_1024k.name=§61024k§r ME Fluid Storage Cell item.nae2.storage_cell_fluid_4096k.name=§e4096k§r ME Fluid Storage Cell item.nae2.storage_cell_fluid_16384k.name=§a16384k§r ME Fluid Storage Cell +item.nae2.storage_cell_gas_256k.name=§c256k§r ME Gas Storage Cell +item.nae2.storage_cell_gas_1024k.name=§61024k§r ME Gas Storage Cell +item.nae2.storage_cell_gas_4096k.name=§e4096k§r ME Gas Storage Cell +item.nae2.storage_cell_gas_16384k.name=§a16384k§r ME Gas Storage Cell # Materials item.nae2.material.cell_part_void.name=ME Void Storage Component @@ -30,6 +35,10 @@ item.nae2.material.cell_part_fluid_256k.name=§c256k§r ME Fluid Storage Compone item.nae2.material.cell_part_fluid_1024k.name=§61024k§r ME Fluid Storage Component item.nae2.material.cell_part_fluid_4096k.name=§e4096k§r ME Fluid Storage Component item.nae2.material.cell_part_fluid_16384k.name=§a16384k§r ME Fluid Storage Component +item.nae2.material.cell_part_gas_256k.name=§c256k§r ME Gas Storage Component +item.nae2.material.cell_part_gas_1024k.name=§61024k§r ME Gas Storage Component +item.nae2.material.cell_part_gas_4096k.name=§e4096k§r ME Gas Storage Component +item.nae2.material.cell_part_gas_16384k.name=§a16384k§r ME Gas Storage Component # Parts item.nae2.part.beam_former.name=ME Beam Former diff --git a/src/main/resources/assets/nae2/models/item/gas_storage_cell_void.json b/src/main/resources/assets/nae2/models/item/gas_storage_cell_void.json new file mode 100644 index 0000000..5dc670b --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/gas_storage_cell_void.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/cell/storage_cell_gas_void" + } +} diff --git a/src/main/resources/assets/nae2/models/item/material/cell_part_gas_1024k.json b/src/main/resources/assets/nae2/models/item/material/cell_part_gas_1024k.json new file mode 100644 index 0000000..d211d86 --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/material/cell_part_gas_1024k.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/material/cell_part_gas_1024k" + } +} diff --git a/src/main/resources/assets/nae2/models/item/material/cell_part_gas_16384k.json b/src/main/resources/assets/nae2/models/item/material/cell_part_gas_16384k.json new file mode 100644 index 0000000..7fc3dc3 --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/material/cell_part_gas_16384k.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/material/cell_part_gas_16384k" + } +} diff --git a/src/main/resources/assets/nae2/models/item/material/cell_part_gas_256k.json b/src/main/resources/assets/nae2/models/item/material/cell_part_gas_256k.json new file mode 100644 index 0000000..2a79cce --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/material/cell_part_gas_256k.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/material/cell_part_gas_256k" + } +} diff --git a/src/main/resources/assets/nae2/models/item/material/cell_part_gas_4096k.json b/src/main/resources/assets/nae2/models/item/material/cell_part_gas_4096k.json new file mode 100644 index 0000000..2e1d88c --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/material/cell_part_gas_4096k.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/material/cell_part_gas_4096k" + } +} diff --git a/src/main/resources/assets/nae2/models/item/storage_cell_gas_1024k.json b/src/main/resources/assets/nae2/models/item/storage_cell_gas_1024k.json new file mode 100644 index 0000000..3cba09d --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/storage_cell_gas_1024k.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/cell/storage_cell_gas_1024k" + } +} diff --git a/src/main/resources/assets/nae2/models/item/storage_cell_gas_16384k.json b/src/main/resources/assets/nae2/models/item/storage_cell_gas_16384k.json new file mode 100644 index 0000000..5505619 --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/storage_cell_gas_16384k.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/cell/storage_cell_gas_16384k" + } +} diff --git a/src/main/resources/assets/nae2/models/item/storage_cell_gas_256k.json b/src/main/resources/assets/nae2/models/item/storage_cell_gas_256k.json new file mode 100644 index 0000000..7528c5f --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/storage_cell_gas_256k.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/cell/storage_cell_gas_256k" + } +} diff --git a/src/main/resources/assets/nae2/models/item/storage_cell_gas_4096k.json b/src/main/resources/assets/nae2/models/item/storage_cell_gas_4096k.json new file mode 100644 index 0000000..55ba13c --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/storage_cell_gas_4096k.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/cell/storage_cell_gas_4096k" + } +} diff --git a/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_void.json b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_void.json new file mode 100644 index 0000000..48d854f --- /dev/null +++ b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_void.json @@ -0,0 +1,35 @@ +{ + "conditions": [ + { + "type": "forge:and", + "values": [ + { + "type": "minecraft:item_exists", + "item": "nae2:storage_cell_256k" + }, + { + "type": "appliedenergistics2:material_exists", + "material": "material.empty_storage_cell" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_void" + } + ] + } + ], + "result": { + "item": "nae2:storage_cell_void" + }, + "type": "forge:ore_shapeless", + "ingredients": [ + { + "type": "appliedenergistics2:part", + "part": "material.empty_storage_cell" + }, + { + "type": "nae2:material", + "name": "cell_part_void" + } + ] +} diff --git a/src/main/resources/assets/nae2/textures/item/cell/storage_cell_gas_1024k.png b/src/main/resources/assets/nae2/textures/item/cell/storage_cell_gas_1024k.png new file mode 100644 index 0000000000000000000000000000000000000000..06193d386c1d7596bb843f10d2d61bf5fc0d72d8 GIT binary patch literal 519 zcmV+i0{H!jP)Lld((OP#niUITP+#q}EopRf(}m~D#cTDV=El4N$7c*ESD_oQK_ZJJS`ql{rP1%XI|G)KW<;hWn!c3|C43d|!|IVjZBZ$JnNz*%X+O&w~j8 zQLJEq&Y=RoopCYxbOWv4L-IJ4{1iZ}Bx$l8y+GBY)pG(+6Rm^nj^!ntQ}}fNLxcHU zy#UJTL6)-SoQt;8h961XpMI9fxA5;oJ%>H`+JmhGmRz(;SF`RQheqJ`9gx7^KPlLO z-E_^8d+s7#nhNmFLDoiq0oV&+KkdJFulW})N{#^!_*4L9`43N%pH8l3Y{viq002ov JPDHLkV1iGB>K_0A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/nae2/textures/item/cell/storage_cell_gas_16384k.png b/src/main/resources/assets/nae2/textures/item/cell/storage_cell_gas_16384k.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6c40a8c5d0a2aa80e3efae653ccffb689b6847 GIT binary patch literal 524 zcmV+n0`vWeP)LlRrosQ5e8~mq;RlO>9Dg-cU;eN(m%`lkHksIQ+Lr zAuV=ELFyvt?jA=`P!KJM&<=q>K#Fcgaf&BmGpMxH!z5Hwql-~{9p2r=#6t(a<=ywa z@Atdod+*?ZA>Fl^evb}NC_~>@``$XcVxnJwoo@o*lA)}TAg|j=Bs;LTD`3?YcK;Cd zUxPQm{I@(GlhsV!T_8Xv5~7q=86?lZYXJ0{5^1g*ec;0j_^UyEeH92Gw}Y02=V_I} zrvjQ;f=?+SaRB7DcfczH5DogtL_)~z0yZUkFT+gz5_#+`#1-+?4uHjXVIlFi05E>2 z-Wu$9*-7+?ku=GS^!ON6&>dDoB+T_@#*z##tJXTa^M=Z^kPJnw@_M%qz=F(JEf~i*t)O?d*+`5?t_a!DiO8ED*9c5Wq!m_&Dw13o z_H)qarb+o@viTEUO{muN&FGnhvkUQDyn?kW0moBFx31>2g5KZ(ZzKGZ zpj0xzQ}}K4#8WpeQmp`BOhFHN00$ft;lQX*rtbL{Y9;4D0r+AAn(-guTca97?a@yF O0000LlfR48U>Ja(#0GMOTBXh9IH*u?>0+rT$ZZ|GDat`N zK}10i{{RQ2bZ}J%UAo8}IC#+E;JC)2c5o|5At*wR4*n{L=`YklssZEheQ8Y_>fk%& zee*ug7vA>^{AVc3UcS4I4=|psMatdj|_B+83z{0n!|Fc?By3xNOyz=4pY{uD0R zLZSkAtsxj`0E%Zcl4X;Egab+TzR7+^$(bok>PN;o}E59w#IK&=q*~OAZml zT3&accgvklKZvtc`2IsY_dTe40{d!cU~XcK_%@c{2##b=#s2Fe%?kh? yS@`)Ba16SA=*s#7`ycLlg~>OQ5?WOGd1l>k5&d1>XIPB5~400y6#1b1~b7j zK{`e!j~>*cKkoJq6fC4DC@ssbAZVSu#Lyz)#Y%`>@W;00fcryy9^UNexPu=0Ufz4( z`F=h;zTY?SpP^m#aq~42;BOfoF9g@#3`(vJDezIh0k>M9vd1b_86?qyz}}aJms{Sh z^0Wm)roqyODlb0y8SN?%pfxV|mUI|yQ~6{PpF~@Hh8%p`1cd`=Fnl0DtP|`kKFQJw zjHHxA2iUa_z-$6wAZpMW7sNUhT$6P52|n(q^WbxMXQ^B30QX0QD`^Jc!FQ*wv9Usg zCwJ98WQKY3N@v_c>a~JGTu`)go}@hQoUa=Z08CRy3+t?5- WN}xDIvKPAm0000|moPEhRK{nks4# zL89O^xhRDqQdNbB+g>1qlv}t#`~isjN=SsHm4Hfh91w_zA|PtMWT2HGSv&sB$L`u^ zZSUE$duF(pU4O>L36;3ul}58OJM+HJ^UV9s&cgq@iO1der`NG-#|y^wC(k{aPx-h2 zJ}y%`T{!aEdd4rj*bUY~SD%}BFbP61!hH)nS7OHinr0gflR5zPn)||}AS8xIlXXj! z8yUa!l`a?A7#G+YlGJcvwhX|RT0nb{%jG~yesSpm0yuqsdnNv(0;`M-7>hM2ahg&| zQ>G%rwc7y#80f3BH*3hHDPXbNv0Gy+Yc??+?ruc4jo>NE^*R@3m#A5Y6ZmjK^Y-tu z0K9y>%#;09Ug?6Yf>44lCGTEw<*}6#TPv_Oc$!kK*C2l!T=vu$EJ~ zHhw*ua{jj&gb+x%%DUMD$Oftp^DX@SmPV_Hr}rhi-tAKI^ig-(^QLYAzWa_-Le&M# z*CcXV|d-!RJ0E}JD&5g3J1<+LCQBBo=d^zClu^iS~meUf??}_>HbGtz) zWTC`RpW*C@GJnWxuHSBZXz=Fv<>zZ09gyq|YxHMa0ty5{S0?~(4krN2r6miXQedej zSJ1yd8IW4Tz+g;&hX!Hk$x4n7#vlbZ@|i8!eC{)gocX-sK(}UQ$`VNMgxIzU6o754 zu-0-tA9D3pfRYg}^v!eZnNQ$LkL>&`&+SS0-it*p=R>aDY6W0uaG8U>37_uK9O}~y z<}|y)5Yd%EONlQfo)BERc=zD|B+#bJx=AS|@88i_pr@}&|1OOZ(3>%|4a5k<3V<&R zRyn$_!qWpCv?-q;2*3{rJ&6($Da5uHf%nQmey9V(lb@`SdX{@p0KiPq<1cxQpDs}; zMGW?bWLq`VYV2w;Jk^tMe1C<*y$L;S79r}GT7|T_j9D&o`EtbgcuamgX8+e>ZvA9BVj$qUy)7nb=vx`h;bi$b1 zrOo#Vr9=n`4T&%Q=D~{60+>xV2OEB4GYDBKQH^6F-$I8n9PW-eyt}$`u{7)c%8cfN zxq#^?rIs3}kQ5*#NDoP~S>T>y4?qQmU)`X9HKc_C@#P%ZFyx7$C8o1F;f+Hj zuHDy+O*$oROoUt?*Ju%OthbD?u7vK+J4cyq67AGa;l1y;&p*GgL4naxtTm*?B5}34 zs>Gqrn4xZ`#M&D$N+iaDVf$aXGiQMb$GRE(t@E4Lt@H8HNmQgFubpV0DKE`^Ule_Ip?GOHP@FLm0fJ~W9|Z^$8-IUf9Ybcd%j&9 zpEv&JYcE1et)r%{rUR(`6lCyw&?*oI*P@T77A3Cmx+7>9lqgUF6Ohjm@eO- z8XNyx_H5_l1=4IC*)$1zqSj{pDw07*qoM6N<$ Ef{M}X@c;k- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/nae2/textures/item/material/cell_part_gas_1024k.png b/src/main/resources/assets/nae2/textures/item/material/cell_part_gas_1024k.png new file mode 100644 index 0000000000000000000000000000000000000000..ade1d17693ccf69db51d6d70731ae91ae0d8866c GIT binary patch literal 474 zcmV<00VV#4P)E^jk_4>$!52_4g|@;PEPVi9 zAWz{7_y8#dg>)e)6x7B*L`19DZtw>gGVBD4wV2FgTqB-p=H5H!-Z?YJ;}5hOK?)!y z`@<9E&8qX=&0UWaKuTC{fv78d0hLa`<(1BTe8543_lw}JN4mN;Z^`0T%BO&l1PK(2 z5Qeb22Im)~h9s9gEM{%><&Z_!LkD-cC380`gH8wXdw)Zd~pu zh7!09@CD#c)Q;mAiGKTJFrZS!c6Q^%LPmp1CqM$D2ntb`;a~v3YfEdel!>q3>UbaY zgqK&O<+2vZ#W*7(Xb}PK@AZfJ@r+?OEf_Zg@^yvWQhFoKcMG}s5Hg+P& zh7_g{Z4YcxrQCWGwzkqP2p7>JjimAq!GLElfeCC%-&E2^%cOyMKcD7qKM)9W2i4TIS7u>9$55V>;SO8-^F#a zIW<2#UaO^tZ4qz~91%vK^}sL;bX{k>rUC15a)^>29=q`r03iebrfCjbe-}@9_jVoE zMHxD+X{BTH=CA=k^Vp_oG|u4pQWMR|&F!uhHwYu3 zZlQ_*N`1G55Cz&voyNl`^FWzfw&IDKKo6$=6eZN__0;)1-nq2|NC^sn| zD^@x-Q4elk^mu=%f%q$Fe;8_{`0nmwTCFWy7eysk|N9DOo)Ms=X#m_Ud-y+O)1%14 z?|YHQlU~SW!EwszSB}DvpOeFc&!yYujKzhIZFF6i+WYhi3>Fr;isNj@AOmxC(#qT( sfxW$N>8<%N4U8zj+_H>wQs>3_AMPgqx(ht}ApigX07*qoM6N<$g6HY_n*aa+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/nae2/textures/item/material/cell_part_gas_256k.png b/src/main/resources/assets/nae2/textures/item/material/cell_part_gas_256k.png new file mode 100644 index 0000000000000000000000000000000000000000..c51a3eb06f72254ead20a8270036afd5b4e45c57 GIT binary patch literal 474 zcmV<00VV#4P)`ma+lL^?mhQhQ+lU!&ilO2`|mss8%$N23V`_> z0O#YyS%*v8m)AEGfRw;hj`!|8Qy-c)Ck$?16u{3993SEQA$Wa575BCh>{B0R5?C(D zW$_4m-%oGIXC}(h3(cF&&Y=|AB6xULJZ7U!r^RZ%Fwa;aZ}fN`&noQ(iX@czMR z+=380^KHChzb|y(=_q=L0HU-eA z<9vN;hjFe;7uxeE)`QVPqmDBeVg$2`m0buXlbFC3(^`oFs8Utg_f2yC1qZ9QRAE^& QWB>pF07*qoM6N<$g84?uY5)KL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/nae2/textures/item/material/cell_part_gas_4096k.png b/src/main/resources/assets/nae2/textures/item/material/cell_part_gas_4096k.png new file mode 100644 index 0000000000000000000000000000000000000000..9eab7c8f9c9945f2a32f89ef39a412ae4afd71a4 GIT binary patch literal 514 zcmV+d0{#7oP)Ak%ttL#fzZDrb{vvtZwb(Sxf2E zKcRa@&GDA0(5aBY9lIzLx`Y%jb%r#Xvy{eyV1lAUA_8BBt1c&7d2k%}@!j|CefOTj z6A{Nk0i>xuhhgC~@mls_Jl<0PQc8TkU^PMD_8$zB#yIsfo z{W(D(7!FZR91C^zOS@e?yUKie+Wvo`q}PL=KkB?!uLZ3%#kg%po^O=f$a5wWq4xLn zSGn$`sTttrMw@nUP{((7H9nicRu~q}$w`~p%-?Xk*VAhqKRfd|J}wBu!l`xQy4%aY zy5_f|I&Oy%=(w)lEw}BOZM@E=bAWZh19k{;!W3t-A)HtF5lZhVZDxMnWe-Rb<&Z75@MgRZ+07*qoM6N<$ Ef_L8PfdBvi literal 0 HcmV?d00001