From 956f503e1655b7226018ac0eb6d4fe6491f3de23 Mon Sep 17 00:00:00 2001 From: 90 <90@national.shitposting.agency> Date: Fri, 13 May 2022 19:23:01 +0100 Subject: [PATCH] Begin AppMek integration (MEGA Chemical Cells) This WILL look like shit for the time being. --- build.gradle | 2 +- src/main/java/ninety/megacells/MEGACells.java | 22 +++- .../datagen/MEGABlockModelProvider.java | 5 +- .../megacells/datagen/MEGADataGenerators.java | 10 ++ .../datagen/MEGAItemModelProvider.java | 14 +-- .../megacells/datagen/MEGARecipeProvider.java | 25 +++-- .../megacells/init/MEGACellsClient.java | 4 +- .../integration/appmek/ChemicalCellType.java | 68 +++++++++++++ .../appmek/MEGAMekIntegration.java | 94 ++++++++++++++++++ .../integration/appmek/MEGAMekItems.java | 24 +++++ .../data/MEGAMekBlockModelProvider.java | 28 ++++++ .../appmek/data/MEGAMekItemModelProvider.java | 27 +++++ .../appmek/data/MEGAMekRecipeProvider.java | 31 ++++++ .../java/ninety/megacells/item/MEGAItems.java | 37 +++---- .../megacells/item/MEGAPortableCell.java | 8 +- .../megacells/item/MEGAStorageCell.java | 14 +-- .../megacells/item/util/IMEGACellType.java | 26 +++++ .../item/{ => util}/MEGACellTier.java | 9 +- .../item/{ => util}/MEGACellType.java | 32 ++++-- src/main/resources/META-INF/mods.toml | 7 ++ .../assets/megacells/lang/en_us.json | 15 ++- .../drive/cells/chemical_storage_cell_16m.png | Bin 0 -> 8595 bytes .../drive/cells/chemical_storage_cell_1m.png | Bin 0 -> 8440 bytes .../cells/chemical_storage_cell_256m.png | Bin 0 -> 8251 bytes .../drive/cells/chemical_storage_cell_4m.png | Bin 0 -> 8623 bytes .../drive/cells/chemical_storage_cell_64m.png | Bin 0 -> 8391 bytes .../cells/portable_mega_chemical_cell.png | Bin 0 -> 8483 bytes .../item/chemical_storage_cell_16m.png | Bin 0 -> 845 bytes .../item/chemical_storage_cell_1m.png | Bin 0 -> 835 bytes .../item/chemical_storage_cell_256m.png | Bin 0 -> 819 bytes .../item/chemical_storage_cell_4m.png | Bin 0 -> 854 bytes .../item/chemical_storage_cell_64m.png | Bin 0 -> 825 bytes .../item/mega_chemical_cell_housing.png | Bin 0 -> 812 bytes .../item/portable_chemical_cell_16m.png | Bin 0 -> 5814 bytes .../item/portable_chemical_cell_1m.png | Bin 0 -> 5862 bytes .../item/portable_chemical_cell_256m.png | Bin 0 -> 5912 bytes .../item/portable_chemical_cell_4m.png | Bin 0 -> 5765 bytes .../item/portable_chemical_cell_64m.png | Bin 0 -> 6024 bytes 38 files changed, 442 insertions(+), 60 deletions(-) create mode 100644 src/main/java/ninety/megacells/integration/appmek/ChemicalCellType.java create mode 100644 src/main/java/ninety/megacells/integration/appmek/MEGAMekIntegration.java create mode 100644 src/main/java/ninety/megacells/integration/appmek/MEGAMekItems.java create mode 100644 src/main/java/ninety/megacells/integration/appmek/data/MEGAMekBlockModelProvider.java create mode 100644 src/main/java/ninety/megacells/integration/appmek/data/MEGAMekItemModelProvider.java create mode 100644 src/main/java/ninety/megacells/integration/appmek/data/MEGAMekRecipeProvider.java create mode 100644 src/main/java/ninety/megacells/item/util/IMEGACellType.java rename src/main/java/ninety/megacells/item/{ => util}/MEGACellTier.java (84%) rename src/main/java/ninety/megacells/item/{ => util}/MEGACellType.java (79%) create mode 100644 src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_16m.png create mode 100644 src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_1m.png create mode 100644 src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_256m.png create mode 100644 src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_4m.png create mode 100644 src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_64m.png create mode 100644 src/main/resources/assets/megacells/textures/block/drive/cells/portable_mega_chemical_cell.png create mode 100644 src/main/resources/assets/megacells/textures/item/chemical_storage_cell_16m.png create mode 100644 src/main/resources/assets/megacells/textures/item/chemical_storage_cell_1m.png create mode 100644 src/main/resources/assets/megacells/textures/item/chemical_storage_cell_256m.png create mode 100644 src/main/resources/assets/megacells/textures/item/chemical_storage_cell_4m.png create mode 100644 src/main/resources/assets/megacells/textures/item/chemical_storage_cell_64m.png create mode 100644 src/main/resources/assets/megacells/textures/item/mega_chemical_cell_housing.png create mode 100644 src/main/resources/assets/megacells/textures/item/portable_chemical_cell_16m.png create mode 100644 src/main/resources/assets/megacells/textures/item/portable_chemical_cell_1m.png create mode 100644 src/main/resources/assets/megacells/textures/item/portable_chemical_cell_256m.png create mode 100644 src/main/resources/assets/megacells/textures/item/portable_chemical_cell_4m.png create mode 100644 src/main/resources/assets/megacells/textures/item/portable_chemical_cell_64m.png diff --git a/build.gradle b/build.gradle index ba9aff1c..c364aee2 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ apply(plugin: "net.minecraftforge.gradle") apply plugin: 'org.spongepowered.mixin' group = "ninety" -version = "1.0.0-alpha.1" +version = "1.0.0-beta.1" repositories { maven { diff --git a/src/main/java/ninety/megacells/MEGACells.java b/src/main/java/ninety/megacells/MEGACells.java index b5ca5da1..7f7760bd 100644 --- a/src/main/java/ninety/megacells/MEGACells.java +++ b/src/main/java/ninety/megacells/MEGACells.java @@ -2,6 +2,8 @@ import java.util.stream.Stream; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.DistExecutor; @@ -11,8 +13,9 @@ import ninety.megacells.datagen.MEGADataGenerators; import ninety.megacells.init.MEGACellsClient; -import ninety.megacells.item.MEGACellType; +import ninety.megacells.integration.appmek.MEGAMekIntegration; import ninety.megacells.item.MEGAItems; +import ninety.megacells.item.util.MEGACellType; import ninety.megacells.util.MEGACellsUtil; import appeng.api.client.StorageCellModels; @@ -23,12 +26,22 @@ @Mod(MEGACells.MODID) public class MEGACells { + public static ResourceLocation makeId(String path) { + return new ResourceLocation(MEGACells.MODID, path); + } + + public static String getItemPath(Item item) { + return item.getRegistryName().getPath(); + } + public static final String MODID = "megacells"; public MEGACells() { IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); MEGAItems.init(bus); + bus.addGenericListener(Item.class, MEGAMekIntegration::registerItems); + bus.addListener(MEGADataGenerators::onGatherData); bus.addListener((FMLCommonSetupEvent event) -> { event.enqueueWork(this::initCellModels); @@ -39,8 +52,9 @@ public MEGACells() { } private void initCellModels() { - for (var cell : Stream.concat(MEGACellType.ITEM.getCells().stream(), MEGACellType.FLUID.getCells().stream()) - .toList()) { + for (var cell : Stream.concat( + MEGACellType.ITEM.getCells().stream(), + MEGACellType.FLUID.getCells().stream()).toList()) { StorageCellModels.registerModel(cell, MEGACellsUtil.makeId("block/drive/cells/" + MEGACellsUtil.getItemPath(cell))); } @@ -52,6 +66,7 @@ private void initCellModels() { StorageCellModels.registerModel(portableFluidCell, MEGACellsUtil.makeId("block/drive/cells/portable_mega_fluid_cell")); } + MEGAMekIntegration.initCellModels(); } private void initUpgrades() { @@ -75,6 +90,7 @@ private void initUpgrades() { Upgrades.add(AEItems.INVERTER_CARD, portableCell, 1, portableCellGroup); Upgrades.add(AEItems.ENERGY_CARD, portableCell, 2, portableCellGroup); } + MEGAMekIntegration.initUpgrades(); } } diff --git a/src/main/java/ninety/megacells/datagen/MEGABlockModelProvider.java b/src/main/java/ninety/megacells/datagen/MEGABlockModelProvider.java index 638333b5..0540dff0 100644 --- a/src/main/java/ninety/megacells/datagen/MEGABlockModelProvider.java +++ b/src/main/java/ninety/megacells/datagen/MEGABlockModelProvider.java @@ -8,20 +8,21 @@ import net.minecraftforge.common.data.ExistingFileHelper; import ninety.megacells.MEGACells; -import ninety.megacells.item.MEGACellType; +import ninety.megacells.item.util.MEGACellType; import ninety.megacells.util.MEGACellsUtil; import appeng.core.AppEng; public class MEGABlockModelProvider extends BlockModelProvider { - private static final ResourceLocation DRIVE_CELL = AppEng.makeId("block/drive/drive_cell"); + protected static final ResourceLocation DRIVE_CELL = AppEng.makeId("block/drive/drive_cell"); public MEGABlockModelProvider(DataGenerator generator, ExistingFileHelper existingFileHelper) { super(generator, MEGACells.MODID, existingFileHelper); existingFileHelper.trackGenerated(DRIVE_CELL, MODEL); } + @Override protected void registerModels() { for (var cell : Stream.concat(MEGACellType.ITEM.getCells().stream(), MEGACellType.FLUID.getCells().stream()).toList()) { diff --git a/src/main/java/ninety/megacells/datagen/MEGADataGenerators.java b/src/main/java/ninety/megacells/datagen/MEGADataGenerators.java index 58885d23..9cea42fb 100644 --- a/src/main/java/ninety/megacells/datagen/MEGADataGenerators.java +++ b/src/main/java/ninety/megacells/datagen/MEGADataGenerators.java @@ -7,6 +7,10 @@ import net.minecraftforge.forge.event.lifecycle.GatherDataEvent; import ninety.megacells.MEGACells; +import ninety.megacells.integration.appmek.MEGAMekIntegration; +import ninety.megacells.integration.appmek.data.MEGAMekBlockModelProvider; +import ninety.megacells.integration.appmek.data.MEGAMekItemModelProvider; +import ninety.megacells.integration.appmek.data.MEGAMekRecipeProvider; @Mod.EventBusSubscriber(modid = MEGACells.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) public class MEGADataGenerators { @@ -19,5 +23,11 @@ public static void onGatherData(GatherDataEvent event) { generator.addProvider(new MEGAItemModelProvider(generator, existingFileHelper)); generator.addProvider(new MEGABlockModelProvider(generator, existingFileHelper)); generator.addProvider(new MEGARecipeProvider(generator)); + + if (MEGAMekIntegration.isLoaded()) { + generator.addProvider(new MEGAMekItemModelProvider(generator, existingFileHelper)); + generator.addProvider(new MEGAMekBlockModelProvider(generator, existingFileHelper)); + generator.addProvider(new MEGAMekRecipeProvider(generator)); + } } } diff --git a/src/main/java/ninety/megacells/datagen/MEGAItemModelProvider.java b/src/main/java/ninety/megacells/datagen/MEGAItemModelProvider.java index f4adb129..f82b0f70 100644 --- a/src/main/java/ninety/megacells/datagen/MEGAItemModelProvider.java +++ b/src/main/java/ninety/megacells/datagen/MEGAItemModelProvider.java @@ -10,22 +10,24 @@ import net.minecraftforge.common.data.ExistingFileHelper; import ninety.megacells.MEGACells; -import ninety.megacells.item.MEGACellType; import ninety.megacells.item.MEGAItems; +import ninety.megacells.item.util.MEGACellType; import ninety.megacells.util.MEGACellsUtil; import appeng.core.AppEng; public class MEGAItemModelProvider extends ItemModelProvider { - private static final ResourceLocation STORAGE_CELL_LED = AppEng.makeId("item/storage_cell_led"); - private static final ResourceLocation PORTABLE_CELL_LED = AppEng.makeId("item/portable_cell_led"); + static final ResourceLocation STORAGE_CELL_LED = AppEng.makeId("item/storage_cell_led"); + static final ResourceLocation PORTABLE_CELL_LED = AppEng.makeId("item/portable_cell_led"); public MEGAItemModelProvider(DataGenerator generator, ExistingFileHelper existingFileHelper) { super(generator, MEGACells.MODID, existingFileHelper); existingFileHelper.trackGenerated(STORAGE_CELL_LED, TEXTURE); + existingFileHelper.trackGenerated(PORTABLE_CELL_LED, TEXTURE); } + @Override protected void registerModels() { flatSingleLayer(MEGAItems.MEGA_ITEM_CELL_HOUSING.get()); flatSingleLayer(MEGAItems.MEGA_FLUID_CELL_HOUSING.get()); @@ -47,15 +49,15 @@ protected void registerModels() { } } - private void cell(Item cell) { + protected void cell(Item cell) { flatSingleLayer(cell).texture("layer1", STORAGE_CELL_LED); } - private void portable(Item cell) { + protected void portable(Item cell) { flatSingleLayer(cell).texture("layer1", PORTABLE_CELL_LED); } - private ItemModelBuilder flatSingleLayer(Item item) { + protected ItemModelBuilder flatSingleLayer(Item item) { String path = MEGACellsUtil.getItemPath(item); return singleTexture(path, mcLoc("item/generated"), "layer0", MEGACellsUtil.makeId("item/" + path)); } diff --git a/src/main/java/ninety/megacells/datagen/MEGARecipeProvider.java b/src/main/java/ninety/megacells/datagen/MEGARecipeProvider.java index f6922aed..ff40ac3d 100644 --- a/src/main/java/ninety/megacells/datagen/MEGARecipeProvider.java +++ b/src/main/java/ninety/megacells/datagen/MEGARecipeProvider.java @@ -12,7 +12,11 @@ import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.world.item.Item; -import ninety.megacells.item.*; +import ninety.megacells.item.MEGAItems; +import ninety.megacells.item.MEGAPortableCell; +import ninety.megacells.item.MEGAStorageCell; +import ninety.megacells.item.util.IMEGACellType; +import ninety.megacells.item.util.MEGACellType; import ninety.megacells.util.MEGACellsUtil; import appeng.core.definitions.AEBlocks; @@ -23,6 +27,7 @@ public MEGARecipeProvider(DataGenerator generator) { super(generator); } + @Override protected void buildCraftingRecipes(@NotNull Consumer consumer) { // spotless:off component(consumer, AEItems.CELL_COMPONENT_64K.asItem(), MEGAItems.CELL_COMPONENT_1M.get(), AEItems.SKY_DUST.asItem()); @@ -56,12 +61,12 @@ private void component(Consumer consumer, Item preceding, Item o .save(consumer, MEGACellsUtil.makeId("cells/" + MEGACellsUtil.getItemPath(output))); } - private void cell(Consumer consumer, Item cellItem) { + protected void cell(Consumer consumer, Item cellItem) { var cell = (MEGAStorageCell) cellItem; var component = cell.getTier().getComponent(); - var housing = cell.getType().getHousing(); - var housingMaterial = cell.getType().housingMaterial; + var housing = cell.getType().housing(); + var housingMaterial = cell.getType().housingMaterial(); var componentPath = MEGACellsUtil.getItemPath(component); var cellPath = MEGACellsUtil.getItemPath(cellItem); @@ -84,9 +89,9 @@ private void cell(Consumer consumer, Item cellItem) { .save(consumer, MEGACellsUtil.makeId("cells/standard" + cellPath + "_with_housing")); } - private void portable(Consumer consumer, Item portableCellItem) { + protected void portable(Consumer consumer, Item portableCellItem) { var portableCell = (MEGAPortableCell) portableCellItem; - var housing = portableCell.type.getHousing(); + var housing = portableCell.type.housing(); ShapelessRecipeBuilder.shapeless(portableCell) .requires(AEBlocks.CHEST) .requires(portableCell.tier.getComponent()) @@ -97,15 +102,15 @@ private void portable(Consumer consumer, Item portableCellItem) .save(consumer, MEGACellsUtil.makeId("cells/portable/" + MEGACellsUtil.getItemPath(portableCell))); } - private void housing(Consumer consumer, MEGACellType type) { - var housing = type.getHousing(); - ShapedRecipeBuilder.shaped(type.getHousing()) + protected void housing(Consumer consumer, IMEGACellType type) { + var housing = type.housing(); + ShapedRecipeBuilder.shaped(type.housing()) .pattern("aba") .pattern("b b") .pattern("ddd") .define('a', AEBlocks.QUARTZ_VIBRANT_GLASS) .define('b', AEItems.SKY_DUST) - .define('d', type.housingMaterial) + .define('d', type.housingMaterial()) .unlockedBy("has_dusts/sky_stone", has(AEItems.SKY_DUST)) .save(consumer, MEGACellsUtil.makeId("cells/" + MEGACellsUtil.getItemPath(housing))); } diff --git a/src/main/java/ninety/megacells/init/MEGACellsClient.java b/src/main/java/ninety/megacells/init/MEGACellsClient.java index ea3818f9..bbbb1113 100644 --- a/src/main/java/ninety/megacells/init/MEGACellsClient.java +++ b/src/main/java/ninety/megacells/init/MEGACellsClient.java @@ -5,9 +5,10 @@ import net.minecraftforge.client.event.ColorHandlerEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import ninety.megacells.item.MEGACellType; +import ninety.megacells.integration.appmek.MEGAMekIntegration; import ninety.megacells.item.MEGAPortableCell; import ninety.megacells.item.MEGAStorageCell; +import ninety.megacells.item.util.MEGACellType; public class MEGACellsClient { public static void initialize() { @@ -26,5 +27,6 @@ private static void initItemColors(ColorHandlerEvent.Item event) { MEGACellType.FLUID.getPortableCells().stream()).toList()) { event.getItemColors().register(MEGAPortableCell::getColor, cell); } + MEGAMekIntegration.initItemColors(event); } } diff --git a/src/main/java/ninety/megacells/integration/appmek/ChemicalCellType.java b/src/main/java/ninety/megacells/integration/appmek/ChemicalCellType.java new file mode 100644 index 00000000..1691ec8a --- /dev/null +++ b/src/main/java/ninety/megacells/integration/appmek/ChemicalCellType.java @@ -0,0 +1,68 @@ +package ninety.megacells.integration.appmek; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.Item; + +import me.ramidzkh.mekae2.AMMenus; +import me.ramidzkh.mekae2.ae2.MekanismKeyType; +import ninety.megacells.item.util.IMEGACellType; + +import appeng.api.stacks.AEKeyType; +import appeng.menu.me.common.MEStorageMenu; + +public enum ChemicalCellType implements IMEGACellType { + TYPE; + + @Override + public AEKeyType keyType() { + return MekanismKeyType.TYPE; + } + + @Override + public String affix() { + return "chemical"; + } + + @Override + public Item housing() { + return MEGAMekItems.MEGA_CHEMICAL_CELL_HOUSING; + } + + @Override + public TagKey housingMaterial() { + return ItemTags.create(new ResourceLocation("forge", "ingots/osmium")); + } + + @Override + public MenuType portableCellMenu() { + return AMMenus.PORTABLE_CHEMICAL_CELL_TYPE; + } + + @Override + public List getCells() { + var cells = new ArrayList(); + cells.add(MEGAMekItems.CHEMICAL_STORAGE_CELL_1M); + cells.add(MEGAMekItems.CHEMICAL_STORAGE_CELL_4M); + cells.add(MEGAMekItems.CHEMICAL_STORAGE_CELL_16M); + cells.add(MEGAMekItems.CHEMICAL_STORAGE_CELL_64M); + cells.add(MEGAMekItems.CHEMICAL_STORAGE_CELL_256M); + return cells; + } + + @Override + public List getPortableCells() { + var cells = new ArrayList(); + cells.add(MEGAMekItems.PORTABLE_CHEMICAL_CELL_1M); + cells.add(MEGAMekItems.PORTABLE_CHEMICAL_CELL_4M); + cells.add(MEGAMekItems.PORTABLE_CHEMICAL_CELL_16M); + cells.add(MEGAMekItems.PORTABLE_CHEMICAL_CELL_64M); + cells.add(MEGAMekItems.PORTABLE_CHEMICAL_CELL_256M); + return cells; + } +} diff --git a/src/main/java/ninety/megacells/integration/appmek/MEGAMekIntegration.java b/src/main/java/ninety/megacells/integration/appmek/MEGAMekIntegration.java new file mode 100644 index 00000000..94997c94 --- /dev/null +++ b/src/main/java/ninety/megacells/integration/appmek/MEGAMekIntegration.java @@ -0,0 +1,94 @@ +package ninety.megacells.integration.appmek; + +import net.minecraft.world.item.Item; +import net.minecraftforge.client.event.ColorHandlerEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.fml.ModList; + +import ninety.megacells.item.MEGAItems; +import ninety.megacells.item.MEGAPortableCell; +import ninety.megacells.item.MEGAStorageCell; +import ninety.megacells.item.util.MEGACellTier; +import ninety.megacells.util.MEGACellsUtil; + +import appeng.api.client.StorageCellModels; +import appeng.api.upgrades.Upgrades; +import appeng.core.definitions.AEItems; +import appeng.core.localization.GuiText; +import appeng.items.materials.MaterialItem; + +public class MEGAMekIntegration { + protected static Item cell(MEGACellTier tier) { + return new MEGAStorageCell(MEGAItems.props.stacksTo(1), tier, ChemicalCellType.TYPE) + .setRegistryName(MEGACellsUtil.makeId("chemical_storage_cell_" + tier.affix)); + } + + protected static Item portable(MEGACellTier tier) { + return new MEGAPortableCell(MEGAItems.props.stacksTo(1), tier, ChemicalCellType.TYPE) + .setRegistryName(MEGACellsUtil.makeId("portable_chemical_cell_" + tier.affix)); + } + + private static final Item HOUSING = new MaterialItem(MEGAItems.props) + .setRegistryName(MEGACellsUtil.makeId("mega_chemical_cell_housing")); + + public static void registerItems(RegistryEvent.Register event) { + if (isLoaded()) { + event.getRegistry().registerAll( + HOUSING, + cell(MEGACellTier._1M), + cell(MEGACellTier._4M), + cell(MEGACellTier._16M), + cell(MEGACellTier._64M), + cell(MEGACellTier._256M), + portable(MEGACellTier._1M), + portable(MEGACellTier._4M), + portable(MEGACellTier._16M), + portable(MEGACellTier._64M), + portable(MEGACellTier._256M)); + } + } + + public static void initUpgrades() { + if (isLoaded()) { + var storageCellGroup = GuiText.StorageCells.getTranslationKey(); + var portableCellGroup = GuiText.PortableCells.getTranslationKey(); + + for (var cell : ChemicalCellType.TYPE.getCells()) { + Upgrades.add(AEItems.INVERTER_CARD, cell, 1, storageCellGroup); + } + for (var portable : ChemicalCellType.TYPE.getPortableCells()) { + Upgrades.add(AEItems.FUZZY_CARD, portable, 1, portableCellGroup); + Upgrades.add(AEItems.INVERTER_CARD, portable, 1, portableCellGroup); + Upgrades.add(AEItems.ENERGY_CARD, portable, 2, portableCellGroup); + } + } + } + + public static void initCellModels() { + if (isLoaded()) { + for (var cell : ChemicalCellType.TYPE.getCells()) { + StorageCellModels.registerModel(cell, + MEGACellsUtil.makeId("block/drive/cells/" + MEGACellsUtil.getItemPath(cell))); + } + for (var portable : ChemicalCellType.TYPE.getPortableCells()) { + StorageCellModels.registerModel(portable, + MEGACellsUtil.makeId("block/drive/cells/portable_mega_item_cell")); + } + } + } + + public static void initItemColors(ColorHandlerEvent.Item event) { + if (isLoaded()) { + for (var cell : ChemicalCellType.TYPE.getCells()) { + event.getItemColors().register(MEGAStorageCell::getColor, cell); + } + for (var cell : ChemicalCellType.TYPE.getPortableCells()) { + event.getItemColors().register(MEGAPortableCell::getColor, cell); + } + } + } + + public static boolean isLoaded() { + return ModList.get().isLoaded("appmek"); + } +} diff --git a/src/main/java/ninety/megacells/integration/appmek/MEGAMekItems.java b/src/main/java/ninety/megacells/integration/appmek/MEGAMekItems.java new file mode 100644 index 00000000..5e32cec5 --- /dev/null +++ b/src/main/java/ninety/megacells/integration/appmek/MEGAMekItems.java @@ -0,0 +1,24 @@ +package ninety.megacells.integration.appmek; + +import net.minecraft.world.item.Item; +import net.minecraftforge.registries.ObjectHolder; + +import ninety.megacells.MEGACells; + +@ObjectHolder(MEGACells.MODID) +public class MEGAMekItems { + + public static final Item MEGA_CHEMICAL_CELL_HOUSING = null; + + public static final Item CHEMICAL_STORAGE_CELL_1M = null; + public static final Item CHEMICAL_STORAGE_CELL_4M = null; + public static final Item CHEMICAL_STORAGE_CELL_16M = null; + public static final Item CHEMICAL_STORAGE_CELL_64M = null; + public static final Item CHEMICAL_STORAGE_CELL_256M = null; + + public static final Item PORTABLE_CHEMICAL_CELL_1M = null; + public static final Item PORTABLE_CHEMICAL_CELL_4M = null; + public static final Item PORTABLE_CHEMICAL_CELL_16M = null; + public static final Item PORTABLE_CHEMICAL_CELL_64M = null; + public static final Item PORTABLE_CHEMICAL_CELL_256M = null; +} diff --git a/src/main/java/ninety/megacells/integration/appmek/data/MEGAMekBlockModelProvider.java b/src/main/java/ninety/megacells/integration/appmek/data/MEGAMekBlockModelProvider.java new file mode 100644 index 00000000..df943425 --- /dev/null +++ b/src/main/java/ninety/megacells/integration/appmek/data/MEGAMekBlockModelProvider.java @@ -0,0 +1,28 @@ +package ninety.megacells.integration.appmek.data; + +import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.ExistingFileHelper; + +import ninety.megacells.datagen.MEGABlockModelProvider; +import ninety.megacells.integration.appmek.ChemicalCellType; +import ninety.megacells.integration.appmek.MEGAMekIntegration; +import ninety.megacells.util.MEGACellsUtil; + +public class MEGAMekBlockModelProvider extends MEGABlockModelProvider { + + public MEGAMekBlockModelProvider(DataGenerator generator, ExistingFileHelper existingFileHelper) { + super(generator, existingFileHelper); + } + + @Override + protected void registerModels() { + if (MEGAMekIntegration.isLoaded()) { + for (var cell : ChemicalCellType.TYPE.getCells()) { + String path = "block/drive/cells/" + MEGACellsUtil.getItemPath(cell); + withExistingParent(path, DRIVE_CELL).texture("cell", path); + } + String portableChemicalCell = "block/drive/cells/portable_mega_chemical_cell"; + withExistingParent(portableChemicalCell, DRIVE_CELL).texture("cell", portableChemicalCell); + } + } +} diff --git a/src/main/java/ninety/megacells/integration/appmek/data/MEGAMekItemModelProvider.java b/src/main/java/ninety/megacells/integration/appmek/data/MEGAMekItemModelProvider.java new file mode 100644 index 00000000..ba70f1a8 --- /dev/null +++ b/src/main/java/ninety/megacells/integration/appmek/data/MEGAMekItemModelProvider.java @@ -0,0 +1,27 @@ +package ninety.megacells.integration.appmek.data; + +import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.ExistingFileHelper; + +import ninety.megacells.datagen.MEGAItemModelProvider; +import ninety.megacells.integration.appmek.ChemicalCellType; +import ninety.megacells.integration.appmek.MEGAMekIntegration; + +public class MEGAMekItemModelProvider extends MEGAItemModelProvider { + public MEGAMekItemModelProvider(DataGenerator generator, ExistingFileHelper existingFileHelper) { + super(generator, existingFileHelper); + } + + @Override + protected void registerModels() { + if (MEGAMekIntegration.isLoaded()) { + flatSingleLayer(ChemicalCellType.TYPE.housing()); + for (var storage : ChemicalCellType.TYPE.getCells()) { + cell(storage); + } + for (var portable : ChemicalCellType.TYPE.getPortableCells()) { + portable(portable); + } + } + } +} diff --git a/src/main/java/ninety/megacells/integration/appmek/data/MEGAMekRecipeProvider.java b/src/main/java/ninety/megacells/integration/appmek/data/MEGAMekRecipeProvider.java new file mode 100644 index 00000000..2feecfe3 --- /dev/null +++ b/src/main/java/ninety/megacells/integration/appmek/data/MEGAMekRecipeProvider.java @@ -0,0 +1,31 @@ +package ninety.megacells.integration.appmek.data; + +import java.util.function.Consumer; + +import ninety.megacells.integration.appmek.MEGAMekIntegration; +import org.jetbrains.annotations.NotNull; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; + +import ninety.megacells.datagen.MEGARecipeProvider; +import ninety.megacells.integration.appmek.ChemicalCellType; + +public class MEGAMekRecipeProvider extends MEGARecipeProvider { + public MEGAMekRecipeProvider(DataGenerator generator) { + super(generator); + } + + @Override + protected void buildCraftingRecipes(@NotNull Consumer consumer) { + if (MEGAMekIntegration.isLoaded()) { + housing(consumer, ChemicalCellType.TYPE); + for (var storage : ChemicalCellType.TYPE.getCells()) { + cell(consumer, storage); + } + for (var portable : ChemicalCellType.TYPE.getPortableCells()) { + portable(consumer, portable); + } + } + } +} diff --git a/src/main/java/ninety/megacells/item/MEGAItems.java b/src/main/java/ninety/megacells/item/MEGAItems.java index 90b70c91..b85b3f76 100644 --- a/src/main/java/ninety/megacells/item/MEGAItems.java +++ b/src/main/java/ninety/megacells/item/MEGAItems.java @@ -11,11 +11,14 @@ import net.minecraftforge.registries.RegistryObject; import ninety.megacells.MEGACells; +import ninety.megacells.item.util.IMEGACellType; +import ninety.megacells.item.util.MEGACellTier; +import ninety.megacells.item.util.MEGACellType; import appeng.items.materials.MaterialItem; import appeng.items.materials.StorageComponentItem; -public class MEGAItems { +public final class MEGAItems { public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MEGACells.MODID); @@ -31,7 +34,7 @@ public static void init(IEventBus bus) { } }; - private static final Item.Properties props = new Item.Properties().tab(CREATIVE_TAB); + public static final Item.Properties props = new Item.Properties().tab(CREATIVE_TAB); public static final RegistryObject MEGA_ITEM_CELL_HOUSING = ITEMS.register("mega_item_cell_housing", () -> new MaterialItem(props)); public static final RegistryObject MEGA_FLUID_CELL_HOUSING = ITEMS.register("mega_fluid_cell_housing", () -> new MaterialItem(props)); @@ -42,17 +45,17 @@ public static void init(IEventBus bus) { public static final RegistryObject CELL_COMPONENT_64M = component(MEGACellTier._64M); public static final RegistryObject CELL_COMPONENT_256M = component(MEGACellTier._256M); - public static final RegistryObject ITEM_CELL_1M = cell(CELL_COMPONENT_1M, MEGACellTier._1M, MEGACellType.ITEM); - public static final RegistryObject ITEM_CELL_4M = cell(CELL_COMPONENT_4M, MEGACellTier._4M, MEGACellType.ITEM); - public static final RegistryObject ITEM_CELL_16M = cell(CELL_COMPONENT_16M, MEGACellTier._16M, MEGACellType.ITEM); - public static final RegistryObject ITEM_CELL_64M = cell(CELL_COMPONENT_64M, MEGACellTier._64M, MEGACellType.ITEM); - public static final RegistryObject ITEM_CELL_256M = cell(CELL_COMPONENT_256M, MEGACellTier._256M, MEGACellType.ITEM); + public static final RegistryObject ITEM_CELL_1M = cell(MEGACellTier._1M, MEGACellType.ITEM); + public static final RegistryObject ITEM_CELL_4M = cell(MEGACellTier._4M, MEGACellType.ITEM); + public static final RegistryObject ITEM_CELL_16M = cell(MEGACellTier._16M, MEGACellType.ITEM); + public static final RegistryObject ITEM_CELL_64M = cell(MEGACellTier._64M, MEGACellType.ITEM); + public static final RegistryObject ITEM_CELL_256M = cell(MEGACellTier._256M, MEGACellType.ITEM); - public static final RegistryObject FLUID_CELL_1M = cell(CELL_COMPONENT_1M, MEGACellTier._1M, MEGACellType.FLUID); - public static final RegistryObject FLUID_CELL_4M = cell(CELL_COMPONENT_4M, MEGACellTier._4M, MEGACellType.FLUID); - public static final RegistryObject FLUID_CELL_16M = cell(CELL_COMPONENT_16M, MEGACellTier._16M, MEGACellType.FLUID); - public static final RegistryObject FLUID_CELL_64M = cell(CELL_COMPONENT_64M, MEGACellTier._64M, MEGACellType.FLUID); - public static final RegistryObject FLUID_CELL_256M = cell(CELL_COMPONENT_256M, MEGACellTier._256M, MEGACellType.FLUID); + public static final RegistryObject FLUID_CELL_1M = cell(MEGACellTier._1M, MEGACellType.FLUID); + public static final RegistryObject FLUID_CELL_4M = cell(MEGACellTier._4M, MEGACellType.FLUID); + public static final RegistryObject FLUID_CELL_16M = cell(MEGACellTier._16M, MEGACellType.FLUID); + public static final RegistryObject FLUID_CELL_64M = cell(MEGACellTier._64M, MEGACellType.FLUID); + public static final RegistryObject FLUID_CELL_256M = cell(MEGACellTier._256M, MEGACellType.FLUID); public static final RegistryObject PORTABLE_ITEM_CELL_1M = portable(MEGACellTier._1M, MEGACellType.ITEM); public static final RegistryObject PORTABLE_ITEM_CELL_4M = portable(MEGACellTier._4M, MEGACellType.ITEM); @@ -72,13 +75,13 @@ private static RegistryObject component(MEGACellTier cellTier) { () -> new StorageComponentItem(props, cellTier.kbFactor())); } - private static RegistryObject cell(RegistryObject component, MEGACellTier tier, MEGACellType type) { - return ITEMS.register(type.affix + "_storage_cell_" + tier.affix, - () -> new MEGAStorageCell(props.stacksTo(1), component.get(), tier, type)); + private static RegistryObject cell(MEGACellTier tier, IMEGACellType type) { + return ITEMS.register(type.affix() + "_storage_cell_" + tier.affix, + () -> new MEGAStorageCell(props.stacksTo(1), tier, type)); } - private static RegistryObject portable(MEGACellTier tier, MEGACellType type) { - return ITEMS.register("portable_" + type.affix + "_cell_" + tier.affix, + private static RegistryObject portable(MEGACellTier tier, IMEGACellType type) { + return ITEMS.register("portable_" + type.affix() + "_cell_" + tier.affix, () -> new MEGAPortableCell(props.stacksTo(1), tier, type)); } diff --git a/src/main/java/ninety/megacells/item/MEGAPortableCell.java b/src/main/java/ninety/megacells/item/MEGAPortableCell.java index 8548a91e..ff2c9caa 100644 --- a/src/main/java/ninety/megacells/item/MEGAPortableCell.java +++ b/src/main/java/ninety/megacells/item/MEGAPortableCell.java @@ -5,6 +5,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import ninety.megacells.item.util.IMEGACellType; +import ninety.megacells.item.util.MEGACellTier; import ninety.megacells.util.MEGACellsUtil; import appeng.api.upgrades.IUpgradeInventory; @@ -15,10 +17,10 @@ public class MEGAPortableCell extends PortableCellItem { public final MEGACellTier tier; - public final MEGACellType type; + public final IMEGACellType type; - public MEGAPortableCell(Properties props, MEGACellTier tier, MEGACellType type) { - super(type.key, type.portableMenu, makePortableTier(tier), props); + public MEGAPortableCell(Properties props, MEGACellTier tier, IMEGACellType type) { + super(type.keyType(), type.portableCellMenu(), makePortableTier(tier), props); this.tier = tier; this.type = type; } diff --git a/src/main/java/ninety/megacells/item/MEGAStorageCell.java b/src/main/java/ninety/megacells/item/MEGAStorageCell.java index ec606cc3..c1d8e116 100644 --- a/src/main/java/ninety/megacells/item/MEGAStorageCell.java +++ b/src/main/java/ninety/megacells/item/MEGAStorageCell.java @@ -1,17 +1,19 @@ package ninety.megacells.item; -import net.minecraft.world.level.ItemLike; +import ninety.megacells.item.util.IMEGACellType; +import ninety.megacells.item.util.MEGACellTier; +import ninety.megacells.item.util.MEGACellType; import appeng.items.storage.BasicStorageCell; public class MEGAStorageCell extends BasicStorageCell { private final MEGACellTier tier; - private final MEGACellType type; + private final IMEGACellType type; - public MEGAStorageCell(Properties properties, ItemLike coreItem, MEGACellTier tier, MEGACellType type) { - super(properties, coreItem, type.getHousing(), 2.5f + 0.5f * tier.index, tier.kbFactor(), - tier.kbFactor() * 8, type == MEGACellType.ITEM ? 63 : 5, type.key); + public MEGAStorageCell(Properties properties, MEGACellTier tier, IMEGACellType type) { + super(properties, tier.getComponent(), type.housing(), 2.5f + 0.5f * tier.index, tier.kbFactor(), + tier.kbFactor() * 8, type == MEGACellType.ITEM ? 63 : 5, type.keyType()); this.tier = tier; this.type = type; } @@ -20,7 +22,7 @@ public MEGACellTier getTier() { return this.tier; } - public MEGACellType getType() { + public IMEGACellType getType() { return this.type; } diff --git a/src/main/java/ninety/megacells/item/util/IMEGACellType.java b/src/main/java/ninety/megacells/item/util/IMEGACellType.java new file mode 100644 index 00000000..809c0dd6 --- /dev/null +++ b/src/main/java/ninety/megacells/item/util/IMEGACellType.java @@ -0,0 +1,26 @@ +package ninety.megacells.item.util; + +import java.util.List; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.Item; + +import appeng.api.stacks.AEKeyType; +import appeng.menu.me.common.MEStorageMenu; + +public interface IMEGACellType { + AEKeyType keyType(); + + String affix(); + + Item housing(); + + TagKey housingMaterial(); + + MenuType portableCellMenu(); + + List getCells(); + + List getPortableCells(); +} diff --git a/src/main/java/ninety/megacells/item/MEGACellTier.java b/src/main/java/ninety/megacells/item/util/MEGACellTier.java similarity index 84% rename from src/main/java/ninety/megacells/item/MEGACellTier.java rename to src/main/java/ninety/megacells/item/util/MEGACellTier.java index 61329a7a..51b30670 100644 --- a/src/main/java/ninety/megacells/item/MEGACellTier.java +++ b/src/main/java/ninety/megacells/item/util/MEGACellTier.java @@ -1,7 +1,9 @@ -package ninety.megacells.item; +package ninety.megacells.item.util; import net.minecraft.world.item.Item; +import ninety.megacells.item.MEGAItems; + public enum MEGACellTier { _1M(1, "1m"), _4M(2, "4m"), @@ -9,8 +11,8 @@ public enum MEGACellTier { _64M(4, "64m"), _256M(5, "256m"); - final int index; - final String affix; + public final int index; + public final String affix; MEGACellTier(int index, String affix) { this.index = index; @@ -30,5 +32,4 @@ public Item getComponent() { case _256M -> MEGAItems.CELL_COMPONENT_256M.get(); }; } - } diff --git a/src/main/java/ninety/megacells/item/MEGACellType.java b/src/main/java/ninety/megacells/item/util/MEGACellType.java similarity index 79% rename from src/main/java/ninety/megacells/item/MEGACellType.java rename to src/main/java/ninety/megacells/item/util/MEGACellType.java index 4f3d607e..5479d98b 100644 --- a/src/main/java/ninety/megacells/item/MEGACellType.java +++ b/src/main/java/ninety/megacells/item/util/MEGACellType.java @@ -1,4 +1,4 @@ -package ninety.megacells.item; +package ninety.megacells.item.util; import java.util.List; @@ -6,15 +6,15 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.Item; +import ninety.megacells.item.MEGAItems; + import appeng.api.stacks.AEKeyType; import appeng.datagen.providers.tags.ConventionTags; import appeng.menu.me.common.MEStorageMenu; -public enum MEGACellType { +public enum MEGACellType implements IMEGACellType { ITEM(AEKeyType.items(), "item", ConventionTags.IRON_INGOT, MEStorageMenu.PORTABLE_ITEM_CELL_TYPE), - FLUID(AEKeyType.fluids(), "fluid", ConventionTags.COPPER_INGOT, MEStorageMenu.PORTABLE_FLUID_CELL_TYPE), - // CHEM(MekanismKeyType.TYPE, "chemical", AMItems.CHEMICAL_CELL_HOUSING.get(), AMMenus.PORTABLE_CHEMICAL_CELL_TYPE) - ; + FLUID(AEKeyType.fluids(), "fluid", ConventionTags.COPPER_INGOT, MEStorageMenu.PORTABLE_FLUID_CELL_TYPE); public final AEKeyType key; public final String affix; @@ -28,13 +28,33 @@ public enum MEGACellType { this.portableMenu = portableMenu; } - public Item getHousing() { + @Override + public AEKeyType keyType() { + return this.key; + } + + @Override + public String affix() { + return this.affix; + } + + public Item housing() { return switch (this) { case ITEM -> MEGAItems.MEGA_ITEM_CELL_HOUSING.get(); case FLUID -> MEGAItems.MEGA_FLUID_CELL_HOUSING.get(); }; } + @Override + public TagKey housingMaterial() { + return this.housingMaterial; + } + + @Override + public MenuType portableCellMenu() { + return this.portableMenu; + } + public List getCells() { return switch (this) { case ITEM -> List.of(MEGAItems.ITEM_CELL_1M.get(), MEGAItems.ITEM_CELL_4M.get(), diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index bf37c969..161085f5 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -20,6 +20,13 @@ ME Greater Accumulation Cells - For when kilobytes just won't do. ordering="AFTER" side="BOTH" +[[dependencies.megacells]] + modId="appmek" + mandatory=false + versionRange = "(,2.0.0)" + ordering="AFTER" + side="BOTH" + [[dependencies.megacells]] modId="forge" mandatory=true diff --git a/src/main/resources/assets/megacells/lang/en_us.json b/src/main/resources/assets/megacells/lang/en_us.json index d1119732..0353518a 100644 --- a/src/main/resources/assets/megacells/lang/en_us.json +++ b/src/main/resources/assets/megacells/lang/en_us.json @@ -3,6 +3,7 @@ "item.megacells.mega_item_cell_housing": "MEGA Item Cell Housing", "item.megacells.mega_fluid_cell_housing": "MEGA Fluid Cell Housing", + "item.megacells.mega_chemical_cell_housing": "MEGA Chemical Cell Housing", "item.megacells.cell_component_1m": "1M MEGA Storage Component", "item.megacells.cell_component_4m": "4M MEGA Storage Component", @@ -22,6 +23,12 @@ "item.megacells.fluid_storage_cell_64m": "64M MEGA Fluid Storage Cell", "item.megacells.fluid_storage_cell_256m": "256M MEGA Fluid Storage Cell", + "item.megacells.chemical_storage_cell_1m": "1M MEGA Chemical Storage Cell", + "item.megacells.chemical_storage_cell_4m": "4M MEGA Chemical Storage Cell", + "item.megacells.chemical_storage_cell_16m": "16M MEGA Chemical Storage Cell", + "item.megacells.chemical_storage_cell_64m": "64M MEGA Chemical Storage Cell", + "item.megacells.chemical_storage_cell_256m": "256M MEGA Chemical Storage Cell", + "item.megacells.portable_item_cell_1m": "1M Portable Item Cell", "item.megacells.portable_item_cell_4m": "4M Portable Item Cell", "item.megacells.portable_item_cell_16m": "16M Portable Item Cell", @@ -32,5 +39,11 @@ "item.megacells.portable_fluid_cell_4m": "4M Portable Fluid Cell", "item.megacells.portable_fluid_cell_16m": "16M Portable Fluid Cell", "item.megacells.portable_fluid_cell_64m": "64M Portable Fluid Cell", - "item.megacells.portable_fluid_cell_256m": "256M Portable Fluid Cell" + "item.megacells.portable_fluid_cell_256m": "256M Portable Fluid Cell", + + "item.megacells.portable_chemical_cell_1m": "1M Portable Chemical Cell", + "item.megacells.portable_chemical_cell_4m": "4M Portable Chemical Cell", + "item.megacells.portable_chemical_cell_16m": "16M Portable Chemical Cell", + "item.megacells.portable_chemical_cell_64m": "64M Portable Chemical Cell", + "item.megacells.portable_chemical_cell_256m": "256M Portable Chemical Cell" } diff --git a/src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_16m.png b/src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_16m.png new file mode 100644 index 0000000000000000000000000000000000000000..e34b50a7684adf42cf1ae80ffc56d2d9c7cd0622 GIT binary patch literal 8595 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_256m.png b/src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_256m.png new file mode 100644 index 0000000000000000000000000000000000000000..39a28f0abb0cc8cb7098b5a88d0d2a7afd10a26b GIT binary patch literal 8251 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_4m.png b/src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_4m.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e3f48123ac00a64171e1512d89898a0ffda61c GIT binary patch literal 8623 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 L`?%%1gf9LUR3m9C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_64m.png b/src/main/resources/assets/megacells/textures/block/drive/cells/chemical_storage_cell_64m.png new file mode 100644 index 0000000000000000000000000000000000000000..ec42e59b158b186a2b912ae10f3b8352dba71f12 GIT binary patch literal 8391 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/item/chemical_storage_cell_16m.png b/src/main/resources/assets/megacells/textures/item/chemical_storage_cell_16m.png new file mode 100644 index 0000000000000000000000000000000000000000..dba980e5e77fe9a751ee92e30be60ea886010a3e GIT binary patch literal 845 zcmV-T1G4;yP)EX>4Tx04R}tkv&MmP!xqvTT4Y+6zm}4kfAzRkSgM+RVYG*P%E_RVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`qmz@Oigel zkz)ZhsE`~#_#gb9ty!E*xJlt85PY%ik5M4B3$z-x{e5iPtrH;d3|wg)f2|43e3IVi zXt5)pe;c^C?r8EJaJd5vJ?WAmIZ}X@zgPs`&*+=-z~C*=x8}~ReU8%yAWO4K-v9@P zz*vd0*FE0d+da2`d)o8+0YheTl!ehg_y7O^24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&G05DN*gO~;J@00Bu!L_t(I%cYaCO9D|G$3O49 z$*zXD*$AX1Tto*&3j7BOY^bTW#- z0s$PWh*nq(l?aHt+xth9sxLzzfRl=#Rr;Y44dC?rid=FQfOIyGV-;~y5u8-SmpE3@ zm&;CN*8<`$?i*9{%WQ5e`JI$6_5!z)S=;s3-eCtjD+7U6>0_)Hh9oNR@Z<~tyM8SN zdMtrmD=8%^(94%VzJf~P9ao>pVb@B2 zHENhFRNuLo3xYBqLJu}IkYLD4uiN4-X=1nQ0dVXr=&=M*!=%%ARD!>lMsE@uO3=$E Xp%bensE1UQ00000NkvXXu0mjfj1P92 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/item/chemical_storage_cell_1m.png b/src/main/resources/assets/megacells/textures/item/chemical_storage_cell_1m.png new file mode 100644 index 0000000000000000000000000000000000000000..408e8b94ae7dae984eab653b1d92c053753a7386 GIT binary patch literal 835 zcmV-J1HAl+P)EX>4Tx04R}tkv&MmP!xqvTT4Y+6zm}4kfAzRkSgM+RVYG*P%E_RVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`qmz@Oigel zkz)ZhsE`~#_#gb9ty!E*xJlt85PY%ik5M4B3$z-x{e5iPtrH;d3|wg)f2|43e3IVi zXt5)pe;c^C?r8EJaJd5vJ?WAmIZ}X@zgPs`&*+=-z~C*=x8}~ReU8%yAWO4K-v9@P zz*vd0*FE0d+da2`d)o8+0YheTl!ehg_y7O^24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&G05D5VLryZ*R00BQqL_t(I%cavXNW(xFK;d_8 zfl2~ZX&1L5b#U(@=_oE1L{LG&Rd5ioxQIA7bZ~QURH}lA7DOB)F4n=tr9&x*MI%VS ziX~$lngq{Y8o_@$65dC`-N8Rc^n9zEUbt@Eh`$4VIJa5~A06+mD-jVFTGtokCkl~> z=oJENKOe9;ycmfHbkjSkTyk|=>k0vqnug=Lk%&Myy-cpaR&gmr^7~UHHBI`vC`6!} z-uXb2VrE4`rVnQ&;B4U}Tu+W?0hrH^5(19vQW`6EA*yg~V+R1cTJ8YpY>vJ6QzfDb zgXsYNE~t=Teuv#a1k!H|VLv^RFj9Pdyh-t=^Fq6B(f9MH+O<2D2WO-mNEj(bD)&-o zSIe~P7SI$zb&S*590?;OeZgzv!H)o%BK9r>NK_bq8-ttJYAC~Cz5&ucv@OmW#9jaZ N002ovPDHLkV1g*~XjuRN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/item/chemical_storage_cell_256m.png b/src/main/resources/assets/megacells/textures/item/chemical_storage_cell_256m.png new file mode 100644 index 0000000000000000000000000000000000000000..673eeb3ca0b3775a90cb0be8f8681024b499f222 GIT binary patch literal 819 zcmV-31I+x1P)EX>4Tx04R}tkv&MmP!xqvTT4Y+6zm}4kfAzRkSgM+RVYG*P%E_RVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`qmz@Oigel zkz)ZhsE`~#_#gb9ty!E*xJlt85PY%ik5M4B3$z-x{e5iPtrH;d3|wg)f2|43e3IVi zXt5)pe;c^C?r8EJaJd5vJ?WAmIZ}X@zgPs`&*+=-z~C*=x8}~ReU8%yAWO4K-v9@P zz*vd0*FE0d+da2`d)o8+0YheTl!ehg_y7O^24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&G05DYgyZA{?+00A#aL_t(I%cYaAPs2bIfWKQX zG_aW^6*EnkAzMNa4fr;Q1<5}!0d{HvfvP~Dub3ZM&wts@TW-x_y$mVi5?0Wg9QKp002ovPDHLkV1kxgXXpR` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/item/chemical_storage_cell_4m.png b/src/main/resources/assets/megacells/textures/item/chemical_storage_cell_4m.png new file mode 100644 index 0000000000000000000000000000000000000000..a93c1f12b43547d262d6cd2df041d343657e6a29 GIT binary patch literal 854 zcmV-c1F8IpP)EX>4Tx04R}tkv&MmP!xqvTT4Y+6zm}4kfAzRkSgM+RVYG*P%E_RVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`qmz@Oigel zkz)ZhsE`~#_#gb9ty!E*xJlt85PY%ik5M4B3$z-x{e5iPtrH;d3|wg)f2|43e3IVi zXt5)pe;c^C?r8EJaJd5vJ?WAmIZ}X@zgPs`&*+=-z~C*=x8}~ReU8%yAWO4K-v9@P zz*vd0*FE0d+da2`d)o8+0YheTl!ehg_y7O^24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&G05DEr4>FZqp00B}-L_t(I%cYYsNW(xBhQAX# zRpKI@gwi26IF&3)7mFYS+#D3at#r{%C+Q@Di!P#z1i?)QI~6*KE-5Y&5bV;S28CLO z3PBeOjYFD~G)XJ?Pmepk?;h{&;GYpgcN1Ax)?G{dUC;;hVo5Gl&-NoFViaiJR>|e{ zScw=00+`Tmw zA?13pB)b+Qvaa)OF*Co*_U4-GEX>4Tx04R}tkv&MmP!xqvTT4Y+6zm}4kfAzRkSgM+RVYG*P%E_RVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`qmz@Oigel zkz)ZhsE`~#_#gb9ty!E*xJlt85PY%ik5M4B3$z-x{e5iPtrH;d3|wg)f2|43e3IVi zXt5)pe;c^C?r8EJaJd5vJ?WAmIZ}X@zgPs`&*+=-z~C*=x8}~ReU8%yAWO4K-v9@P zz*vd0*FE0d+da2`d)o8+0YheTl!ehg_y7O^24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&G05DWqF*V%Xg00A{gL_t(I%cYY&NW(xBfWPbD z&T#I_~cK?%v&d@XrwW%VzjB9*92(BCtBQoX*^w>?$SVNAU8D>eQ@OBJx0h zi4~vTj;oajFhjTLadCB@0Rc*Og~$G#RwBR*8K1#jnolK#$yG{rMM_R5DF8SdNB9TF zH0oslhMiXCS%;lg3ODLy+@=Q*3NS-w`z<ox)h{R4X!!eoR)vUuvmB)lfj@3 zbOD4=mT|ELh9%$NxtBmv1?zhumgvA=bYs$qgWP?eWEq%*n=e8p00000NkvXXu0mjf DVx4Vc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/item/mega_chemical_cell_housing.png b/src/main/resources/assets/megacells/textures/item/mega_chemical_cell_housing.png new file mode 100644 index 0000000000000000000000000000000000000000..ad30ee13f9449cf54acbd610b438b67d850e99a8 GIT binary patch literal 812 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/item/portable_chemical_cell_1m.png b/src/main/resources/assets/megacells/textures/item/portable_chemical_cell_1m.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf50313601565aaf11eb2948bf1c7259b4081ca GIT binary patch literal 5862 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/item/portable_chemical_cell_4m.png b/src/main/resources/assets/megacells/textures/item/portable_chemical_cell_4m.png new file mode 100644 index 0000000000000000000000000000000000000000..90fbf8fde3e3c7f0349781d0a5ab636d648c5a7c GIT binary patch literal 5765 zcmeI0XIK+i7srFrq^Jl8BC8=FqL`jQl1;!65F;QMSc;&SGJ#N%m;?w#U_}tHQDqfS z6brhdB8Z@LWtHA#0TEwOY=}}6SW({zsH@MrUwoc-znMHUnYs7e-#zDl&zzY_g41SO zbrn4o2n3=|-)PMMe;3O(Wkqnma{MC`0#RUvxwuOh%n+zhB;fJ_0H`EX2tWZTj|+iF zd-L6SDQ}F`W?I&WC_Iv@_Y2{?aSq;_)LZ6ZVeS)rtFTq?bY^ zDq@`_`!3y4gpS|dfLXi3dr5SS`HDAPwB-x*$C@3xQ=@(D^G5Pp=bO46xIdZcQ>-u0 z2o;G+>aV?zn+bPa*gfD8eBFQMPw%n=s%@#0PXznV47y`oleb0xesg5refBxIG; zKWb^pP_(7DTT?|8-;f%erKCn<&nBh=vsA`kX=X_VZ)oRxKI_R?RQ5Dr3Hwo#a3$AHA5zCN1n3d(SG*m-}9U=QFG55HzlM( zd4Fj!?2j_)mziO4K8?+b@01FYA10cwN^>tdm10`#7}VA6#O^xk$G>;VAgZX9)p2<1 zNM}L%^%oU;SKN5pIbP+uoE5h`a*xK|gSfHU-ZO6=zmLZEUKp+J)Y`A(|MbA93l*C^ zRkuu;J*d3@HeJpP=h%E9MNB@DnbmVEUZn-{Y_-n;WA={LAeQCRN6oKU63nFOeS68G zveDxhALF2vn92ISpYQgPQ+esb zM|WN_iBcYGTRB8Swfn54;d|`(%0F3@d61S*(3Hk@jro zi47X9{+F3rij!9UKJpEEOdhSBxABGgzMr!>O-(xNK9i+x$HlAg{Y+ImoW`5qvR2=- zRA}oK4v_}y%r{K&Y*p2DoP&!_;pDgdqQ8v&MqBbn$?{Ux_Qsn?8;X-Ey65yc(K-Zo zYd$wwNi^Y~r>K?5ZcKvDhjNOkCY72anO0RDnL_(r4U!zI^CYLzH0O*fTA|MkdRBF< z0eXu`dc3LP4RJNZP5u0jYI~_4xV$Dr3~S)8_s;_|qxmb$JTHV7!X?cNWZ;oQg!qYJ zg@fuIIoZ;}yW%SakDG2Kk#%w+O)q<2c+6WfXjcX-gb#EzT#^I$suTZZ8!khhX^;DlZ=ykZMEru5VXT4{p)%e1c zJW( zq1*OOk6LX{vSi^dK?l;kSrzT4r-@S^Yer&-oXlFe%7j{PZf`IJ+BMp~y}#R|>`b;F z{GvfoTjQ<4?I$W5rUqW-CU1Ur5ZAhkGD-}_Us^kJ@7h>3U%sy?#(SioA~sB=%*xD? zcy)zGNl4D3vxk~8HgC?i}8 zp$Z$%u5xVn=$Nc_kMpF`=!3#t)1C9p=!Ml_(cSTn)s`oeuw~VjLa$SgMyb8?Nj#Wz ziyGK%F#US4`a?~=d~v{Z(u+t&?}m~cdv5PX|&Ik9h@O+S2AVeO((5bM^8JOty;s-he;<$9!YB- z=KW$~73*YL^nAxyyQOb?(y0=H%0&gGsHMLzL^NL~m8k4~uqZw^HTC4aG^sbkS7R{t z_B+C>V>iPmmqzj8@$fqcWW&zkk^>U>D)rq zUiz@e|I}}HT0`4!S`JUyi0U4lk4|RG;q#L8EvHt_9Lx8}vM-_k$7pdx!OKHiphc=h zdd2T|1@z@>LSL(S@qUWRU(gtla{sAsfniS6@{*Df-?0_K()ntXXDJ3mM)cuIclrA* zPcz4=9>80#4K?TQI@qBEwJY2-08!do<(_b*n{vOuk8&+4ym$Pa9E~eVJ1}p;61)ZL z@xWWHyMsN6EeJ#~IRX}dkOm6DtbjnsmQo>;?GH$xEWn4yr@&s_sDwdz916@0?|^a; z(g0uH#xN1!9Jbko9p=v_a$uGgDr6}M1Ox&SCR7?2z!#IG6xb}61Rl$pkud12iNv1* zb9Zop(gY#^ibLQKD7cN37mR^fs6fdg4wuBR-tY+lo>5@F5{Zz6M23WfAVRPRfyf7m zCK8EA6b6aGz(EVRIFv78O5uF5p$sv{um;3z5tzz60Us)3GFgHk2?YiN`=Oux3lusy ze8Ka@pHu+#KuVcHBpQK21_mO(9wC<41cQ)I4*lZ@u?zUbf@A< zTe^eO7lJG#A6}qvHYiZMZzkigzt{f2<#k}!zOJ2iA*qYc!5kG04e1A%yMPRLIQ&Ug=Na} z6eQ2KgRzikB7i9oh+G7M018aThRTq$=?x{%Ey_lo7_g+_GR*Y0Py<$lu)1BdH=9j=4MPRz$IegW_WWH90#yD za3TtahXXhaiw&@uXaWZFEnO_&NpGo`lAjqR=E13Wod?Fj96^e~y@p{2xuovj$(40dU-08(3bzYK8n#u0Cld zlks2td|HctaRw0mW0LRE_lI0Ri#A%;LyHD#L|+^@eKw@#R}&!LnsoT`w%ZCxO>XpN1p_xj{rDw`O1^r=tKaEB8rSX7b-D+k zq*z3cmlJv-v_CQuuekcTeaJq;WZc~ZnP^e$AvexXT($nH#RZi^i%{k6P@=gFJfqtD zBBqjT*Maiz^j4^kH`SPTdU=}iqa}cF z&mY-w4@X&L_~F+Ll&1=RMMnKn7+K%?XlX7x+oN{S#^=a)_?gor;1!9qOnw zaCNKTVk8toBTQJ?{1&t>LL F`@cxi`V#;E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/megacells/textures/item/portable_chemical_cell_64m.png b/src/main/resources/assets/megacells/textures/item/portable_chemical_cell_64m.png new file mode 100644 index 0000000000000000000000000000000000000000..ff84be73f66f2cd59c9adcd5031a8dd9482298f5 GIT binary patch literal 6024 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