diff --git a/src/data/java/gripe/_90/megacells/datagen/MEGAModelProvider.java b/src/data/java/gripe/_90/megacells/datagen/MEGAModelProvider.java index 3449a9b3..999615ef 100644 --- a/src/data/java/gripe/_90/megacells/datagen/MEGAModelProvider.java +++ b/src/data/java/gripe/_90/megacells/datagen/MEGAModelProvider.java @@ -73,10 +73,12 @@ protected void registerStatesAndModels() { } cell(MEGAItems.BULK_ITEM_CELL); + cell(MEGAItems.BULK_FLUID_CELL); cell(MEGAItems.RADIOACTIVE_CHEMICAL_CELL); MEGAItems.getTieredCells().forEach(this::driveCell); driveCell(MEGAItems.BULK_ITEM_CELL, 0); + driveCell(MEGAItems.BULK_FLUID_CELL, 0); driveCell(MEGAItems.RADIOACTIVE_CHEMICAL_CELL, 2); simpleBlockWithItem(MEGABlocks.SKY_STEEL_BLOCK.block(), cubeAll(MEGABlocks.SKY_STEEL_BLOCK.block())); diff --git a/src/data/java/gripe/_90/megacells/datagen/MEGARecipeProvider.java b/src/data/java/gripe/_90/megacells/datagen/MEGARecipeProvider.java index 8dd19c18..fd6e94b4 100644 --- a/src/data/java/gripe/_90/megacells/datagen/MEGARecipeProvider.java +++ b/src/data/java/gripe/_90/megacells/datagen/MEGARecipeProvider.java @@ -245,6 +245,17 @@ protected void buildRecipes(@NotNull RecipeOutput output) { .define('d', Items.NETHERITE_INGOT) .unlockedBy("has_bulk_cell_component", has(MEGAItems.BULK_CELL_COMPONENT)) .save(output, MEGACells.makeId("cells/standard/bulk_item_cell")); + + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, MEGAItems.BULK_FLUID_CELL) + .pattern("aba") + .pattern("bcb") + .pattern("ddd") + .define('a', AEBlocks.QUARTZ_VIBRANT_GLASS) + .define('b', AEItems.SKY_DUST) + .define('c', MEGAItems.BULK_CELL_COMPONENT) + .define('d', MEGAItems.SKY_BRONZE_INGOT) + .unlockedBy("has_bulk_cell_component", has(MEGAItems.BULK_CELL_COMPONENT)) + .save(output, MEGACells.makeId("cells/standard/bulk_fluid_cell")); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, MEGABlocks.MEGA_ENERGY_CELL) .pattern("aaa") diff --git a/src/generated/resources/assets/megacells/lang/en_us.json b/src/generated/resources/assets/megacells/lang/en_us.json index fb27c89d..77b0a3b9 100644 --- a/src/generated/resources/assets/megacells/lang/en_us.json +++ b/src/generated/resources/assets/megacells/lang/en_us.json @@ -39,6 +39,7 @@ "item.megacells.accumulation_processor": "Accumulation Processor", "item.megacells.accumulation_processor_press": "Inscriber Accumulation Press", "item.megacells.bulk_cell_component": "MEGA Bulk Storage Component", + "item.megacells.bulk_fluid_cell": "MEGA Bulk Bottomless Storage Well", "item.megacells.bulk_item_cell": "MEGA Bulk Item Storage Cell", "item.megacells.cable_mega_emc_interface": "MEGA Transmutation Interface", "item.megacells.cable_mega_interface": "MEGA Interface", diff --git a/src/generated/resources/assets/megacells/models/block/drive/cells/bulk_fluid_cell.json b/src/generated/resources/assets/megacells/models/block/drive/cells/bulk_fluid_cell.json new file mode 100644 index 00000000..12d3e544 --- /dev/null +++ b/src/generated/resources/assets/megacells/models/block/drive/cells/bulk_fluid_cell.json @@ -0,0 +1,53 @@ +{ + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "cullface": "north", + "texture": "#cell", + "uv": [ + 6.0, + 0.0, + 0.0, + 2.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#cell", + "uv": [ + 0.0, + 0.0, + 6.0, + 2.0 + ] + }, + "up": { + "cullface": "north", + "texture": "#cell", + "uv": [ + 6.0, + 0.0, + 0.0, + 2.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 6, + 2, + 2 + ] + } + ], + "textures": { + "cell": "megacells:block/drive/cells/misc_cell", + "particle": "megacells:block/drive/cells/misc_cell" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/megacells/models/item/bulk_fluid_cell.json b/src/generated/resources/assets/megacells/models/item/bulk_fluid_cell.json new file mode 100644 index 00000000..b117ac6b --- /dev/null +++ b/src/generated/resources/assets/megacells/models/item/bulk_fluid_cell.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "megacells:item/bulk_fluid_cell", + "layer1": "ae2:item/storage_cell_led" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/megacells/advancement/recipes/misc/cells/standard/bulk_fluid_cell.json b/src/generated/resources/data/megacells/advancement/recipes/misc/cells/standard/bulk_fluid_cell.json new file mode 100644 index 00000000..f3ec7fc0 --- /dev/null +++ b/src/generated/resources/data/megacells/advancement/recipes/misc/cells/standard/bulk_fluid_cell.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_bulk_cell_component": { + "conditions": { + "items": [ + { + "items": "megacells:bulk_cell_component" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "megacells:cells/standard/bulk_fluid_cell" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_bulk_cell_component" + ] + ], + "rewards": { + "recipes": [ + "megacells:cells/standard/bulk_fluid_cell" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/megacells/recipe/cells/standard/bulk_fluid_cell.json b/src/generated/resources/data/megacells/recipe/cells/standard/bulk_fluid_cell.json new file mode 100644 index 00000000..eee1addf --- /dev/null +++ b/src/generated/resources/data/megacells/recipe/cells/standard/bulk_fluid_cell.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "a": { + "item": "ae2:quartz_vibrant_glass" + }, + "b": { + "item": "ae2:sky_dust" + }, + "c": { + "item": "megacells:bulk_cell_component" + }, + "d": { + "item": "megacells:sky_bronze_ingot" + } + }, + "pattern": [ + "aba", + "bcb", + "ddd" + ], + "result": { + "count": 1, + "id": "megacells:bulk_fluid_cell" + } +} \ No newline at end of file diff --git a/src/main/java/gripe/_90/megacells/client/MEGACellsClient.java b/src/main/java/gripe/_90/megacells/client/MEGACellsClient.java index 250eb2e2..f7d829c0 100644 --- a/src/main/java/gripe/_90/megacells/client/MEGACellsClient.java +++ b/src/main/java/gripe/_90/megacells/client/MEGACellsClient.java @@ -129,6 +129,10 @@ private static void initStorageCellModels(FMLCommonSetupEvent event) { StorageCellModels.registerModel( MEGAItems.BULK_ITEM_CELL, MEGACells.makeId(modelPrefix + MEGAItems.BULK_ITEM_CELL.id().getPath())); + + StorageCellModels.registerModel( + MEGAItems.BULK_FLUID_CELL, + MEGACells.makeId(modelPrefix + MEGAItems.BULK_FLUID_CELL.id().getPath())); StorageCellModels.registerModel( MEGAItems.RADIOACTIVE_CHEMICAL_CELL, @@ -146,6 +150,7 @@ private static void initItemColours(RegisterColorHandlersEvent.Item event) { } standardCells.add(MEGAItems.BULK_ITEM_CELL); + standardCells.add(MEGAItems.BULK_FLUID_CELL); standardCells.add(MEGAItems.RADIOACTIVE_CHEMICAL_CELL); event.register( diff --git a/src/main/java/gripe/_90/megacells/definition/MEGAItems.java b/src/main/java/gripe/_90/megacells/definition/MEGAItems.java index c1295cc3..49a510fc 100644 --- a/src/main/java/gripe/_90/megacells/definition/MEGAItems.java +++ b/src/main/java/gripe/_90/megacells/definition/MEGAItems.java @@ -13,6 +13,7 @@ import appeng.api.parts.IPart; import appeng.api.parts.IPartItem; import appeng.api.parts.PartModels; +import appeng.api.stacks.AEItemKey; import appeng.api.stacks.AEKeyType; import appeng.core.definitions.ItemDefinition; import appeng.items.materials.EnergyCardItem; @@ -103,7 +104,8 @@ public static List getTieredCells() { public static final ItemDefinition GREATER_ENERGY_CARD = item("Greater Energy Card", "greater_energy_card", p -> new EnergyCardItem(p, 8)); public static final ItemDefinition BULK_CELL_COMPONENT = item("MEGA Bulk Storage Component", "bulk_cell_component", MaterialItem::new); - public static final ItemDefinition BULK_ITEM_CELL = item("MEGA Bulk Item Storage Cell", "bulk_item_cell", BulkCellItem::new); + public static final ItemDefinition BULK_ITEM_CELL = item("MEGA Bulk Item Storage Cell", "bulk_item_cell", prop -> new BulkCellItem(prop, AEKeyType.items())); + public static final ItemDefinition BULK_FLUID_CELL = item("MEGA Bulk Bottomless Storage Well", "bulk_fluid_cell", prop -> new BulkCellItem(prop, AEKeyType.fluids())); public static final ItemDefinition COMPRESSION_CARD = item("Compression Card", "compression_card", UpgradeCardItem::new); public static final ItemDefinition> DECOMPRESSION_MODULE = part("MEGA Decompression Module", "decompression_module", DecompressionModulePart.class, DecompressionModulePart::new); diff --git a/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java b/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java index e6382387..2c677589 100644 --- a/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java +++ b/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java @@ -26,8 +26,8 @@ public class BulkCellInventory implements StorageCell { private final ISaveProvider container; private final ItemStack stack; - private AEItemKey storedItem; - private final AEItemKey filterItem; + private AEKey storedKey; + private final AEKey filterKey; private final boolean compressionEnabled; private CompressionChain compressionChain; @@ -46,15 +46,15 @@ public class BulkCellInventory implements StorageCell { this.container = container; var cell = (BulkCellItem) stack.getItem(); - filterItem = (AEItemKey) cell.getConfigInventory(stack).getKey(0); + filterKey = cell.getConfigInventory(stack).getKey(0); compressionEnabled = cell.getUpgrades(stack).isInstalled(MEGAItems.COMPRESSION_CARD); - storedItem = (AEItemKey) stack.get(MEGAComponents.BULK_CELL_ITEM); + storedKey = stack.get(MEGAComponents.BULK_CELL_ITEM); unitCount = stack.getOrDefault(MEGAComponents.BULK_CELL_UNIT_COUNT, BigInteger.ZERO); - var determiningItem = storedItem != null ? storedItem : filterItem; - compressionChain = CompressionService.getChain(determiningItem); - + var determiningItem = storedKey != null ? storedKey : filterKey; + compressionChain = CompressionService.getChain(determiningItem instanceof AEItemKey itemKey ? itemKey : null); + unitFactor = compressionChain.unitFactor(determiningItem); var recordedFactor = stack.getOrDefault(MEGAComponents.BULK_CELL_UNIT_FACTOR, unitFactor); @@ -68,12 +68,12 @@ public class BulkCellInventory implements StorageCell { int recordedCutoff = stack.getOrDefault(MEGAComponents.BULK_CELL_COMPRESSION_CUTOFF, maxCutoff); compressionCutoff = recordedCutoff < 0 ? maxCutoff : Math.min(recordedCutoff, maxCutoff); - compressedStacks = compressionChain.initStacks(unitCount, compressionCutoff, determiningItem); + compressedStacks = compressionChain.initStacks(unitCount, compressionCutoff, determiningItem instanceof AEItemKey i ? i : null); } @Override public CellState getStatus() { - if (storedItem == null || unitCount.signum() < 1) { + if (storedKey == null || unitCount.signum() < 1) { return CellState.EMPTY; } @@ -84,34 +84,34 @@ public CellState getStatus() { return CellState.NOT_EMPTY; } - AEItemKey getStoredItem() { - return storedItem; + AEKey getStoredKey() { + return storedKey; } long getStoredQuantity() { return CompressionChain.clamp(unitCount.divide(unitFactor), Long.MAX_VALUE); } - AEItemKey getFilterItem() { - return filterItem; + AEKey getFilterKey() { + return filterKey; } private boolean isFilterMismatched() { - if (storedItem == null) { + if (storedKey == null) { return false; } - if (storedItem.equals(filterItem)) { + if (storedKey.equals(filterKey)) { return false; } - if (filterItem == null) { + if (filterKey == null) { return true; } - if (compressionChain.containsVariant(filterItem)) { - storedItem = filterItem; - unitFactor = compressionChain.unitFactor(storedItem); + if (filterKey instanceof AEItemKey itemFilter && compressionChain.containsVariant(itemFilter)) { + storedKey = filterKey; + unitFactor = compressionChain.unitFactor(storedKey); saveChanges(); return false; } @@ -132,7 +132,7 @@ long getTraceUnits() { } public List getDecompressionPatterns() { - if (filterItem == null || !compressionEnabled || !hasCompressionChain() || isFilterMismatched()) { + if (filterKey == null || !compressionEnabled || !hasCompressionChain() || isFilterMismatched()) { return List.of(); } @@ -150,7 +150,7 @@ public double getIdleDrain() { @Override public long insert(AEKey what, long amount, Actionable mode, IActionSource source) { - if (amount == 0 || !(what instanceof AEItemKey item)) { + if (amount == 0) { return 0; } @@ -158,16 +158,18 @@ public long insert(AEKey what, long amount, Actionable mode, IActionSource sourc return 0; } - if (!item.equals(filterItem) && (!compressionEnabled || !compressionChain.containsVariant(item))) { - return 0; + if (!what.equals(filterKey)) { + if (!(what instanceof AEItemKey item) || !compressionEnabled || !compressionChain.containsVariant(item)) { + return 0; + } } - var factor = compressionChain.unitFactor(item); + var factor = compressionChain.unitFactor(what); var units = BigInteger.valueOf(amount).multiply(factor); if (mode == Actionable.MODULATE) { - if (storedItem == null) { - storedItem = filterItem; + if (storedKey == null) { + storedKey = filterKey; } unitCount = unitCount.add(units); @@ -180,29 +182,31 @@ public long insert(AEKey what, long amount, Actionable mode, IActionSource sourc @Override public long extract(AEKey what, long amount, Actionable mode, IActionSource source) { - if (storedItem == null || unitCount.signum() < 1 || !(what instanceof AEItemKey item)) { + if (storedKey == null || unitCount.signum() < 1) { return 0; } - if (!compressionChain.containsVariant(item) && !item.equals(storedItem)) { - return 0; + if (!what.equals(storedKey)) { + if (!(what instanceof AEItemKey item) || !compressionChain.containsVariant(item)) { + return 0; + } } if (isFilterMismatched()) { - amount = Math.min(amount, getAvailableStacks().get(item)); - } else if (!compressionEnabled && !item.equals(storedItem)) { + amount = Math.min(amount, getAvailableStacks().get(what)); + } else if (!compressionEnabled && !what.equals(storedKey)) { return 0; } - var factor = compressionChain.unitFactor(item); + var factor = compressionChain.unitFactor(what); var units = BigInteger.valueOf(amount).multiply(factor).min(unitCount); if (mode == Actionable.MODULATE) { unitCount = unitCount.subtract(units).max(BigInteger.ZERO); if (unitCount.signum() < 1) { - storedItem = null; - var filterChain = CompressionService.getChain(filterItem); + storedKey = null; + var filterChain = (filterKey instanceof AEItemKey fi) ? CompressionService.getChain(fi) : CompressionService.getChain(null); if (compressionChain != filterChain) { compressionChain = filterChain; @@ -233,13 +237,13 @@ public void persist() { return; } - if (storedItem == null || unitCount.signum() < 1) { + if (storedKey == null || unitCount.signum() < 1) { stack.remove(MEGAComponents.BULK_CELL_ITEM); stack.remove(MEGAComponents.BULK_CELL_UNIT_COUNT); stack.remove(MEGAComponents.BULK_CELL_UNIT_FACTOR); stack.remove(MEGAComponents.BULK_CELL_COMPRESSION_CUTOFF); } else { - stack.set(MEGAComponents.BULK_CELL_ITEM, storedItem); + stack.set(MEGAComponents.BULK_CELL_ITEM, storedKey); stack.set(MEGAComponents.BULK_CELL_UNIT_COUNT, unitCount); stack.set(MEGAComponents.BULK_CELL_UNIT_FACTOR, unitFactor); stack.set(MEGAComponents.BULK_CELL_COMPRESSION_CUTOFF, compressionCutoff); @@ -276,20 +280,20 @@ ItemStack getLowestVariant() { @Override public void getAvailableStacks(KeyCounter out) { if (needsStackUpdate) { - var determiningItem = storedItem != null ? storedItem : filterItem; - compressedStacks = compressionChain.initStacks(unitCount, compressionCutoff, determiningItem); + var determiningItem = storedKey != null ? storedKey : filterKey; + compressedStacks = compressionChain.initStacks(unitCount, compressionCutoff, determiningItem instanceof AEItemKey i ? i : null); needsStackUpdate = false; } - if (storedItem != null) { + if (storedKey != null) { if (compressionEnabled) { compressedStacks.forEach(out::add); } else { - out.add(storedItem, CompressionChain.clamp(unitCount.divide(unitFactor), CompressionChain.STACK_LIMIT)); + out.add(storedKey, CompressionChain.clamp(unitCount.divide(unitFactor), CompressionChain.STACK_LIMIT)); if (isFilterMismatched()) { compressedStacks.keySet().stream() - .takeWhile(i -> !storedItem.equals(i)) + .takeWhile(i -> !storedKey.equals(i)) .forEach(i -> out.add(i, compressedStacks.get(i))); } } @@ -298,13 +302,16 @@ public void getAvailableStacks(KeyCounter out) { @Override public boolean isPreferredStorageFor(AEKey what, IActionSource source) { - return what instanceof AEItemKey item - && (item.equals(storedItem) || item.equals(filterItem) || compressionChain.containsVariant(item)); + if (what.equals(storedKey) || what.equals(filterKey)) { + return true; + } + + return what instanceof AEItemKey item && compressionEnabled && compressionChain.containsVariant(item); } @Override public boolean canFitInsideCell() { - return filterItem == null && storedItem == null && unitCount.signum() < 1; + return filterKey == null && storedKey == null && unitCount.signum() < 1; } @Override diff --git a/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java b/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java index 66945b97..bcb67afe 100644 --- a/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java +++ b/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java @@ -37,8 +37,11 @@ public class BulkCellItem extends AEBaseItem implements ICellWorkbenchItem { private static final ICellHandler HANDLER = new Handler(); - public BulkCellItem(Properties properties) { + private final AEKeyType keyType; + + public BulkCellItem(Properties properties, AEKeyType keyType) { super(properties.stacksTo(1)); + this.keyType = keyType; } public static void registerHandler() { @@ -47,12 +50,12 @@ public static void registerHandler() { @Override public ConfigInventory getConfigInventory(ItemStack is) { - return CellConfig.create(Set.of(AEKeyType.items()), is, 1); + return CellConfig.create(Set.of(keyType), is, 1); } @Override public IUpgradeInventory getUpgrades(ItemStack is) { - return UpgradeInventories.forItem(is, 1); + return UpgradeInventories.forItem(is, this.keyType.equals(AEKeyType.items()) ? 1 : 0); } @ParametersAreNonnullByDefault @@ -61,8 +64,8 @@ public void appendHoverText(ItemStack is, TooltipContext context, List 0) { lines.add(Tooltips.of( - inv.isCompressionEnabled() + inv.isCompressionEnabled() && inv.hasCompressionChain() ? MEGATranslations.TraceUnits.text( Tooltips.ofNumber(trace), inv.getLowestVariant().getHoverName()) @@ -107,7 +112,7 @@ public void appendHoverText(ItemStack is, TooltipContext context, List getTooltipImage(@NotNull ItemStack is) { } if (AEConfig.instance().isTooltipShowCellContent()) { - if (inv.getStoredItem() != null) { - content.add(new GenericStack(inv.getStoredItem(), inv.getStoredQuantity())); - } else if (inv.getFilterItem() != null) { - content.add(new GenericStack(inv.getFilterItem(), 0)); + if (inv.getStoredKey() != null) { + content.add(new GenericStack(inv.getStoredKey(), inv.getStoredQuantity())); + } else if (inv.getFilterKey() != null) { + content.add(new GenericStack(inv.getFilterKey(), 0)); } } @@ -157,7 +162,7 @@ private Handler() {} @Override public boolean isCell(ItemStack is) { - return is != null && is.is(MEGAItems.BULK_ITEM_CELL.asItem()); + return is != null && is.getItem() instanceof BulkCellItem; } @Nullable diff --git a/src/main/java/gripe/_90/megacells/misc/CompressionChain.java b/src/main/java/gripe/_90/megacells/misc/CompressionChain.java index 5a08f68b..5724fa54 100644 --- a/src/main/java/gripe/_90/megacells/misc/CompressionChain.java +++ b/src/main/java/gripe/_90/megacells/misc/CompressionChain.java @@ -7,6 +7,8 @@ import java.util.Objects; import java.util.function.Supplier; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.AEKeyType; import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.objects.Object2LongLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -59,8 +61,8 @@ public ItemStack getItem(int index) { return variants.get(index).copy(); } - public BigInteger unitFactor(AEItemKey item) { - if (item == null) { + public BigInteger unitFactor(AEKey keyType) { + if (!(keyType instanceof AEItemKey item)) { return BigInteger.ONE; } diff --git a/src/main/java/gripe/_90/megacells/misc/CompressionService.java b/src/main/java/gripe/_90/megacells/misc/CompressionService.java index 0e700821..92661604 100644 --- a/src/main/java/gripe/_90/megacells/misc/CompressionService.java +++ b/src/main/java/gripe/_90/megacells/misc/CompressionService.java @@ -27,6 +27,7 @@ import appeng.api.networking.GridServices; import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.AEKey; import gripe._90.megacells.definition.MEGADataMaps; public class CompressionService { @@ -65,13 +66,13 @@ public static void init() { /** * Retrieves a compression chain containing a given item as any of its "variants". * - * @param item The item to retrieve a corresponding chain for. + * @param what The item to retrieve a corresponding chain for if it is an ItemKey. * @return The {@link CompressionChain} corresponding to this item, or the {@code EMPTY} chain if no real chain * exists for it or the given item was {@code null}. */ @NotNull - public static CompressionChain getChain(@Nullable AEItemKey item) { - if (item == null) { + public static CompressionChain getChain(@Nullable AEKey what) { + if (!(what instanceof AEItemKey item)) { return EMPTY; } diff --git a/src/main/resources/assets/megacells/textures/item/bulk_fluid_cell.png b/src/main/resources/assets/megacells/textures/item/bulk_fluid_cell.png new file mode 100644 index 00000000..cdf59c6a Binary files /dev/null and b/src/main/resources/assets/megacells/textures/item/bulk_fluid_cell.png differ