From db6ffaff009f81b80297c5e8b4014d15340d0f47 Mon Sep 17 00:00:00 2001 From: 90 Date: Sun, 8 Oct 2023 19:18:34 +0100 Subject: [PATCH 01/14] Bump AE2 version --- .../gripe/_90/megacells/crafting/DecompressionService.java | 3 ++- fabric/build.gradle.kts | 2 +- forge/build.gradle.kts | 1 - settings.gradle.kts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionService.java b/common/src/main/java/gripe/_90/megacells/crafting/DecompressionService.java index 896b73c3..61e205e3 100644 --- a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionService.java +++ b/common/src/main/java/gripe/_90/megacells/crafting/DecompressionService.java @@ -7,6 +7,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import appeng.api.crafting.IPatternDetails; @@ -26,7 +27,7 @@ public class DecompressionService implements IGridService, IGridServiceProvider private final List modules = new ObjectArrayList<>(); @Override - public void addNode(IGridNode node) { + public void addNode(IGridNode node, CompoundTag savedData) { if (node.getOwner() instanceof IChestOrDrive cellHost) { cellHosts.add(cellHost); } diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 505ac4fa..b99a1e59 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -72,13 +72,13 @@ dependencies { modImplementation(libs.ae2.fabric) modImplementation(libs.cloth.fabric) + modImplementation(libs.modmenu) modCompileOnly(libs.appbot.fabric) { exclude(group = "dev.emi", module = "emi-fabric") } modRuntimeOnly(libs.botania.fabric) { exclude(group = "dev.emi", module = "emi-fabric") } // modRuntimeOnly(libs.ae2wtlib.fabric) - modImplementation(libs.modmenu) modRuntimeOnly(libs.jei.fabric) modRuntimeOnly(libs.jade.fabric) } diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index a2faea64..90c1b367 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -81,7 +81,6 @@ dependencies { modRuntimeOnly(libs.patchouli.forge) modImplementation(libs.ae2wtlib.forge) - modRuntimeOnly(libs.cloth.forge) modRuntimeOnly(libs.architectury.forge) modRuntimeOnly(libs.curios) diff --git a/settings.gradle.kts b/settings.gradle.kts index c1ba2094..a5db0b79 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -24,7 +24,7 @@ dependencyResolutionManagement { library("fabric-api", "net.fabricmc.fabric-api", "fabric-api").version("0.83.1+$minecraftVersion") library("forge", "net.minecraftforge", "forge").version("$minecraftVersion-47.1.3") - version("ae2", "15.0.12") + version("ae2", "15.0.13") library("ae2-fabric", "appeng", "appliedenergistics2-fabric").versionRef("ae2") library("ae2-forge", "appeng", "appliedenergistics2-forge").versionRef("ae2") From ace762f6e748671a7f3b587621c01ff91cfd15f4 Mon Sep 17 00:00:00 2001 From: 90 Date: Sun, 8 Oct 2023 20:07:55 +0100 Subject: [PATCH 02/14] Fix Fabric datagen --- fabric/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index b99a1e59..c17e4d74 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -6,7 +6,7 @@ loom { source("data") property("fabric-api.datagen") - property("fabric-api.datagen.modid", "${property("modId")}-data") + property("fabric-api.datagen.modid", "${project.property("modId")}-data") property("fabric-api.datagen.output-dir", file("src/generated/resources").absolutePath) property("fabric-api.datagen.strict-validation") } From 817fed59af576aa4ec666b568ee6bb036c3d13ee Mon Sep 17 00:00:00 2001 From: 90 Date: Sun, 15 Oct 2023 16:31:41 +0100 Subject: [PATCH 03/14] Slight cell refactor --- .../java/gripe/_90/megacells/MEGACells.java | 4 +-- .../_90/megacells/definition/MEGAItems.java | 36 +++++++++---------- .../item/cell/BulkCellInventory.java | 3 +- .../{MEGABulkCell.java => BulkCellItem.java} | 12 +++---- ...bleCell.java => MEGAPortableCellItem.java} | 4 +-- .../integration/appmek/AppMekIntegration.java | 4 +-- .../integration/appmek/AppMekItems.java | 6 ++-- .../appmek/item/RadioactiveCellInventory.java | 3 +- ...tiveCell.java => RadioactiveCellItem.java} | 12 +++---- 9 files changed, 41 insertions(+), 43 deletions(-) rename common/src/main/java/gripe/_90/megacells/item/cell/{MEGABulkCell.java => BulkCellItem.java} (91%) rename common/src/main/java/gripe/_90/megacells/item/cell/{MEGAPortableCell.java => MEGAPortableCellItem.java} (93%) rename forge/src/main/java/gripe/_90/megacells/integration/appmek/item/{MEGARadioactiveCell.java => RadioactiveCellItem.java} (89%) diff --git a/common/src/main/java/gripe/_90/megacells/MEGACells.java b/common/src/main/java/gripe/_90/megacells/MEGACells.java index 665ba442..d03cc77c 100644 --- a/common/src/main/java/gripe/_90/megacells/MEGACells.java +++ b/common/src/main/java/gripe/_90/megacells/MEGACells.java @@ -29,7 +29,7 @@ import gripe._90.megacells.integration.ae2wt.AE2WTIntegration; import gripe._90.megacells.integration.appbot.AppBotIntegration; import gripe._90.megacells.integration.appbot.AppBotItems; -import gripe._90.megacells.item.cell.MEGABulkCell; +import gripe._90.megacells.item.cell.BulkCellItem; public final class MEGACells { private MEGACells() {} @@ -74,7 +74,7 @@ private static void initStorageCells() { .forEach( c -> StorageCellModels.registerModel(c, MEGACells.makeId("block/drive/cells/mega_fluid_cell"))); - StorageCells.addCellHandler(MEGABulkCell.HANDLER); + StorageCells.addCellHandler(BulkCellItem.HANDLER); StorageCellModels.registerModel(MEGAItems.BULK_ITEM_CELL, MEGACells.makeId("block/drive/cells/bulk_item_cell")); MEGAItems.getItemPortables() diff --git a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java index 28dd21f6..37508c48 100644 --- a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java +++ b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java @@ -24,8 +24,8 @@ import gripe._90.megacells.MEGACells; import gripe._90.megacells.crafting.DecompressionPatternItem; -import gripe._90.megacells.item.cell.MEGABulkCell; -import gripe._90.megacells.item.cell.MEGAPortableCell; +import gripe._90.megacells.item.cell.BulkCellItem; +import gripe._90.megacells.item.cell.MEGAPortableCellItem; import gripe._90.megacells.item.part.DecompressionModulePart; import gripe._90.megacells.item.part.MEGAInterfacePart; import gripe._90.megacells.item.part.MEGAPatternProviderPart; @@ -84,20 +84,20 @@ public static List> getItems() { 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", MEGABulkCell::new); + public static final ItemDefinition BULK_ITEM_CELL = + item("MEGA Bulk Item Storage Cell", "bulk_item_cell", BulkCellItem::new); - public static final ItemDefinition PORTABLE_ITEM_CELL_1M = itemPortable(TIER_1M); - public static final ItemDefinition PORTABLE_ITEM_CELL_4M = itemPortable(TIER_4M); - public static final ItemDefinition PORTABLE_ITEM_CELL_16M = itemPortable(TIER_16M); - public static final ItemDefinition PORTABLE_ITEM_CELL_64M = itemPortable(TIER_64M); - public static final ItemDefinition PORTABLE_ITEM_CELL_256M = itemPortable(TIER_256M); + public static final ItemDefinition PORTABLE_ITEM_CELL_1M = itemPortable(TIER_1M); + public static final ItemDefinition PORTABLE_ITEM_CELL_4M = itemPortable(TIER_4M); + public static final ItemDefinition PORTABLE_ITEM_CELL_16M = itemPortable(TIER_16M); + public static final ItemDefinition PORTABLE_ITEM_CELL_64M = itemPortable(TIER_64M); + public static final ItemDefinition PORTABLE_ITEM_CELL_256M = itemPortable(TIER_256M); - public static final ItemDefinition PORTABLE_FLUID_CELL_1M = fluidPortable(TIER_1M); - public static final ItemDefinition PORTABLE_FLUID_CELL_4M = fluidPortable(TIER_4M); - public static final ItemDefinition PORTABLE_FLUID_CELL_16M = fluidPortable(TIER_16M); - public static final ItemDefinition PORTABLE_FLUID_CELL_64M = fluidPortable(TIER_64M); - public static final ItemDefinition PORTABLE_FLUID_CELL_256M = fluidPortable(TIER_256M); + public static final ItemDefinition PORTABLE_FLUID_CELL_1M = fluidPortable(TIER_1M); + public static final ItemDefinition PORTABLE_FLUID_CELL_4M = fluidPortable(TIER_4M); + public static final ItemDefinition PORTABLE_FLUID_CELL_16M = fluidPortable(TIER_16M); + public static final ItemDefinition PORTABLE_FLUID_CELL_64M = fluidPortable(TIER_64M); + public static final ItemDefinition PORTABLE_FLUID_CELL_256M = fluidPortable(TIER_256M); public static final ItemDefinition GREATER_ENERGY_CARD = item("Greater Energy Card", "greater_energy_card", p -> new EnergyCardItem(p, 8)); @@ -196,18 +196,18 @@ private static ItemDefinition fluidCell(StorageTier tier) { AEKeyType.fluids())); } - private static ItemDefinition itemPortable(StorageTier tier) { + private static ItemDefinition itemPortable(StorageTier tier) { return item( tier.namePrefix().toUpperCase() + " Portable Item Cell", "portable_item_cell_" + tier.namePrefix(), - p -> new MEGAPortableCell(p, tier, AEKeyType.items(), MEStorageMenu.PORTABLE_ITEM_CELL_TYPE, 0x353535)); + p -> new MEGAPortableCellItem(p, tier, AEKeyType.items(), MEStorageMenu.PORTABLE_ITEM_CELL_TYPE, 0x353535)); } - private static ItemDefinition fluidPortable(StorageTier tier) { + private static ItemDefinition fluidPortable(StorageTier tier) { return item( tier.namePrefix().toUpperCase() + " Portable Fluid Cell", "portable_fluid_cell_" + tier.namePrefix(), - p -> new MEGAPortableCell( + p -> new MEGAPortableCellItem( p, tier, AEKeyType.fluids(), MEStorageMenu.PORTABLE_FLUID_CELL_TYPE, 0x00F1C5)); } diff --git a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java index 4d6de906..3e1ff0b2 100644 --- a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java +++ b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java @@ -38,10 +38,11 @@ public class BulkCellInventory implements StorageCell { private boolean isPersisted = true; - public BulkCellInventory(MEGABulkCell cell, ItemStack stack, ISaveProvider container) { + BulkCellInventory(ItemStack stack, ISaveProvider container) { this.stack = stack; this.container = container; + var cell = (BulkCellItem) stack.getItem(); var filter = cell.getConfigInventory(this.stack).getKey(0); filterItem = filter instanceof AEItemKey item ? item : null; diff --git a/common/src/main/java/gripe/_90/megacells/item/cell/MEGABulkCell.java b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java similarity index 91% rename from common/src/main/java/gripe/_90/megacells/item/cell/MEGABulkCell.java rename to common/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java index f0aa3c91..6a33f0cd 100644 --- a/common/src/main/java/gripe/_90/megacells/item/cell/MEGABulkCell.java +++ b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Optional; import org.jetbrains.annotations.NotNull; @@ -33,10 +32,10 @@ import gripe._90.megacells.definition.MEGAItems; import gripe._90.megacells.definition.MEGATranslations; -public class MEGABulkCell extends AEBaseItem implements ICellWorkbenchItem { +public class BulkCellItem extends AEBaseItem implements ICellWorkbenchItem { public static final Handler HANDLER = new Handler(); - public MEGABulkCell(Properties properties) { + public BulkCellItem(Properties properties) { super(properties.stacksTo(1)); } @@ -133,14 +132,13 @@ private Handler() {} @Override public boolean isCell(ItemStack is) { - return is != null && is.getItem() instanceof MEGABulkCell; + return is != null && is.getItem() instanceof BulkCellItem; } @Nullable @Override - public BulkCellInventory getCellInventory(ItemStack is, @Nullable ISaveProvider container) { - Objects.requireNonNull(is, "Cannot create cell inventory for null itemstack"); - return isCell(is) ? new BulkCellInventory((MEGABulkCell) is.getItem(), is, container) : null; + public BulkCellInventory getCellInventory(ItemStack is, @Nullable ISaveProvider host) { + return isCell(is) ? new BulkCellInventory(is, host) : null; } } } diff --git a/common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCell.java b/common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCellItem.java similarity index 93% rename from common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCell.java rename to common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCellItem.java index 91fb346f..9dbcda54 100644 --- a/common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCell.java +++ b/common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCellItem.java @@ -13,10 +13,10 @@ import gripe._90.megacells.MEGACells; -public class MEGAPortableCell extends PortableCellItem { +public class MEGAPortableCellItem extends PortableCellItem { private final StorageTier tier; - public MEGAPortableCell( + public MEGAPortableCellItem( Properties props, StorageTier tier, AEKeyType keyType, MenuType menu, int defaultColour) { super( keyType, diff --git a/forge/src/main/java/gripe/_90/megacells/integration/appmek/AppMekIntegration.java b/forge/src/main/java/gripe/_90/megacells/integration/appmek/AppMekIntegration.java index 78431b42..ebec344b 100644 --- a/forge/src/main/java/gripe/_90/megacells/integration/appmek/AppMekIntegration.java +++ b/forge/src/main/java/gripe/_90/megacells/integration/appmek/AppMekIntegration.java @@ -14,7 +14,7 @@ import gripe._90.megacells.MEGACells; import gripe._90.megacells.definition.MEGAItems; -import gripe._90.megacells.integration.appmek.item.MEGARadioactiveCell; +import gripe._90.megacells.integration.appmek.item.RadioactiveCellItem; public final class AppMekIntegration { public static void initUpgrades() { @@ -50,7 +50,7 @@ public static void initStorageCells() { .forEach(c -> StorageCellModels.registerModel(c, MEGACells.makeId("block/drive/cells/mega_chemical_cell"))); - StorageCells.addCellHandler(MEGARadioactiveCell.HANDLER); + StorageCells.addCellHandler(RadioactiveCellItem.HANDLER); StorageCellModels.registerModel( AppMekItems.RADIOACTIVE_CHEMICAL_CELL.asItem(), MEGACells.makeId("block/drive/cells/radioactive_chemical_cell")); diff --git a/forge/src/main/java/gripe/_90/megacells/integration/appmek/AppMekItems.java b/forge/src/main/java/gripe/_90/megacells/integration/appmek/AppMekItems.java index fa602937..518f1b01 100644 --- a/forge/src/main/java/gripe/_90/megacells/integration/appmek/AppMekItems.java +++ b/forge/src/main/java/gripe/_90/megacells/integration/appmek/AppMekItems.java @@ -13,7 +13,7 @@ import gripe._90.megacells.MEGACells; import gripe._90.megacells.definition.MEGAItems; -import gripe._90.megacells.integration.appmek.item.MEGARadioactiveCell; +import gripe._90.megacells.integration.appmek.item.RadioactiveCellItem; public final class AppMekItems { public static void init() { @@ -43,8 +43,8 @@ public static void init() { public static final ItemDefinition RADIOACTIVE_CELL_COMPONENT = MEGAItems.item("MEGA Radioactive Storage Component", "radioactive_cell_component", MaterialItem::new); - public static final ItemDefinition RADIOACTIVE_CHEMICAL_CELL = MEGAItems.item( - "MEGA Radioactive Chemical Storage Cell", "radioactive_chemical_cell", MEGARadioactiveCell::new); + public static final ItemDefinition RADIOACTIVE_CHEMICAL_CELL = MEGAItems.item( + "MEGA Radioactive Chemical Storage Cell", "radioactive_chemical_cell", RadioactiveCellItem::new); public static List> getCells() { return List.of(CHEMICAL_CELL_1M, CHEMICAL_CELL_4M, CHEMICAL_CELL_16M, CHEMICAL_CELL_64M, CHEMICAL_CELL_256M); diff --git a/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellInventory.java b/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellInventory.java index 38283866..d0f1c4b6 100644 --- a/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellInventory.java +++ b/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellInventory.java @@ -37,10 +37,11 @@ public class RadioactiveCellInventory implements StorageCell { private long chemAmount; private boolean isPersisted = true; - public RadioactiveCellInventory(MEGARadioactiveCell cell, ItemStack stack, ISaveProvider container) { + RadioactiveCellInventory(ItemStack stack, ISaveProvider container) { this.stack = stack; this.container = container; + var cell = (RadioactiveCellItem) stack.getItem(); var filter = cell.getConfigInventory(this.stack).getKey(0); filterChemical = filter instanceof MekanismKey chemical ? chemical : null; diff --git a/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/MEGARadioactiveCell.java b/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellItem.java similarity index 89% rename from forge/src/main/java/gripe/_90/megacells/integration/appmek/item/MEGARadioactiveCell.java rename to forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellItem.java index 4c8b8cc5..75f9f42b 100644 --- a/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/MEGARadioactiveCell.java +++ b/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellItem.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Optional; import org.jetbrains.annotations.NotNull; @@ -31,10 +30,10 @@ import gripe._90.megacells.definition.MEGATranslations; -public class MEGARadioactiveCell extends AEBaseItem implements ICellWorkbenchItem { +public class RadioactiveCellItem extends AEBaseItem implements ICellWorkbenchItem { public static final Handler HANDLER = new Handler(); - public MEGARadioactiveCell(Properties properties) { + public RadioactiveCellItem(Properties properties) { super(properties.stacksTo(1)); } @@ -108,14 +107,13 @@ private Handler() {} @Override public boolean isCell(ItemStack is) { - return is != null && is.getItem() instanceof MEGARadioactiveCell; + return is != null && is.getItem() instanceof RadioactiveCellItem; } @Nullable @Override - public RadioactiveCellInventory getCellInventory(ItemStack is, @Nullable ISaveProvider container) { - Objects.requireNonNull(is, "Cannot create cell inventory for null itemstack"); - return isCell(is) ? new RadioactiveCellInventory((MEGARadioactiveCell) is.getItem(), is, container) : null; + public RadioactiveCellInventory getCellInventory(ItemStack is, @Nullable ISaveProvider host) { + return isCell(is) ? new RadioactiveCellInventory(is, host) : null; } } } From c51ff3e8a42f9d3f4b7ae8c76d8050c5cb6b6b1b Mon Sep 17 00:00:00 2001 From: 90 Date: Wed, 25 Oct 2023 13:29:16 +0100 Subject: [PATCH 04/14] Fix bulk cells not accepting some contents with compression enabled --- .../_90/megacells/definition/MEGAItems.java | 3 +- .../item/cell/BulkCellInventory.java | 4 +-- .../megacells/util/CompressionService.java | 36 ++++++++----------- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java index 37508c48..e4c3e3cd 100644 --- a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java +++ b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java @@ -200,7 +200,8 @@ private static ItemDefinition itemPortable(StorageTier tie return item( tier.namePrefix().toUpperCase() + " Portable Item Cell", "portable_item_cell_" + tier.namePrefix(), - p -> new MEGAPortableCellItem(p, tier, AEKeyType.items(), MEStorageMenu.PORTABLE_ITEM_CELL_TYPE, 0x353535)); + p -> new MEGAPortableCellItem( + p, tier, AEKeyType.items(), MEStorageMenu.PORTABLE_ITEM_CELL_TYPE, 0x353535)); } private static ItemDefinition fluidPortable(StorageTier tier) { diff --git a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java index 3e1ff0b2..429e6fb5 100644 --- a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java +++ b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java @@ -118,7 +118,7 @@ public long insert(AEKey what, long amount, Actionable mode, IActionSource sourc return 0; } - if (compressionEnabled && !compressionChain.containsVariant(item)) { + if (compressionEnabled && !what.equals(filterItem) && !compressionChain.containsVariant(item)) { return 0; } @@ -151,7 +151,7 @@ public long extract(AEKey what, long amount, Actionable mode, IActionSource sour return 0; } - if (compressionEnabled && !compressionChain.containsVariant(item)) { + if (compressionEnabled && !what.equals(filterItem) && !compressionChain.containsVariant(item)) { return 0; } diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java b/common/src/main/java/gripe/_90/megacells/util/CompressionService.java index a8341f7a..74fb8067 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java +++ b/common/src/main/java/gripe/_90/megacells/util/CompressionService.java @@ -1,12 +1,13 @@ package gripe._90.megacells.util; +import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Stream; -import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.minecraft.core.RegistryAccess; import net.minecraft.world.item.Item; @@ -27,12 +28,12 @@ public class CompressionService { // Each chain is a list of "variants", where each variant consists of the item itself along with an associated value // dictating how much of the previous variant's item is needed to compress into that variant. // This value is typically either 4 or 9 for any given item, or 1 for the smallest base variant. - private final Set compressionChains = new ObjectLinkedOpenHashSet<>(); + private final Set compressionChains = new ObjectOpenHashSet<>(); // It may be desirable for some items to be included as variants in a chain in spite of any recipes involving those // items not being reversible. Hence, we override any reversibility checks and generate a variant for such an item // based on its usually irreversible recipe. - private final Set overrides = new ObjectLinkedOpenHashSet<>(); + private final Set overrides = new ObjectOpenHashSet<>(); private CompressionService() {} @@ -180,26 +181,19 @@ private boolean isReversibleRecipe(CraftingRecipe recipe, List c return true; } - var compressible = false; - var decompressible = false; - - var input = recipe.getIngredients().get(0); - var output = recipe.getResultItem(access); + var testInput = recipe.getIngredients().get(0).getItems(); + var testOutput = recipe.getResultItem(access).getItem(); for (var candidate : candidates) { - for (var item : candidate.getIngredients().get(0).getItems()) { - if (item.getItem().equals(output.getItem())) { - compressible = true; - } - } + var input = candidate.getIngredients().get(0).getItems(); + var output = candidate.getResultItem(access).getItem(); - for (var item : input.getItems()) { - if (item.getItem().equals(candidate.getResultItem(access).getItem())) { - decompressible = true; - } - } + var compressible = Arrays.stream(input).anyMatch(i -> i.is(testOutput)); + var decompressible = Arrays.stream(testInput).anyMatch(i -> i.is(output)); - if (compressible && decompressible) return true; + if (compressible && decompressible) { + return true; + } } return false; @@ -217,7 +211,7 @@ private boolean overrideRecipe(CraftingRecipe recipe, RegistryAccess access) { var larger = compressed ? output.getItem() : input.getItem(); var factor = compressed ? recipe.getIngredients().size() : output.getCount(); - overrides.add(new Override(smaller, larger, compressed, factor)); + overrides.add(new Override(smaller, larger, factor)); return true; } } @@ -225,5 +219,5 @@ private boolean overrideRecipe(CraftingRecipe recipe, RegistryAccess access) { return false; } - private record Override(Item smaller, Item larger, boolean compressed, int factor) {} + private record Override(Item smaller, Item larger, int factor) {} } From 831884049a4069ae7a4757e340297e20df33afe5 Mon Sep 17 00:00:00 2001 From: 90 Date: Wed, 25 Oct 2023 20:17:00 +0100 Subject: [PATCH 05/14] Sort recipe shortlist by length of ingredient items array --- .../java/gripe/_90/megacells/util/CompressionService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java b/common/src/main/java/gripe/_90/megacells/util/CompressionService.java index 74fb8067..db89d8e2 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java +++ b/common/src/main/java/gripe/_90/megacells/util/CompressionService.java @@ -1,6 +1,8 @@ package gripe._90.megacells.util; import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Optional; @@ -61,13 +63,15 @@ public void loadRecipes(RecipeManager recipeManager, RegistryAccess access) { // out back and forth to compress/decompress a resource without affecting the underlying quantity of it) var compressed = compressedCandidates.stream() .filter(recipe -> isReversibleRecipe(recipe, decompressedCandidates, access)) + .sorted(Comparator.comparingInt(r -> r.getIngredients().get(0).getItems().length)) .toList(); var decompressed = decompressedCandidates.stream() .filter(recipe -> isReversibleRecipe(recipe, compressedCandidates, access)) + .sorted(Comparator.comparingInt(r -> r.getIngredients().get(0).getItems().length)) .toList(); // Pull all available compression chains from the recipe shortlist and add these to the cache - Stream.concat(compressed.stream(), decompressed.stream()).forEach(recipe -> { + Stream.of(compressed, decompressed).flatMap(Collection::stream).forEach(recipe -> { var baseVariant = recipe.getResultItem(access).getItem(); if (compressionChains.stream().noneMatch(chain -> chain.containsVariant(AEItemKey.of(baseVariant)))) { From 6ab9099ae90b07c00ff3a965bc133c493e1a2ba1 Mon Sep 17 00:00:00 2001 From: 90 Date: Wed, 25 Oct 2023 23:41:18 +0100 Subject: [PATCH 06/14] Terminate ingredient check earlier for shaped recipes --- .../gripe/_90/megacells/util/CompressionService.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java b/common/src/main/java/gripe/_90/megacells/util/CompressionService.java index db89d8e2..030ba8cc 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java +++ b/common/src/main/java/gripe/_90/megacells/util/CompressionService.java @@ -18,6 +18,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.ShapedRecipe; import appeng.api.stacks.AEItemKey; @@ -152,12 +153,14 @@ private boolean isCompressionRecipe(CraftingRecipe recipe, RegistryAccess access return recipe.getResultItem(access).getCount() == 1 && ingredients.stream().noneMatch(Ingredient::isEmpty) && Set.of(4, 9).contains(ingredients.size()) - && sameIngredient(ingredients); + && sameIngredient(recipe); } - private boolean sameIngredient(List ingredients) { - if (ingredients.stream().distinct().count() <= 1) { - return true; + private boolean sameIngredient(CraftingRecipe recipe) { + var ingredients = recipe.getIngredients(); + + if (recipe instanceof ShapedRecipe) { + return ingredients.stream().distinct().count() <= 1; } // Check further for any odd cases (e.g. melon blocks having a shapeless recipe instead of a shaped one) From ffbc13f09ba1a1a52c06dc90d295bef49fda0ab0 Mon Sep 17 00:00:00 2001 From: 90 Date: Fri, 27 Oct 2023 19:46:45 +0100 Subject: [PATCH 07/14] Add safeguard for bulk cell unit amounts when a compression chain changes from the left --- .../megacells/item/cell/BulkCellInventory.java | 15 +++++++++++++++ .../_90/megacells/util/CompressionChain.java | 3 +-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java index 429e6fb5..c9c6f2c2 100644 --- a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java +++ b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java @@ -23,6 +23,8 @@ public class BulkCellInventory implements StorageCell { private static final String KEY = "key"; private static final String UNIT_COUNT = "smallestUnitCount"; + private static final String UNIT_FACTOR = "unitFactor"; + private static final long STACK_LIMIT = (long) Math.pow(2, 42); private final ISaveProvider container; @@ -56,6 +58,17 @@ public class BulkCellInventory implements StorageCell { .getChain(storedItem != null ? storedItem : filterItem) .orElseGet(CompressionChain::new); unitFactor = compressionChain.unitFactor(storedItem != null ? storedItem : filterItem); + + // Check newly-calculated factor against what's already recorded in order to adjust for a compression chain that + // has changed from the left of the stored item + var recordedFactor = !getTag().getString(UNIT_FACTOR).isEmpty() + ? new BigInteger(getTag().getString(UNIT_FACTOR)) + : unitFactor; + + if (!unitFactor.equals(recordedFactor)) { + unitCount = unitCount.multiply(unitFactor).divide(recordedFactor); + saveChanges(); + } } private long clampedLong(BigInteger toClamp, long limit) { @@ -197,9 +210,11 @@ public void persist() { if (storedItem == null || unitCount.signum() < 1) { getTag().remove(KEY); getTag().remove(UNIT_COUNT); + getTag().remove(UNIT_FACTOR); } else { getTag().put(KEY, storedItem.toTagGeneric()); getTag().putString(UNIT_COUNT, unitCount.toString()); + getTag().putString(UNIT_FACTOR, unitFactor.toString()); } isPersisted = true; diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java b/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java index 7546a40b..8c3d1c96 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java +++ b/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java @@ -27,8 +27,7 @@ public BigInteger unitFactor(AEItemKey item) { } var subChain = this.subList(0, indexOf(variant.get()) + 1); - var factor = subChain.stream().map(CompressionVariant::longFactor).reduce(1L, Math::multiplyExact); - return BigInteger.valueOf(factor); + return subChain.stream().map(v -> BigInteger.valueOf(v.factor())).reduce(BigInteger.ONE, BigInteger::multiply); } public CompressionVariant last() { From 1c72a919580116b585863007cde57f731469ab6d Mon Sep 17 00:00:00 2001 From: 90 Date: Fri, 27 Oct 2023 21:17:37 +0100 Subject: [PATCH 08/14] Switch to bytes over ints for compression variants --- .../_90/megacells/util/CompressionChain.java | 2 +- .../_90/megacells/util/CompressionService.java | 15 +++++++-------- .../_90/megacells/util/CompressionVariant.java | 8 ++------ 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java b/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java index 8c3d1c96..8e006c3d 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java +++ b/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java @@ -11,7 +11,7 @@ import gripe._90.megacells.definition.MEGAConfig; public class CompressionChain extends ObjectArrayList { - public void add(AEItemKey item, int factor) { + public void add(AEItemKey item, byte factor) { this.add(new CompressionVariant(item, factor)); } diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java b/common/src/main/java/gripe/_90/megacells/util/CompressionService.java index 030ba8cc..933ef585 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java +++ b/common/src/main/java/gripe/_90/megacells/util/CompressionService.java @@ -91,7 +91,7 @@ private CompressionChain generateChain( List decompressed, RegistryAccess access) { var variants = new LinkedList(); - var multipliers = new LinkedList(); + var multipliers = new LinkedList(); variants.addFirst(baseVariant); @@ -101,7 +101,7 @@ private CompressionChain generateChain( lower = getNextVariant(lower.item().getItem(), decompressed, false, access); } - multipliers.addFirst(1); + multipliers.addFirst((byte) 1); var chain = new CompressionChain(); for (var i = 0; i < variants.size(); i++) { @@ -131,11 +131,10 @@ private CompressionVariant getNextVariant( for (var recipe : recipes) { for (var input : recipe.getIngredients().get(0).getItems()) { if (input.getItem().equals(item)) { - return new CompressionVariant( - recipe.getResultItem(access).getItem(), - compressed + return new CompressionVariant(recipe.getResultItem(access).getItem(), (byte) + (compressed ? recipe.getIngredients().size() - : recipe.getResultItem(access).getCount()); + : recipe.getResultItem(access).getCount())); } } } @@ -216,7 +215,7 @@ private boolean overrideRecipe(CraftingRecipe recipe, RegistryAccess access) { var smaller = compressed ? input.getItem() : output.getItem(); var larger = compressed ? output.getItem() : input.getItem(); - var factor = compressed ? recipe.getIngredients().size() : output.getCount(); + var factor = (byte) (compressed ? recipe.getIngredients().size() : output.getCount()); overrides.add(new Override(smaller, larger, factor)); return true; @@ -226,5 +225,5 @@ private boolean overrideRecipe(CraftingRecipe recipe, RegistryAccess access) { return false; } - private record Override(Item smaller, Item larger, int factor) {} + private record Override(Item smaller, Item larger, byte factor) {} } diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionVariant.java b/common/src/main/java/gripe/_90/megacells/util/CompressionVariant.java index ac73b848..40eb1662 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionVariant.java +++ b/common/src/main/java/gripe/_90/megacells/util/CompressionVariant.java @@ -4,12 +4,8 @@ import appeng.api.stacks.AEItemKey; -public record CompressionVariant(AEItemKey item, int factor) { - public CompressionVariant(Item item, int factor) { +public record CompressionVariant(AEItemKey item, byte factor) { + public CompressionVariant(Item item, byte factor) { this(AEItemKey.of(item), factor); } - - public long longFactor() { - return factor; - } } From f0b1da8ed8128e1a3b1a32aeea6688dd1a558701 Mon Sep 17 00:00:00 2001 From: 90 Date: Mon, 30 Oct 2023 22:20:29 +0000 Subject: [PATCH 09/14] Add ME Cell Dock (#79) --- .../megacells/client/gui/CellDockScreen.java | 16 + .../gripe/_90/megacells/core/Platform.java | 6 + .../_90/megacells/definition/MEGAItems.java | 38 +- ...bleCellItem.java => MEGAPortableCell.java} | 4 +- .../_90/megacells/item/part/CellDockPart.java | 364 ++++++++++++++++++ .../_90/megacells/menu/CellDockMenu.java | 27 ++ .../ae2/screens/megacells/cell_dock.json | 31 ++ .../megacells/models/item/cell_dock.json | 89 +++++ .../megacells/models/part/cell_dock.json | 87 +++++ .../megacells/textures/part/cell_dock.png | Bin 0 -> 4685 bytes .../textures/part/cell_dock_side.png | Bin 0 -> 4601 bytes .../_90/megacells/fabric/FabricPlatform.java | 57 +++ .../_90/megacells/fabric/MEGACellsClient.java | 3 + .../_90/megacells/fabric/MEGACellsFabric.java | 2 + .../_90/megacells/forge/ForgePlatform.java | 59 +++ .../_90/megacells/forge/MEGACellsClient.java | 22 +- .../_90/megacells/forge/MEGACellsForge.java | 2 + settings.gradle.kts | 2 +- 18 files changed, 781 insertions(+), 28 deletions(-) create mode 100644 common/src/main/java/gripe/_90/megacells/client/gui/CellDockScreen.java rename common/src/main/java/gripe/_90/megacells/item/cell/{MEGAPortableCellItem.java => MEGAPortableCell.java} (93%) create mode 100644 common/src/main/java/gripe/_90/megacells/item/part/CellDockPart.java create mode 100644 common/src/main/java/gripe/_90/megacells/menu/CellDockMenu.java create mode 100644 common/src/main/resources/assets/ae2/screens/megacells/cell_dock.json create mode 100644 common/src/main/resources/assets/megacells/models/item/cell_dock.json create mode 100644 common/src/main/resources/assets/megacells/models/part/cell_dock.json create mode 100644 common/src/main/resources/assets/megacells/textures/part/cell_dock.png create mode 100644 common/src/main/resources/assets/megacells/textures/part/cell_dock_side.png diff --git a/common/src/main/java/gripe/_90/megacells/client/gui/CellDockScreen.java b/common/src/main/java/gripe/_90/megacells/client/gui/CellDockScreen.java new file mode 100644 index 00000000..c4f30577 --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/client/gui/CellDockScreen.java @@ -0,0 +1,16 @@ +package gripe._90.megacells.client.gui; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; + +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.style.ScreenStyle; + +import gripe._90.megacells.menu.CellDockMenu; + +public class CellDockScreen extends AEBaseScreen { + public CellDockScreen(CellDockMenu menu, Inventory playerInventory, Component title, ScreenStyle style) { + super(menu, playerInventory, title, style); + widgets.addOpenPriorityButton(); + } +} diff --git a/common/src/main/java/gripe/_90/megacells/core/Platform.java b/common/src/main/java/gripe/_90/megacells/core/Platform.java index 89ba51d6..3d8458af 100644 --- a/common/src/main/java/gripe/_90/megacells/core/Platform.java +++ b/common/src/main/java/gripe/_90/megacells/core/Platform.java @@ -1,8 +1,12 @@ package gripe._90.megacells.core; +import net.minecraft.client.resources.model.BakedModel; import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; +import appeng.api.orientation.BlockOrientation; + public interface Platform { Loaders getLoader(); @@ -13,4 +17,6 @@ public interface Platform { void initCompression(); void addVillagerTrade(ItemLike item, int cost, int quantity, int xp); + + BakedModel createWrappedCellModel(Item cell, BlockOrientation orientation); } diff --git a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java index e4c3e3cd..e77a5ae0 100644 --- a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java +++ b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java @@ -25,7 +25,8 @@ import gripe._90.megacells.MEGACells; import gripe._90.megacells.crafting.DecompressionPatternItem; import gripe._90.megacells.item.cell.BulkCellItem; -import gripe._90.megacells.item.cell.MEGAPortableCellItem; +import gripe._90.megacells.item.cell.MEGAPortableCell; +import gripe._90.megacells.item.part.CellDockPart; import gripe._90.megacells.item.part.DecompressionModulePart; import gripe._90.megacells.item.part.MEGAInterfacePart; import gripe._90.megacells.item.part.MEGAPatternProviderPart; @@ -87,17 +88,17 @@ public static List> getItems() { public static final ItemDefinition BULK_ITEM_CELL = item("MEGA Bulk Item Storage Cell", "bulk_item_cell", BulkCellItem::new); - public static final ItemDefinition PORTABLE_ITEM_CELL_1M = itemPortable(TIER_1M); - public static final ItemDefinition PORTABLE_ITEM_CELL_4M = itemPortable(TIER_4M); - public static final ItemDefinition PORTABLE_ITEM_CELL_16M = itemPortable(TIER_16M); - public static final ItemDefinition PORTABLE_ITEM_CELL_64M = itemPortable(TIER_64M); - public static final ItemDefinition PORTABLE_ITEM_CELL_256M = itemPortable(TIER_256M); + public static final ItemDefinition PORTABLE_ITEM_CELL_1M = itemPortable(TIER_1M); + public static final ItemDefinition PORTABLE_ITEM_CELL_4M = itemPortable(TIER_4M); + public static final ItemDefinition PORTABLE_ITEM_CELL_16M = itemPortable(TIER_16M); + public static final ItemDefinition PORTABLE_ITEM_CELL_64M = itemPortable(TIER_64M); + public static final ItemDefinition PORTABLE_ITEM_CELL_256M = itemPortable(TIER_256M); - public static final ItemDefinition PORTABLE_FLUID_CELL_1M = fluidPortable(TIER_1M); - public static final ItemDefinition PORTABLE_FLUID_CELL_4M = fluidPortable(TIER_4M); - public static final ItemDefinition PORTABLE_FLUID_CELL_16M = fluidPortable(TIER_16M); - public static final ItemDefinition PORTABLE_FLUID_CELL_64M = fluidPortable(TIER_64M); - public static final ItemDefinition PORTABLE_FLUID_CELL_256M = fluidPortable(TIER_256M); + public static final ItemDefinition PORTABLE_FLUID_CELL_1M = fluidPortable(TIER_1M); + public static final ItemDefinition PORTABLE_FLUID_CELL_4M = fluidPortable(TIER_4M); + public static final ItemDefinition PORTABLE_FLUID_CELL_16M = fluidPortable(TIER_16M); + public static final ItemDefinition PORTABLE_FLUID_CELL_64M = fluidPortable(TIER_64M); + public static final ItemDefinition PORTABLE_FLUID_CELL_256M = fluidPortable(TIER_256M); public static final ItemDefinition GREATER_ENERGY_CARD = item("Greater Energy Card", "greater_energy_card", p -> new EnergyCardItem(p, 8)); @@ -127,6 +128,11 @@ public static List> getItems() { p -> new PartItem<>(p, DecompressionModulePart.class, DecompressionModulePart::new)); }); + public static final ItemDefinition> CELL_DOCK = Util.make(() -> { + PartModels.registerModels(PartModelsHelper.createModels(CellDockPart.class)); + return item("ME Cell Dock", "cell_dock", p -> new PartItem<>(p, CellDockPart.class, CellDockPart::new)); + }); + public static List> getItemCells() { return List.of(ITEM_CELL_1M, ITEM_CELL_4M, ITEM_CELL_16M, ITEM_CELL_64M, ITEM_CELL_256M); } @@ -196,20 +202,18 @@ private static ItemDefinition fluidCell(StorageTier tier) { AEKeyType.fluids())); } - private static ItemDefinition itemPortable(StorageTier tier) { + private static ItemDefinition itemPortable(StorageTier tier) { return item( tier.namePrefix().toUpperCase() + " Portable Item Cell", "portable_item_cell_" + tier.namePrefix(), - p -> new MEGAPortableCellItem( - p, tier, AEKeyType.items(), MEStorageMenu.PORTABLE_ITEM_CELL_TYPE, 0x353535)); + p -> new MEGAPortableCell(p, tier, AEKeyType.items(), MEStorageMenu.PORTABLE_ITEM_CELL_TYPE, 0x353535)); } - private static ItemDefinition fluidPortable(StorageTier tier) { + private static ItemDefinition fluidPortable(StorageTier tier) { return item( tier.namePrefix().toUpperCase() + " Portable Fluid Cell", "portable_fluid_cell_" + tier.namePrefix(), - p -> new MEGAPortableCellItem( - p, tier, AEKeyType.fluids(), MEStorageMenu.PORTABLE_FLUID_CELL_TYPE, 0x00F1C5)); + p -> new MEGAPortableCell(p, tier, AEKeyType.fluids(), MEStorageMenu.PORTABLE_FLUID_CELL_TYPE, 0xF1C5)); } public static ItemDefinition item( diff --git a/common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCellItem.java b/common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCell.java similarity index 93% rename from common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCellItem.java rename to common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCell.java index 9dbcda54..91fb346f 100644 --- a/common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCellItem.java +++ b/common/src/main/java/gripe/_90/megacells/item/cell/MEGAPortableCell.java @@ -13,10 +13,10 @@ import gripe._90.megacells.MEGACells; -public class MEGAPortableCellItem extends PortableCellItem { +public class MEGAPortableCell extends PortableCellItem { private final StorageTier tier; - public MEGAPortableCellItem( + public MEGAPortableCell( Properties props, StorageTier tier, AEKeyType keyType, MenuType menu, int defaultColour) { super( keyType, diff --git a/common/src/main/java/gripe/_90/megacells/item/part/CellDockPart.java b/common/src/main/java/gripe/_90/megacells/item/part/CellDockPart.java new file mode 100644 index 00000000..74924c6e --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/item/part/CellDockPart.java @@ -0,0 +1,364 @@ +package gripe._90.megacells.item.part; + +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.phys.Vec3; + +import appeng.api.implementations.blockentities.IChestOrDrive; +import appeng.api.inventories.InternalInventory; +import appeng.api.networking.GridFlags; +import appeng.api.networking.IGridNodeListener; +import appeng.api.orientation.BlockOrientation; +import appeng.api.parts.IPartCollisionHelper; +import appeng.api.parts.IPartItem; +import appeng.api.parts.IPartModel; +import appeng.api.storage.IStorageMounts; +import appeng.api.storage.IStorageProvider; +import appeng.api.storage.MEStorage; +import appeng.api.storage.StorageCells; +import appeng.api.storage.cells.CellState; +import appeng.api.storage.cells.StorageCell; +import appeng.blockentity.inventory.AppEngCellInventory; +import appeng.client.render.tesr.CellLedRenderer; +import appeng.helpers.IPriorityHost; +import appeng.items.parts.PartModels; +import appeng.me.storage.DriveWatcher; +import appeng.menu.ISubMenu; +import appeng.menu.MenuOpener; +import appeng.menu.locator.MenuLocators; +import appeng.parts.AEBasePart; +import appeng.parts.PartModel; +import appeng.util.inv.InternalInventoryHost; +import appeng.util.inv.filter.IAEItemFilter; + +import gripe._90.megacells.MEGACells; +import gripe._90.megacells.definition.MEGAItems; +import gripe._90.megacells.menu.CellDockMenu; + +public class CellDockPart extends AEBasePart + implements InternalInventoryHost, IChestOrDrive, IPriorityHost, IStorageProvider { + @PartModels + public static final IPartModel MODEL = new PartModel(MEGACells.makeId("part/cell_dock")); + + private final AppEngCellInventory cellInventory = new AppEngCellInventory(this, 1); + private DriveWatcher cellWatcher; + private boolean isCached = false; + private boolean wasOnline = false; + private int priority = 0; + + // Client-side cell attributes to display the proper dynamic model without synchronising the entire cell's inventory + // when a dock comes into view + private Item clientCell = Items.AIR; + private CellState clientCellState = CellState.ABSENT; + + public CellDockPart(IPartItem partItem) { + super(partItem); + getMainNode() + .setIdlePowerUsage(0.5) + .setFlags(GridFlags.REQUIRE_CHANNEL) + .addService(IStorageProvider.class, this); + cellInventory.setFilter(new CellInventoryFilter()); + } + + @Override + public void readFromNBT(CompoundTag data) { + super.readFromNBT(data); + cellInventory.setItemDirect(0, ItemStack.of(data.getCompound("cell"))); + priority = data.getInt("priority"); + } + + @Override + public void writeToNBT(CompoundTag data) { + super.writeToNBT(data); + + var cell = new CompoundTag(); + getCell().save(cell); + data.put("cell", cell); + + data.putInt("priority", priority); + } + + @Override + public boolean readFromStream(FriendlyByteBuf data) { + var changed = super.readFromStream(data); + + var oldCell = clientCell; + var oldCellState = clientCellState; + + clientCell = BuiltInRegistries.ITEM.get(data.readResourceLocation()); + clientCellState = data.readEnum(CellState.class); + + return changed || oldCell != clientCell || oldCellState != clientCellState; + } + + @Override + public void writeToStream(FriendlyByteBuf data) { + super.writeToStream(data); + data.writeResourceLocation(BuiltInRegistries.ITEM.getKey(getCell().getItem())); + data.writeEnum(clientCellState = getCellStatus(0)); + } + + @Override + public void readVisualStateFromNBT(CompoundTag data) { + super.readVisualStateFromNBT(data); + + try { + this.clientCell = BuiltInRegistries.ITEM.get(new ResourceLocation(data.getString("cellId"))); + } catch (Exception e) { + MEGACells.LOGGER.warn("Couldn't read cell item for {} from {}", this, data); + this.clientCell = Items.AIR; + } + + try { + this.clientCellState = CellState.valueOf(data.getString("cellStatus")); + } catch (Exception e) { + MEGACells.LOGGER.warn("Couldn't read cell status for {} from {}", this, data); + this.clientCellState = CellState.ABSENT; + } + } + + @Override + public void writeVisualStateToNBT(CompoundTag data) { + super.writeVisualStateToNBT(data); + data.putString( + "cellId", BuiltInRegistries.ITEM.getKey(getCell().getItem()).toString()); + data.putString("cellStatus", getCellStatus(0).name()); + } + + private void recalculateDisplay() { + var cellState = getCellStatus(0); + + if (clientCellState != cellState) { + getHost().markForUpdate(); + clientCellState = cellState; + } + } + + @Override + protected void onMainNodeStateChanged(IGridNodeListener.State reason) { + super.onMainNodeStateChanged(reason); + var online = getMainNode().isOnline(); + + if (online != wasOnline) { + wasOnline = online; + IStorageProvider.requestUpdate(getMainNode()); + recalculateDisplay(); + } + } + + @Override + public boolean onPartActivate(Player player, InteractionHand hand, Vec3 pos) { + if (!player.getCommandSenderWorld().isClientSide()) { + MenuOpener.open(CellDockMenu.TYPE, player, MenuLocators.forPart(this)); + } + + return true; + } + + @Override + public void addAdditionalDrops(List drops, boolean wrenched) { + super.addAdditionalDrops(drops, wrenched); + drops.add(getCell()); + } + + public AppEngCellInventory getCellInventory() { + return cellInventory; + } + + private ItemStack getCell() { + return cellInventory.getStackInSlot(0); + } + + @Override + public int getCellCount() { + return 1; + } + + @Override + public boolean isCellBlinking(int slot) { + return false; + } + + @Nullable + @Override + public Item getCellItem(int slot) { + return slot == 0 ? cellInventory.getStackInSlot(slot).getItem() : null; + } + + @Nullable + @Override + public MEStorage getCellInventory(int slot) { + return slot == 0 && cellWatcher != null ? cellWatcher : null; + } + + @Nullable + @Override + public StorageCell getOriginalCellInventory(int slot) { + return slot == 0 && cellWatcher != null ? cellWatcher.getCell() : null; + } + + @Override + public CellState getCellStatus(int slot) { + return isClientSide() + ? clientCellState + : slot == 0 && cellWatcher != null ? cellWatcher.getStatus() : CellState.ABSENT; + } + + @Override + public void mountInventories(IStorageMounts storageMounts) { + if (getMainNode().isOnline()) { + updateState(); + + if (cellWatcher != null) { + storageMounts.mount(cellWatcher, priority); + } + } + } + + @Override + public void saveChanges() { + getHost().markForSave(); + getHost().markForUpdate(); + } + + @Override + public void onChangeInventory(InternalInventory inv, int slot) { + if (isCached) { + isCached = false; + updateState(); + } + + IStorageProvider.requestUpdate(getMainNode()); + } + + private void updateState() { + if (!isCached) { + cellWatcher = null; + cellInventory.setHandler(0, null); + var power = 0.5; + + if (!getCell().isEmpty()) { + var cell = StorageCells.getCellInventory(getCell(), this::onCellContentChanged); + + if (cell != null) { + cellWatcher = new DriveWatcher(cell, this::recalculateDisplay); + cellInventory.setHandler(0, cell); + power += cell.getIdleDrain(); + } + } + + getMainNode().setIdlePowerUsage(power); + isCached = true; + } + } + + private void onCellContentChanged() { + getLevel().blockEntityChanged(getBlockEntity().getBlockPos()); + } + + @Override + public int getPriority() { + return priority; + } + + @Override + public void setPriority(int newValue) { + priority = newValue; + getHost().markForSave(); + + isCached = false; + updateState(); + + IStorageProvider.requestUpdate(getMainNode()); + } + + @Override + public void returnToMainMenu(Player player, ISubMenu subMenu) { + MenuOpener.returnTo(CellDockMenu.TYPE, player, MenuLocators.forPart(this)); + } + + @Override + public ItemStack getMainMenuIcon() { + return MEGAItems.CELL_DOCK.stack(); + } + + @Override + public void getBoxes(IPartCollisionHelper bch) { + bch.addBox(3, 3, 12, 13, 13, 16); + bch.addBox(5, 5, 11, 11, 11, 12); + } + + @Override + public IPartModel getStaticModels() { + return MODEL; + } + + @Override + public boolean requireDynamicRender() { + return true; + } + + @Override + public void renderDynamic( + float partialTicks, + PoseStack poseStack, + MultiBufferSource buffers, + int combinedLightIn, + int combinedOverlayIn) { + if (getLevel() == null || clientCell == Items.AIR) { + return; + } + + poseStack.pushPose(); + poseStack.translate(0.5, 0.5, 0.5); + + var front = getSide() == Direction.UP || getSide() == Direction.DOWN ? Direction.NORTH : Direction.UP; + var orientation = BlockOrientation.get(front, getSide()); + + poseStack.mulPose(orientation.getQuaternion()); + poseStack.translate(-3F / 16, 5F / 16, -4F / 16); + + Minecraft.getInstance() + .getBlockRenderer() + .getModelRenderer() + .tesselateBlock( + getLevel(), + MEGACells.PLATFORM.createWrappedCellModel(clientCell, orientation), + getBlockEntity().getBlockState(), + getBlockEntity().getBlockPos(), + poseStack, + buffers.getBuffer(RenderType.cutout()), + false, + RandomSource.create(), + 0L, + combinedOverlayIn); + CellLedRenderer.renderLed(this, 0, buffers.getBuffer(CellLedRenderer.RENDER_LAYER), poseStack, partialTicks); + + poseStack.popPose(); + } + + private static class CellInventoryFilter implements IAEItemFilter { + @Override + public boolean allowInsert(InternalInventory inv, int slot, ItemStack stack) { + return StorageCells.isCellHandled(stack); + } + } +} diff --git a/common/src/main/java/gripe/_90/megacells/menu/CellDockMenu.java b/common/src/main/java/gripe/_90/megacells/menu/CellDockMenu.java new file mode 100644 index 00000000..148329b6 --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/menu/CellDockMenu.java @@ -0,0 +1,27 @@ +package gripe._90.megacells.menu; + +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; + +import appeng.menu.AEBaseMenu; +import appeng.menu.SlotSemantics; +import appeng.menu.implementations.MenuTypeBuilder; +import appeng.menu.slot.RestrictedInputSlot; + +import gripe._90.megacells.item.part.CellDockPart; + +/** + * @see appeng.menu.implementations.ChestMenu + */ +public class CellDockMenu extends AEBaseMenu { + public static final MenuType TYPE = + MenuTypeBuilder.create(CellDockMenu::new, CellDockPart.class).build("cell_dock"); + + public CellDockMenu(int id, Inventory playerInventory, CellDockPart dock) { + super(TYPE, id, playerInventory, dock); + addSlot( + new RestrictedInputSlot(RestrictedInputSlot.PlacableItemType.STORAGE_CELLS, dock.getCellInventory(), 0), + SlotSemantics.STORAGE_CELL); + createPlayerInventorySlots(playerInventory); + } +} diff --git a/common/src/main/resources/assets/ae2/screens/megacells/cell_dock.json b/common/src/main/resources/assets/ae2/screens/megacells/cell_dock.json new file mode 100644 index 00000000..48204338 --- /dev/null +++ b/common/src/main/resources/assets/ae2/screens/megacells/cell_dock.json @@ -0,0 +1,31 @@ +{ + "$schema": "../schema.json", + "includes": ["../common/common.json", "../common/player_inventory.json"], + "background": { + "texture": "guis/chest.png", + "srcRect": [0, 0, 176, 166] + }, + "slots": { + "STORAGE_CELL": { + "left": 80, + "top": 37 + } + }, + "text": { + "dialog_title": { + "text": { + "translate": "item.megacells.cell_dock" + }, + "position": { + "left": 8, + "top": 6 + } + } + }, + "widgets": { + "openPriority": { + "left": 154, + "top": 0 + } + } +} diff --git a/common/src/main/resources/assets/megacells/models/item/cell_dock.json b/common/src/main/resources/assets/megacells/models/item/cell_dock.json new file mode 100644 index 00000000..f4d6fd1c --- /dev/null +++ b/common/src/main/resources/assets/megacells/models/item/cell_dock.json @@ -0,0 +1,89 @@ +{ + "credit": "Made with Blockbench by Sea_Kerman", + "parent": "ae2:item/part_base", + "textures": { + "front": "megacells:part/cell_dock", + "side": "megacells:part/cell_dock_side", + "particle": "megacells:part/cell_dock_side" + }, + "elements": [ + { + "name": "body", + "from": [3, 3, 5], + "to": [13, 13, 9], + "faces": { + "north": { "uv": [5, 3, 15, 13], "texture": "#front" }, + "east": { "uv": [0, 6, 4, 16], "rotation": 180, "texture": "#side" }, + "south": { "uv": [4, 6, 14, 16], "texture": "#side" }, + "west": { "uv": [0, 6, 4, 16], "texture": "#side" }, + "up": { "uv": [1, 3, 5, 13], "rotation": 90, "texture": "#front" }, + "down": { "uv": [0, 6, 4, 16], "rotation": 270, "texture": "#side" } + } + }, + { + "name": "slot", + "from": [11.01, 13.01, 8.01], + "to": [4.99, 10.01, 5.99], + "faces": { + "north": { "uv": [7, 10.05, 13, 13], "texture": "#front" }, + "east": { "uv": [9, 10.05, 11, 13], "texture": "#front" }, + "south": { "uv": [7, 10.05, 13, 13], "texture": "#front" }, + "west": { "uv": [9, 10.05, 11, 13], "texture": "#front" }, + "up": { "uv": [7, 10, 13, 12], "rotation": 180, "texture": "#front" } + } + }, + { + "name": "base", + "from": [5, 5, 9], + "to": [11, 11, 10], + "faces": { + "north": { "uv": [10, 0, 16, 6], "texture": "#side" }, + "east": { "uv": [15, 0, 16, 6], "texture": "#side" }, + "south": { "uv": [10, 0, 16, 6], "texture": "#side" }, + "west": { "uv": [10, 0, 11, 6], "texture": "#side" }, + "up": { "uv": [10, 0, 16, 1], "texture": "#side" }, + "down": { "uv": [10, 5, 16, 6], "texture": "#side" } + } + }, + { + "name": "internals", + "from": [9, 5, 9], + "to": [7, 11, 10], + "faces": { + "east": { "uv": [15, 10, 16, 16], "texture": "#side" }, + "west": { "uv": [15, 10, 16, 16], "texture": "#side" } + } + }, + { + "name": "internals", + "from": [5, 9, 9], + "to": [11, 7, 10], + "faces": { + "up": { "uv": [15, 10, 16, 16], "rotation": 270, "texture": "#side" }, + "down": { "uv": [15, 10, 16, 16], "rotation": 270, "texture": "#side" } + } + }, + { + "name": "internals", + "from": [6, 6, 9], + "to": [10, 10, 10], + "faces": { + "east": { "uv": [14, 1, 15, 5], "texture": "#side" }, + "west": { "uv": [14, 1, 15, 5], "texture": "#side" }, + "up": { "uv": [14, 1, 15, 5], "rotation": 90, "texture": "#side" }, + "down": { "uv": [14, 1, 15, 5], "rotation": 90, "texture": "#side" } + } + } + ], + "groups": [ + 0, + 1, + 2, + { + "name": "base internals", + "origin": [0, 0, 0], + "color": 0, + "children": [3, 4, 5] + } + ] +} diff --git a/common/src/main/resources/assets/megacells/models/part/cell_dock.json b/common/src/main/resources/assets/megacells/models/part/cell_dock.json new file mode 100644 index 00000000..31a2e8e8 --- /dev/null +++ b/common/src/main/resources/assets/megacells/models/part/cell_dock.json @@ -0,0 +1,87 @@ +{ + "credit": "Made with Blockbench by Sea_Kerman", + "textures": { + "front": "megacells:part/cell_dock", + "side": "megacells:part/cell_dock_side" + }, + "elements": [ + { + "name": "body", + "from": [3, 3, 0], + "to": [13, 13, 4], + "faces": { + "north": { "uv": [5, 3, 15, 13], "texture": "#front" }, + "east": { "uv": [0, 6, 4, 16], "rotation": 180, "texture": "#side" }, + "south": { "uv": [4, 6, 14, 16], "texture": "#side" }, + "west": { "uv": [0, 6, 4, 16], "texture": "#side" }, + "up": { "uv": [1, 3, 5, 13], "rotation": 90, "texture": "#front" }, + "down": { "uv": [0, 6, 4, 16], "rotation": 270, "texture": "#side" } + } + }, + { + "name": "slot", + "from": [11.01, 13.01, 3.01], + "to": [4.99, 10.01, 0.99], + "faces": { + "north": { "uv": [7, 10.05, 13, 13], "texture": "#front" }, + "east": { "uv": [9, 10.05, 11, 13], "texture": "#front" }, + "south": { "uv": [7, 10.05, 13, 13], "texture": "#front" }, + "west": { "uv": [9, 10.05, 11, 13], "texture": "#front" }, + "up": { "uv": [7, 10, 13, 12], "rotation": 180, "texture": "#front" } + } + }, + { + "name": "base", + "from": [5, 5, 4], + "to": [11, 11, 5.01], + "faces": { + "north": { "uv": [10, 0, 16, 6], "texture": "#side" }, + "east": { "uv": [15, 0, 16, 6], "texture": "#side" }, + "south": { "uv": [10, 0, 16, 6], "texture": "#side" }, + "west": { "uv": [10, 0, 11, 6], "texture": "#side" }, + "up": { "uv": [10, 0, 16, 1], "texture": "#side" }, + "down": { "uv": [10, 5, 16, 6], "texture": "#side" } + } + }, + { + "name": "internals", + "from": [9, 5, 4], + "to": [7, 11, 5], + "faces": { + "east": { "uv": [15, 10, 16, 16], "texture": "#side" }, + "west": { "uv": [15, 10, 16, 16], "texture": "#side" } + } + }, + { + "name": "internals", + "from": [5, 9, 4], + "to": [11, 7, 5], + "faces": { + "up": { "uv": [15, 10, 16, 16], "rotation": 270, "texture": "#side" }, + "down": { "uv": [15, 10, 16, 16], "rotation": 270, "texture": "#side" } + } + }, + { + "name": "internals", + "from": [6.01, 6.01, 4], + "to": [9.99, 9.99, 5], + "faces": { + "east": { "uv": [14, 1, 15, 5], "texture": "#side" }, + "west": { "uv": [14, 1, 15, 5], "texture": "#side" }, + "up": { "uv": [14, 1, 15, 5], "rotation": 90, "texture": "#side" }, + "down": { "uv": [14, 1, 15, 5], "rotation": 90, "texture": "#side" } + } + } + ], + "groups": [ + 0, + 1, + 2, + { + "name": "base internals", + "origin": [0, 0, 0], + "color": 0, + "children": [3, 4, 5] + } + ] +} diff --git a/common/src/main/resources/assets/megacells/textures/part/cell_dock.png b/common/src/main/resources/assets/megacells/textures/part/cell_dock.png new file mode 100644 index 0000000000000000000000000000000000000000..6930947e5cceac885af2895418394405ef46eda6 GIT binary patch literal 4685 zcmeHKc~BH*7H`%lhk^)VSPR!qD;03l)5l!h9YzI)W6(hgCI*R>q^A$;WiDqL7&M4i z;pKjQ|~=x!L50TC0EX7i(!}BDM~g0 zmP=d$EO;dmg1l|^ti-S;cwGIx^@bOk<2Sdr)|5Y3Whe_cUu~&b-PwF9G`Od`CwTvu zjS+lHtdzlrM}7C3%GTMpVoc1^#5Es0`bKj(@6TB3f~{Z8dbDMCRjwI*f9KsIZbxX; zIqWd}bV8faX1xdBhi~JRfnVHtDI@Rh{ou|_^=ay(3GQ<Hn;*V-ZPtz-Dv>F3qBgww(V?ikLj34I$8OV1k5_G6S=P{h(AxW7ADP_-CdE6iLHfiU2ST*RF9wQSk`rp*!it_jMsQQ?n3AW?<%k3!g;zoGH`(@ zd+oV(e;ii_-gQv`6-jUV(Y1@f2>>8Y(22*yD%{}IkqA;EWSGRr=*L*+xI5r z*JN{_EWP{un7eHm+d4HT!%s#;q$jQZ?c~#Y8j?Pk|GSBi@ok$5?`&e8Oh3xI-)%f~ zVEGJ7`o^h`$1f``m?ZALS~Yvz_oWAJZ3=EUJXX_L`>#^lmCqs@dd4l3>}53p#+j!5 zhih6V;739iE*UGRSJ<`{OxY2 z%M~40!zFBc~xu1&8}o&k(9o~E#xf8v~WubIGRUh%?wHK zG629X$Smx&+Z-OoYe0Os40u+=7y|oL;z*RZe$4M$j~k;Uq?qD9}JXB@UVOq7KhA1;USE6g-?; za>O@JbAEnPxI)^;;+u$R8Q-Ip z7Id6dFQ9sorBRKVq)}Ea;3%iJlC&OIt2vS%1Z8q~WY)n63KRfWNdSjtHJr#30xA-u zh-x%C9;MV;D@sust3Z*gR;?2ULCkYYpetG1;HVTR9zbcddYw+x>rg#QYf+6}O`;S> zXi-utQaYC9C_?Xt;yEVO>9(_=oRXc*7ciG2-{(UioJq_w84yy14@k0XtSkZpFawf< zcNTjFmMoH8$dOrvPeMoQDZN@t(v*$@R17H17u+7uiwY`%tJE6bic%N`qywmBl}-f! zJ~_ySNp=gY>~ve4PMZNyf`S#x{$(>5D4vyBBP$C46eraTfiomw!Er`SGB}OmdIle) z@8l)1h6#p!W5KYTKLrn4B={>1u>4Eh zBG!>Ffc>MlVf*CL&ol$U5tLppiYNgJ3HnLPqO_HzP?4sUCLz@#F8EmJNB1~IxtMhe ziTQv>z!hjvA6IZ(Z>i#k>K88(lsW*)Py$B@+Je&zAWK6d*t1WM64ZJv%V|(OC9)tr zPKQziMWSks)^Jvy6s%U=&~X2^^agcAUwR3cvLW^rGXeXLa{Cnq?Vx}bzYOfmV57(S zclutwKq;Q((c5Ov(gh5UI2jhdBXo_>H7o{(r99GIBXkXmfnh0+bl3llu8@ImMZp37 z;1z=}!JEgI<3FeWR1>!=_r1}}Upf>0&I){7Kx^LEo1@Na zV$YC=E(X1D`QeUQ``>GCJ>a%Z*O;4b+<|8QBDdgXT_!X!<(s!+uhedt-h!@}x9F46 zFtn$-BO-2>qdh+>qtx>C(#NOYXzX11YGp}9*|G9vb-${Zcj37PYU8&hPtePq`x<}A zslr?_fr+<0E80ttUCq(=j{h}o{hrRY(${Y+j@jP+(;-9m=$qz)`+nV7hpcX((_&8M z7JOXYAyyslURSxcY_D)vi{tsEe9fUA3|mAE%(8)gBbvuC7(7?w#-uPJ7NC&)NRRB$Ju> z9>4p2zx#dn%*~4A8HoXYWBm{W3D9XZDexM|ojyb1Z}7igknnQ6I4y%sAq!Ef&0=Ko z0m>Fx0ScUq5kZ{SOvxt#8gZX4NkZcBSbmU;$*vv8cD2RUeQ{qG?YaDX(A~XvJk6eI zUUcT)vv%JN9I@^DGQ*bf*~z@~UKi%qH725>zqRsfFW-ylcr9$_B~_MiYVl0+lh-OA zHj6@6R=6~wElpotdO!TVbwja+rQfn&E+RYR@$JXaZ;I}1E`4ff2tU8&{rm~u{&Q-c#67?NgV#}y<{Oz~p5fRs1o2qP#K$M=;^TXBff;OAxK^!g zj15}Wx?^R^_;cJWz=PO`G30mV%?H6pT2u>dx&nqf|1$&yyp?K$7gSF zIIN?*P6P+0j|oc{6aG{E_KSkkOX^FU4@%~BHh8`_`-58JJbrTI*{>#!Ff{C&%sVPr zjK_UGW7@fYrCvS7SGk(irKQIzeu{W-B*wKSMf&F(BUZFemqoM%v|ZIF-8njwPma=s zM2Bs{@0Oojon19|QG0el#*OOXp;gsk9|l(3p0K{;<5|Q0;#?-L+coyKe^J$_^K&+Q zo3+Hzd1hWv#5-?h?rGvDyq=^D2^cOOyKC!Ef8ttX%5?g!>gLVh1zn8o%&ofewUmcr z*BXAzFTq`%yEAJx*(%F@x4bxYFy{2)vbkHn`~3a`>biL|@;v9pw2r48*!<4QhsN}Z z2_Ann-Do@V*_o2#w|RKi_M~OEw2NxuYQ2tb{zf)x@sC(whW*)Ph3f~;HQV0CS`qK% z$DP&to7FAqE7uRbo2UHsna7b)w#Ep<-nU@U6)>>4GW64xl*J?@X^Q~}ohB=+Is{S0 zIISd=2Uyeqau~B(@Sy&f0A*;kAU#r#>#gx1m(dp6Kx*-fG^#j{QqY2!Xg`%x2?0!i zB~hm--)vVp)dDxJ65exSkpOj@uz6}hhCUgMx7YwG6-tFTmf&Ox#DZu)RAr-$$`sAi z9tilP7UZ(5RVfk`78VK%B|?iWM?@$T3K1?AiNzSS!0bh4mULofdngCdjiCW{%Enk( z#$rY}OwwR+uxfz->e1f#OjfLkolPi!AUy&7u7^Dh z_NXWY*ewnl1riE?nGNj^K~sJHR);O$oeoWjKt3=*Q#%}$7%*g_PM_T8!BLRIn5=Fu zNcI3rmNC90Yd~zA#+^?8K%jdc?f~oF+}*~|O0QRHER=%_Pp44}xbc;=g<@!>`<5`` zgd~yx7%jnNm{egfVkB;$FoQ%!lLTSFX?bKnD4p5Pl4c5UP!L?mKpcZON-iN4QJ6$Z zL>i(ZWfTc8k^~Y=DpSBxl16crC6N(EN=%cIsDbEq zi;*oPZD2|c!Ux(H<^paWAY~YVWBn)-h1l`7CnIvw^>6CNr@WdJonL79F{|guT`6AM-cxJ-06YT zYzTrvZ&s&I@V?_WBG8veJy4{Bo9Pd9nki}Wvm4hDbw9_BTzbqmq%2lDtjV|R%E^UZ zURCo$_QdTUT6J?s1eiQ7efTFM%h-_7<)?O4r*}<^e(~6E;i3A%PIXSFVob}bt&>)z zeEsln%GVUU^*4)JVvTvbt1sNiSiclxHqI%9QnQ0Ra5cI4QOx3lrWNf$t&f*4tekk$cDU=ExqMgr zy!GJw^l`zfU31R!dER8=Tbfz3wBakZ<_1om_M|=c>7j-{#jbKu_G7Ky!#$ps!q8&% zP5a>ABS(1G57u^MAsKr*wtm#+RJF-@dpa8Ml1;KJmz$r?K>~H_K7O%U>r-~QMyj93 ztDUs6Y)eGaT2TFD$d|5DJC~n5_cNR;9>~xc^?GD7y!U}8cU(%X builder.add(new VillagerTrades.ItemsForEmeralds(item.asItem(), cost, quantity, xp))); } + + @Override + public BakedModel createWrappedCellModel(Item cell, BlockOrientation orientation) { + var driveModel = Minecraft.getInstance() + .getModelManager() + .getBlockModelShaper() + .getBlockModel(AEBlocks.DRIVE.block().defaultBlockState()); + var cellModel = + BakedModelUnwrapper.unwrap(driveModel, DriveBakedModel.class).getCellChassisModel(cell); + return new WrappedCellModel(cellModel, orientation); + } + + private static class WrappedCellModel extends ForwardingBakedModel { + private final BlockOrientation r; + + private WrappedCellModel(BakedModel base, BlockOrientation r) { + wrapped = base; + this.r = r; + } + + @Override + public List getQuads(BlockState state, Direction side, RandomSource rand) { + if (side != null) { + side = r.resultingRotate(side); // This fixes the incorrect lightmap position + } + List quads = new ArrayList<>(super.getQuads(state, side, rand)); + + for (int i = 0; i < quads.size(); i++) { + BakedQuad quad = quads.get(i); + quads.set( + i, + new BakedQuad( + quad.getVertices(), + quad.getTintIndex(), + r.rotate(quad.getDirection()), + quad.getSprite(), + quad.isShade())); + } + + return quads; + } + } } diff --git a/fabric/src/main/java/gripe/_90/megacells/fabric/MEGACellsClient.java b/fabric/src/main/java/gripe/_90/megacells/fabric/MEGACellsClient.java index 8023fcdb..930b84ce 100644 --- a/fabric/src/main/java/gripe/_90/megacells/fabric/MEGACellsClient.java +++ b/fabric/src/main/java/gripe/_90/megacells/fabric/MEGACellsClient.java @@ -27,12 +27,14 @@ import gripe._90.megacells.MEGACells; import gripe._90.megacells.block.MEGACraftingUnitType; +import gripe._90.megacells.client.gui.CellDockScreen; import gripe._90.megacells.client.render.MEGACraftingUnitModelProvider; import gripe._90.megacells.core.Addons; import gripe._90.megacells.definition.MEGABlockEntities; import gripe._90.megacells.definition.MEGABlocks; import gripe._90.megacells.definition.MEGAItems; import gripe._90.megacells.integration.appbot.AppBotItems; +import gripe._90.megacells.menu.CellDockMenu; import gripe._90.megacells.menu.MEGAInterfaceMenu; import gripe._90.megacells.menu.MEGAPatternProviderMenu; @@ -56,6 +58,7 @@ private void initScreens() { MEGAPatternProviderMenu.TYPE, PatternProviderScreen::new, "/screens/megacells/mega_pattern_provider.json"); + InitScreens.register(CellDockMenu.TYPE, CellDockScreen::new, "/screens/megacells/cell_dock.json"); }); } diff --git a/fabric/src/main/java/gripe/_90/megacells/fabric/MEGACellsFabric.java b/fabric/src/main/java/gripe/_90/megacells/fabric/MEGACellsFabric.java index fbd76928..0f45a622 100644 --- a/fabric/src/main/java/gripe/_90/megacells/fabric/MEGACellsFabric.java +++ b/fabric/src/main/java/gripe/_90/megacells/fabric/MEGACellsFabric.java @@ -12,6 +12,7 @@ import gripe._90.megacells.definition.MEGABlocks; import gripe._90.megacells.definition.MEGACreativeTab; import gripe._90.megacells.definition.MEGAItems; +import gripe._90.megacells.menu.CellDockMenu; import gripe._90.megacells.menu.MEGAInterfaceMenu; import gripe._90.megacells.menu.MEGAPatternProviderMenu; @@ -43,6 +44,7 @@ private void registerAll() { Registry.register(BuiltInRegistries.MENU, AppEng.makeId("mega_interface"), MEGAInterfaceMenu.TYPE); Registry.register(BuiltInRegistries.MENU, AppEng.makeId("mega_pattern_provider"), MEGAPatternProviderMenu.TYPE); + Registry.register(BuiltInRegistries.MENU, AppEng.makeId("cell_dock"), CellDockMenu.TYPE); } @SuppressWarnings("UnstableApiUsage") diff --git a/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java b/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java index f0fffdf2..88b6640d 100644 --- a/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java +++ b/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java @@ -1,15 +1,29 @@ package gripe._90.megacells.forge; +import java.util.ArrayList; +import java.util.List; + import org.apache.commons.lang3.ArrayUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; import net.minecraft.world.entity.npc.VillagerTrades; import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.trading.MerchantOffer; import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.OnDatapackSyncEvent; import net.minecraftforge.event.server.ServerStartedEvent; @@ -17,6 +31,11 @@ import net.minecraftforge.fml.loading.LoadingModList; import net.minecraftforge.fml.loading.moddiscovery.ModInfo; +import appeng.api.orientation.BlockOrientation; +import appeng.client.render.BakedModelUnwrapper; +import appeng.client.render.DelegateBakedModel; +import appeng.client.render.model.DriveBakedModel; +import appeng.core.definitions.AEBlocks; import appeng.init.InitVillager; import gripe._90.megacells.core.Addons; @@ -73,4 +92,44 @@ public void addVillagerTrade(ItemLike item, int cost, int quantity, int xp) { new ItemStack(Items.EMERALD, cost), new ItemStack(item, quantity), 12, xp, 0.05F)); offers.put(5, masterEntries); } + + @Override + public BakedModel createWrappedCellModel(Item cell, BlockOrientation orientation) { + var driveModel = Minecraft.getInstance() + .getModelManager() + .getBlockModelShaper() + .getBlockModel(AEBlocks.DRIVE.block().defaultBlockState()); + var cellModel = + BakedModelUnwrapper.unwrap(driveModel, DriveBakedModel.class).getCellChassisModel(cell); + + return new DelegateBakedModel(cellModel) { + @NotNull + @Override + public List getQuads( + @Nullable BlockState state, + @Nullable Direction side, + @NotNull RandomSource rand, + @NotNull ModelData extraData, + RenderType renderType) { + if (side != null) { + side = orientation.resultingRotate(side); // This fixes the incorrect lightmap position + } + List quads = new ArrayList<>(super.getQuads(state, side, rand, extraData, renderType)); + + for (int i = 0; i < quads.size(); i++) { + BakedQuad quad = quads.get(i); + quads.set( + i, + new BakedQuad( + quad.getVertices(), + quad.getTintIndex(), + orientation.rotate(quad.getDirection()), + quad.getSprite(), + quad.isShade())); + } + + return quads; + } + }; + } } diff --git a/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsClient.java b/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsClient.java index 5d74bd8c..45966324 100644 --- a/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsClient.java +++ b/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsClient.java @@ -31,6 +31,7 @@ import gripe._90.megacells.MEGACells; import gripe._90.megacells.block.MEGACraftingUnitType; +import gripe._90.megacells.client.gui.CellDockScreen; import gripe._90.megacells.client.render.MEGACraftingUnitModelProvider; import gripe._90.megacells.core.Addons; import gripe._90.megacells.definition.MEGABlockEntities; @@ -39,6 +40,7 @@ import gripe._90.megacells.definition.MEGAItems; import gripe._90.megacells.integration.appbot.AppBotItems; import gripe._90.megacells.integration.appmek.AppMekItems; +import gripe._90.megacells.menu.CellDockMenu; import gripe._90.megacells.menu.MEGAInterfaceMenu; import gripe._90.megacells.menu.MEGAPatternProviderMenu; @@ -46,6 +48,7 @@ @OnlyIn(Dist.CLIENT) public class MEGACellsClient { static void init() { + initConfigScreen(); initBuiltInModels(); var bus = FMLJavaModLoadingContext.get().getModEventBus(); @@ -53,14 +56,6 @@ static void init() { bus.addListener(MEGACellsClient::initRenderTypes); bus.addListener(MEGACellsClient::initModels); bus.addListener(MEGACellsClient::initItemColors); - - // the absolute state - ModLoadingContext.get() - .registerExtensionPoint( - ConfigScreenHandler.ConfigScreenFactory.class, - () -> new ConfigScreenHandler.ConfigScreenFactory( - (client, parent) -> AutoConfig.getConfigScreen(MEGAConfig.class, parent) - .get())); } private static void initScreens(FMLClientSetupEvent ignoredEvent) { @@ -72,6 +67,7 @@ private static void initScreens(FMLClientSetupEvent ignoredEvent) { MEGAPatternProviderMenu.TYPE, PatternProviderScreen::new, "/screens/megacells/mega_pattern_provider.json"); + InitScreens.register(CellDockMenu.TYPE, CellDockScreen::new, "/screens/megacells/cell_dock.json"); } private static void initRenderTypes(FMLClientSetupEvent ignoredEvent) { @@ -124,4 +120,14 @@ private static void initItemColors(RegisterColorHandlersEvent.Item event) { event.register(BasicStorageCell::getColor, cells.toArray(new ItemLike[0])); event.register(PortableCellItem::getColor, portables.toArray(new ItemLike[0])); } + + private static void initConfigScreen() { + // the absolute state + ModLoadingContext.get() + .registerExtensionPoint( + ConfigScreenHandler.ConfigScreenFactory.class, + () -> new ConfigScreenHandler.ConfigScreenFactory( + (client, parent) -> AutoConfig.getConfigScreen(MEGAConfig.class, parent) + .get())); + } } diff --git a/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsForge.java b/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsForge.java index 4736aa27..98c019e5 100644 --- a/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsForge.java +++ b/forge/src/main/java/gripe/_90/megacells/forge/MEGACellsForge.java @@ -21,6 +21,7 @@ import gripe._90.megacells.definition.MEGAItems; import gripe._90.megacells.integration.appmek.AppMekIntegration; import gripe._90.megacells.integration.appmek.AppMekItems; +import gripe._90.megacells.menu.CellDockMenu; import gripe._90.megacells.menu.MEGAInterfaceMenu; import gripe._90.megacells.menu.MEGAPatternProviderMenu; @@ -66,6 +67,7 @@ private void registerAll(RegisterEvent event) { if (event.getRegistryKey().equals(Registries.MENU)) { ForgeRegistries.MENU_TYPES.register(AppEng.makeId("mega_interface"), MEGAInterfaceMenu.TYPE); ForgeRegistries.MENU_TYPES.register(AppEng.makeId("mega_pattern_provider"), MEGAPatternProviderMenu.TYPE); + ForgeRegistries.MENU_TYPES.register(AppEng.makeId("cell_dock"), CellDockMenu.TYPE); } } diff --git a/settings.gradle.kts b/settings.gradle.kts index a5db0b79..9f7f1fdd 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -24,7 +24,7 @@ dependencyResolutionManagement { library("fabric-api", "net.fabricmc.fabric-api", "fabric-api").version("0.83.1+$minecraftVersion") library("forge", "net.minecraftforge", "forge").version("$minecraftVersion-47.1.3") - version("ae2", "15.0.13") + version("ae2", "15.0.14") library("ae2-fabric", "appeng", "appliedenergistics2-fabric").versionRef("ae2") library("ae2-forge", "appeng", "appliedenergistics2-forge").versionRef("ae2") From a757781a214ce5b2cac66e33df92d0ff1b658d34 Mon Sep 17 00:00:00 2001 From: 90 Date: Mon, 30 Oct 2023 23:55:07 +0000 Subject: [PATCH 10/14] More refactoring and reorganisation --- .../java/gripe/_90/megacells/MEGACells.java | 2 +- .../CompressionChain.java | 2 +- .../CompressionService.java | 2 +- .../CompressionVariant.java | 2 +- .../DecompressionPattern.java | 17 +++++--- .../DecompressionPatternItem.java | 2 +- .../DecompressionService.java | 14 ++++-- .../DecompressionPatternEncoding.java | 43 ------------------- .../_90/megacells/definition/MEGAItems.java | 2 +- .../item/cell/BulkCellInventory.java | 4 +- .../_90/megacells/item/cell/BulkCellItem.java | 9 ++-- .../item/part/DecompressionModulePart.java | 4 +- .../_90/megacells/fabric/FabricPlatform.java | 2 +- .../_90/megacells/forge/ForgePlatform.java | 2 +- .../appmek/item/RadioactiveCellInventory.java | 13 ++---- .../appmek/item/RadioactiveCellItem.java | 1 + 16 files changed, 43 insertions(+), 78 deletions(-) rename common/src/main/java/gripe/_90/megacells/{util => compression}/CompressionChain.java (98%) rename common/src/main/java/gripe/_90/megacells/{util => compression}/CompressionService.java (99%) rename common/src/main/java/gripe/_90/megacells/{util => compression}/CompressionVariant.java (85%) rename common/src/main/java/gripe/_90/megacells/{crafting => compression}/DecompressionPattern.java (81%) rename common/src/main/java/gripe/_90/megacells/{crafting => compression}/DecompressionPatternItem.java (96%) rename common/src/main/java/gripe/_90/megacells/{crafting => compression}/DecompressionService.java (84%) delete mode 100644 common/src/main/java/gripe/_90/megacells/crafting/DecompressionPatternEncoding.java diff --git a/common/src/main/java/gripe/_90/megacells/MEGACells.java b/common/src/main/java/gripe/_90/megacells/MEGACells.java index d03cc77c..6559f8ba 100644 --- a/common/src/main/java/gripe/_90/megacells/MEGACells.java +++ b/common/src/main/java/gripe/_90/megacells/MEGACells.java @@ -19,9 +19,9 @@ import appeng.core.localization.GuiText; import appeng.hotkeys.HotkeyActions; +import gripe._90.megacells.compression.DecompressionService; import gripe._90.megacells.core.Addons; import gripe._90.megacells.core.Platform; -import gripe._90.megacells.crafting.DecompressionService; import gripe._90.megacells.definition.MEGABlockEntities; import gripe._90.megacells.definition.MEGABlocks; import gripe._90.megacells.definition.MEGAConfig; diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java b/common/src/main/java/gripe/_90/megacells/compression/CompressionChain.java similarity index 98% rename from common/src/main/java/gripe/_90/megacells/util/CompressionChain.java rename to common/src/main/java/gripe/_90/megacells/compression/CompressionChain.java index 8e006c3d..4de6c4d2 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionChain.java +++ b/common/src/main/java/gripe/_90/megacells/compression/CompressionChain.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.util; +package gripe._90.megacells.compression; import java.math.BigInteger; import java.util.Collections; diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java b/common/src/main/java/gripe/_90/megacells/compression/CompressionService.java similarity index 99% rename from common/src/main/java/gripe/_90/megacells/util/CompressionService.java rename to common/src/main/java/gripe/_90/megacells/compression/CompressionService.java index 933ef585..f527ca13 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionService.java +++ b/common/src/main/java/gripe/_90/megacells/compression/CompressionService.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.util; +package gripe._90.megacells.compression; import java.util.Arrays; import java.util.Collection; diff --git a/common/src/main/java/gripe/_90/megacells/util/CompressionVariant.java b/common/src/main/java/gripe/_90/megacells/compression/CompressionVariant.java similarity index 85% rename from common/src/main/java/gripe/_90/megacells/util/CompressionVariant.java rename to common/src/main/java/gripe/_90/megacells/compression/CompressionVariant.java index 40eb1662..88dc27cf 100644 --- a/common/src/main/java/gripe/_90/megacells/util/CompressionVariant.java +++ b/common/src/main/java/gripe/_90/megacells/compression/CompressionVariant.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.util; +package gripe._90.megacells.compression; import net.minecraft.world.item.Item; diff --git a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionPattern.java b/common/src/main/java/gripe/_90/megacells/compression/DecompressionPattern.java similarity index 81% rename from common/src/main/java/gripe/_90/megacells/crafting/DecompressionPattern.java rename to common/src/main/java/gripe/_90/megacells/compression/DecompressionPattern.java index ae88cec1..c00216f8 100644 --- a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionPattern.java +++ b/common/src/main/java/gripe/_90/megacells/compression/DecompressionPattern.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.crafting; +package gripe._90.megacells.compression; import java.util.Objects; @@ -11,6 +11,11 @@ import appeng.api.stacks.GenericStack; public class DecompressionPattern implements IPatternDetails { + static final String NBT_BASE = "base"; + static final String NBT_VARIANT = "variant"; + static final String NBT_FACTOR = "factor"; + static final String NBT_TO_COMPRESS = "toCompress"; + private final AEItemKey definition; private final AEItemKey base; private final AEItemKey variant; @@ -23,12 +28,12 @@ public DecompressionPattern(ItemStack stack) { public DecompressionPattern(AEItemKey definition) { this.definition = definition; - var tag = Objects.requireNonNull(definition.getTag()); - base = DecompressionPatternEncoding.getBase(tag); - variant = DecompressionPatternEncoding.getVariant(tag); - factor = DecompressionPatternEncoding.getFactor(tag); - toCompress = DecompressionPatternEncoding.getToCompress(tag); + var tag = Objects.requireNonNull(definition.getTag()); + base = AEItemKey.fromTag(tag.getCompound(NBT_BASE)); + variant = AEItemKey.fromTag(tag.getCompound(NBT_VARIANT)); + factor = tag.getInt(NBT_FACTOR); + toCompress = tag.getBoolean(NBT_TO_COMPRESS); } @Override diff --git a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionPatternItem.java b/common/src/main/java/gripe/_90/megacells/compression/DecompressionPatternItem.java similarity index 96% rename from common/src/main/java/gripe/_90/megacells/crafting/DecompressionPatternItem.java rename to common/src/main/java/gripe/_90/megacells/compression/DecompressionPatternItem.java index f147c8c9..41c9ddee 100644 --- a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionPatternItem.java +++ b/common/src/main/java/gripe/_90/megacells/compression/DecompressionPatternItem.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.crafting; +package gripe._90.megacells.compression; import org.jetbrains.annotations.Nullable; diff --git a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionService.java b/common/src/main/java/gripe/_90/megacells/compression/DecompressionService.java similarity index 84% rename from common/src/main/java/gripe/_90/megacells/crafting/DecompressionService.java rename to common/src/main/java/gripe/_90/megacells/compression/DecompressionService.java index 61e205e3..d9998daa 100644 --- a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionService.java +++ b/common/src/main/java/gripe/_90/megacells/compression/DecompressionService.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.crafting; +package gripe._90.megacells.compression; import java.util.Collections; import java.util.List; @@ -16,6 +16,7 @@ import appeng.api.networking.IGridService; import appeng.api.networking.IGridServiceProvider; import appeng.api.networking.crafting.ICraftingProvider; +import appeng.api.stacks.AEItemKey; import gripe._90.megacells.definition.MEGAItems; import gripe._90.megacells.item.cell.BulkCellInventory; @@ -89,7 +90,7 @@ private Set generatePatterns(BulkCellInventory cell) { var pattern = new ItemStack(MEGAItems.DECOMPRESSION_PATTERN); var decompressed = decompressionChain.get(decompressionChain.indexOf(variant) + 1); - DecompressionPatternEncoding.encode(pattern.getOrCreateTag(), decompressed.item(), variant, false); + encodePattern(pattern.getOrCreateTag(), decompressed.item(), variant, false); patterns.add(new DecompressionPattern(pattern)); } @@ -103,10 +104,17 @@ private Set generatePatterns(BulkCellInventory cell) { var pattern = new ItemStack(MEGAItems.DECOMPRESSION_PATTERN); var decompressed = compressionChain.get(compressionChain.indexOf(variant) - 1); - DecompressionPatternEncoding.encode(pattern.getOrCreateTag(), decompressed.item(), variant, true); + encodePattern(pattern.getOrCreateTag(), decompressed.item(), variant, true); patterns.add(new DecompressionPattern(pattern)); } return patterns; } + + private void encodePattern(CompoundTag tag, AEItemKey base, CompressionVariant variant, boolean toCompress) { + tag.put(DecompressionPattern.NBT_VARIANT, variant.item().toTag()); + tag.put(DecompressionPattern.NBT_BASE, base.toTag()); + tag.putInt(DecompressionPattern.NBT_FACTOR, variant.factor()); + tag.putBoolean(DecompressionPattern.NBT_TO_COMPRESS, toCompress); + } } diff --git a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionPatternEncoding.java b/common/src/main/java/gripe/_90/megacells/crafting/DecompressionPatternEncoding.java deleted file mode 100644 index b7719923..00000000 --- a/common/src/main/java/gripe/_90/megacells/crafting/DecompressionPatternEncoding.java +++ /dev/null @@ -1,43 +0,0 @@ -package gripe._90.megacells.crafting; - -import java.util.Objects; - -import net.minecraft.nbt.CompoundTag; - -import appeng.api.stacks.AEItemKey; - -import gripe._90.megacells.util.CompressionVariant; - -public class DecompressionPatternEncoding { - private static final String NBT_BASE = "base"; - private static final String NBT_VARIANT = "variant"; - private static final String NBT_FACTOR = "factor"; - private static final String NBT_TO_COMPRESS = "toCompress"; - - public static AEItemKey getBase(CompoundTag nbt) { - Objects.requireNonNull(nbt, "Pattern must have a base tag."); - return AEItemKey.fromTag(nbt.getCompound(NBT_BASE)); - } - - public static AEItemKey getVariant(CompoundTag nbt) { - Objects.requireNonNull(nbt, "Pattern must have a variant tag."); - return AEItemKey.fromTag(nbt.getCompound(NBT_VARIANT)); - } - - public static int getFactor(CompoundTag nbt) { - Objects.requireNonNull(nbt, "Pattern must have a factor tag."); - return nbt.getInt(NBT_FACTOR); - } - - public static boolean getToCompress(CompoundTag nbt) { - Objects.requireNonNull(nbt, "Pattern must have a toCompress tag."); - return nbt.getBoolean(NBT_TO_COMPRESS); - } - - public static void encode(CompoundTag tag, AEItemKey base, CompressionVariant variant, boolean toCompress) { - tag.put(NBT_VARIANT, variant.item().toTag()); - tag.put(NBT_BASE, base.toTag()); - tag.putInt(NBT_FACTOR, variant.factor()); - tag.putBoolean(NBT_TO_COMPRESS, toCompress); - } -} diff --git a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java index e77a5ae0..1528f5f2 100644 --- a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java +++ b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java @@ -23,7 +23,7 @@ import appeng.menu.me.common.MEStorageMenu; import gripe._90.megacells.MEGACells; -import gripe._90.megacells.crafting.DecompressionPatternItem; +import gripe._90.megacells.compression.DecompressionPatternItem; import gripe._90.megacells.item.cell.BulkCellItem; import gripe._90.megacells.item.cell.MEGAPortableCell; import gripe._90.megacells.item.part.CellDockPart; diff --git a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java index c9c6f2c2..2e9b2b9f 100644 --- a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java +++ b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java @@ -17,8 +17,8 @@ import appeng.api.storage.cells.ISaveProvider; import appeng.api.storage.cells.StorageCell; -import gripe._90.megacells.util.CompressionChain; -import gripe._90.megacells.util.CompressionService; +import gripe._90.megacells.compression.CompressionChain; +import gripe._90.megacells.compression.CompressionService; public class BulkCellInventory implements StorageCell { private static final String KEY = "key"; diff --git a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java index 6a33f0cd..8da49165 100644 --- a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java +++ b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellItem.java @@ -77,11 +77,10 @@ public void appendHoverText(ItemStack is, Level level, @NotNull List } } } else { - if (storedItem != null) { - lines.add(MEGATranslations.MismatchedFilter.text().withStyle(ChatFormatting.DARK_RED)); - } else { - lines.add(Tooltips.of(MEGATranslations.NotPartitioned.text())); - } + lines.add( + storedItem != null + ? MEGATranslations.MismatchedFilter.text().withStyle(ChatFormatting.DARK_RED) + : Tooltips.of(MEGATranslations.NotPartitioned.text())); } lines.add(Tooltips.of(MEGATranslations.Compression.text( diff --git a/common/src/main/java/gripe/_90/megacells/item/part/DecompressionModulePart.java b/common/src/main/java/gripe/_90/megacells/item/part/DecompressionModulePart.java index d4dcc4b5..a3b4e1e5 100644 --- a/common/src/main/java/gripe/_90/megacells/item/part/DecompressionModulePart.java +++ b/common/src/main/java/gripe/_90/megacells/item/part/DecompressionModulePart.java @@ -24,8 +24,8 @@ import appeng.parts.PartModel; import gripe._90.megacells.MEGACells; -import gripe._90.megacells.crafting.DecompressionPattern; -import gripe._90.megacells.crafting.DecompressionService; +import gripe._90.megacells.compression.DecompressionPattern; +import gripe._90.megacells.compression.DecompressionService; public class DecompressionModulePart extends AEBasePart implements ICraftingProvider, IGridTickable { @PartModels diff --git a/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java b/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java index c8a9cf14..ba54f858 100644 --- a/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java +++ b/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java @@ -25,10 +25,10 @@ import appeng.core.definitions.AEBlocks; import appeng.init.InitVillager; +import gripe._90.megacells.compression.CompressionService; import gripe._90.megacells.core.Addons; import gripe._90.megacells.core.Loaders; import gripe._90.megacells.core.Platform; -import gripe._90.megacells.util.CompressionService; public final class FabricPlatform implements Platform { @Override diff --git a/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java b/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java index 88b6640d..74f1fbe2 100644 --- a/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java +++ b/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java @@ -38,10 +38,10 @@ import appeng.core.definitions.AEBlocks; import appeng.init.InitVillager; +import gripe._90.megacells.compression.CompressionService; import gripe._90.megacells.core.Addons; import gripe._90.megacells.core.Loaders; import gripe._90.megacells.core.Platform; -import gripe._90.megacells.util.CompressionService; public final class ForgePlatform implements Platform { @Override diff --git a/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellInventory.java b/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellInventory.java index d0f1c4b6..f63aa917 100644 --- a/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellInventory.java +++ b/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellInventory.java @@ -96,15 +96,10 @@ public double getIdleDrain() { } public boolean isBlackListed(AEKey what) { - if (what instanceof MekanismKey key) { - if (key.getStack().getRaw().getChemical() == MekanismGases.SPENT_NUCLEAR_WASTE.getChemical()) { - return !MEGAConfig.INSTANCE.isSpentWasteAllowed(); - } else { - return ChemicalAttributeValidator.DEFAULT.process(key.getStack()); - } - } else { - return true; - } + return !(what instanceof MekanismKey key) + || (key.getStack().getRaw().getChemical() == MekanismGases.SPENT_NUCLEAR_WASTE.getChemical() + ? !MEGAConfig.INSTANCE.isSpentWasteAllowed() + : ChemicalAttributeValidator.DEFAULT.process(key.getStack())); } @Override diff --git a/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellItem.java b/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellItem.java index 75f9f42b..a84d6aea 100644 --- a/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellItem.java +++ b/forge/src/main/java/gripe/_90/megacells/integration/appmek/item/RadioactiveCellItem.java @@ -37,6 +37,7 @@ public RadioactiveCellItem(Properties properties) { super(properties.stacksTo(1)); } + @Override public ConfigInventory getConfigInventory(ItemStack is) { return CellConfig.create(MekanismKeyType.TYPE.filter(), is, 1); } From a9bbb0b21e6855a92ed7db2495fb6443a944e3a4 Mon Sep 17 00:00:00 2001 From: Chiya <47343409+UraraChiya@users.noreply.github.com> Date: Tue, 31 Oct 2023 22:32:01 +0800 Subject: [PATCH 11/14] Added Simplified Chinese localization (#82) --- .../assets/megacells/lang/zh_cn.json | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 common/src/main/resources/assets/megacells/lang/zh_cn.json diff --git a/common/src/main/resources/assets/megacells/lang/zh_cn.json b/common/src/main/resources/assets/megacells/lang/zh_cn.json new file mode 100644 index 00000000..d6cf5d34 --- /dev/null +++ b/common/src/main/resources/assets/megacells/lang/zh_cn.json @@ -0,0 +1,86 @@ +{ + "block.megacells.16m_crafting_storage": "16M MEGA 合成存储器", + "block.megacells.1m_crafting_storage": "1M MEGA 合成存储器", + "block.megacells.256m_crafting_storage": "256M MEGA 合成存储器", + "block.megacells.4m_crafting_storage": "4M MEGA 合成存储器", + "block.megacells.64m_crafting_storage": "64M MEGA 合成存储器", + "block.megacells.mega_crafting_accelerator": "MEGA 并行处理单元", + "block.megacells.mega_crafting_monitor": "MEGA 合成监控器", + "block.megacells.mega_crafting_unit": "MEGA 合成单元", + "block.megacells.mega_energy_cell": "超密度能量单元", + "block.megacells.mega_interface": "MEGA 接口", + "block.megacells.mega_pattern_provider": "MEGA 样板供应器", + "block.megacells.sky_steel_block": "天空钢块", + "gui.megacells.ModName": "MEGA 单元", + "gui.tooltips.megacells.ALot": "很多。", + "gui.tooltips.megacells.AcceleratorThreads": "每个方块提供 4 个并行处理线程。", + "gui.tooltips.megacells.Compression": "压缩:%s", + "gui.tooltips.megacells.Contains": "包含:%s", + "gui.tooltips.megacells.Disabled": "失能", + "gui.tooltips.megacells.Empty": "空", + "gui.tooltips.megacells.Enabled": "使能", + "gui.tooltips.megacells.FilterChemicalUnsupported": "过滤化学品不受支持!", + "gui.tooltips.megacells.MismatchedFilter": "过滤器不匹配!", + "gui.tooltips.megacells.NotPartitioned": "未分区", + "gui.tooltips.megacells.PartitionedFor": "分区为:%s", + "gui.tooltips.megacells.ProcessingOnly": "仅支持处理模式。", + "gui.tooltips.megacells.Quantity": "数量:%s", + "item.megacells.accumulation_processor": "累加处理器", + "item.megacells.accumulation_processor_press": "累加压印模板", + "item.megacells.bulk_cell_component": "MEGA 大容量存储组件", + "item.megacells.bulk_item_cell": "MEGA 大容量物品存储元件", + "item.megacells.cable_mega_interface": "MEGA 接口", + "item.megacells.cable_mega_pattern_provider": "MEGA 样板供应器", + "item.megacells.cell_component_16m": "16M MEGA 存储组件", + "item.megacells.cell_component_1m": "1M MEGA 存储组件", + "item.megacells.cell_component_256m": "256M MEGA 存储组件", + "item.megacells.cell_component_4m": "4M MEGA 存储组件", + "item.megacells.cell_component_64m": "64M MEGA 存储组件", + "item.megacells.cell_dock": "ME 元件坞", + "item.megacells.chemical_storage_cell_16m": "16M MEGA 化学品存储元件", + "item.megacells.chemical_storage_cell_1m": "1M MEGA 化学品存储元件", + "item.megacells.chemical_storage_cell_256m": "256M MEGA 化学品存储元件", + "item.megacells.chemical_storage_cell_4m": "4M MEGA 化学品存储元件", + "item.megacells.chemical_storage_cell_64m": "64M MEGA 化学品存储元件", + "item.megacells.compression_card": "压缩卡", + "item.megacells.decompression_module": "MEGA 解压模块", + "item.megacells.decompression_pattern": "解压样板", + "item.megacells.fluid_storage_cell_16m": "16M MEGA 流体存储元件", + "item.megacells.fluid_storage_cell_1m": "1M MEGA 流体存储元件", + "item.megacells.fluid_storage_cell_256m": "256M MEGA 流体存储元件", + "item.megacells.fluid_storage_cell_4m": "4M MEGA 流体存储元件", + "item.megacells.fluid_storage_cell_64m": "64M MEGA 流体存储元件", + "item.megacells.greater_energy_card": "强效能源卡", + "item.megacells.item_storage_cell_16m": "16M MEGA 物品存储元件", + "item.megacells.item_storage_cell_1m": "1M MEGA 物品存储元件", + "item.megacells.item_storage_cell_256m": "256M MEGA 物品存储元件", + "item.megacells.item_storage_cell_4m": "4M MEGA 物品存储元件", + "item.megacells.item_storage_cell_64m": "64M MEGA 物品存储元件", + "item.megacells.mega_chemical_cell_housing": "MEGA 化学品元件外壳", + "item.megacells.mega_fluid_cell_housing": "MEGA 流体元件外壳", + "item.megacells.mega_item_cell_housing": "MEGA 物品元件外壳", + "item.megacells.portable_chemical_cell_16m": "16M 便携化学品元件", + "item.megacells.portable_chemical_cell_1m": "1M 便携化学品元件", + "item.megacells.portable_chemical_cell_256m": "256M 便携化学品元件", + "item.megacells.portable_chemical_cell_4m": "4M 便携化学品元件", + "item.megacells.portable_chemical_cell_64m": "64M 便携化学品元件", + "item.megacells.portable_fluid_cell_16m": "16M 便携流体元件", + "item.megacells.portable_fluid_cell_1m": "1M 便携流体元件", + "item.megacells.portable_fluid_cell_256m": "256M 便携流体元件", + "item.megacells.portable_fluid_cell_4m": "4M 便携流体元件", + "item.megacells.portable_fluid_cell_64m": "64M 便携流体元件", + "item.megacells.portable_item_cell_16m": "16M 便携物品元件", + "item.megacells.portable_item_cell_1m": "1M 便携物品元件", + "item.megacells.portable_item_cell_256m": "256M 便携物品元件", + "item.megacells.portable_item_cell_4m": "4M 便携物品元件", + "item.megacells.portable_item_cell_64m": "64M 便携物品元件", + "item.megacells.printed_accumulation_processor": "累加电路板", + "item.megacells.radioactive_cell_component": "MEGA 放射性存储组件", + "item.megacells.radioactive_chemical_cell": "MEGA 放射性化学品存储元件", + "item.megacells.sky_steel_ingot": "天空钢锭", + "text.autoconfig.megacells.option.AllowSpentWaste": "(AppMek) 允许衰变核废料", + "text.autoconfig.megacells.option.AllowSpentWaste.@Tooltip": "MEGA 放射元件是否能够储存衰变核废料。", + "text.autoconfig.megacells.option.CompressionChainLimit": "批量压缩链限制", + "text.autoconfig.megacells.option.CompressionChainLimit.@Tooltip": "启用压缩的大容量元件可以报告为已存储的变体的最大数量。", + "text.autoconfig.megacells.title": "MEGA 元件" +} From d1c0647e0b6db8d34420059fb94c091985f92e56 Mon Sep 17 00:00:00 2001 From: 90 Date: Wed, 1 Nov 2023 00:54:17 +0000 Subject: [PATCH 12/14] More refactoring and reorganisation --- .../java/gripe/_90/megacells/MEGACells.java | 26 +++++++++---------- .../compression/CompressionVariant.java | 11 -------- .../_90/megacells/definition/MEGAItems.java | 2 +- .../DecompressionPatternItem.java | 3 ++- .../item/cell/BulkCellInventory.java | 6 ++--- .../item/part/DecompressionModulePart.java | 4 +-- .../CompressionChain.java | 14 ++++------ .../CompressionService.java | 17 +++++++----- .../DecompressionPattern.java | 2 +- .../DecompressionService.java | 15 +++++------ .../_90/megacells/fabric/FabricPlatform.java | 2 +- .../_90/megacells/forge/ForgePlatform.java | 2 +- 12 files changed, 46 insertions(+), 58 deletions(-) delete mode 100644 common/src/main/java/gripe/_90/megacells/compression/CompressionVariant.java rename common/src/main/java/gripe/_90/megacells/{compression => item}/DecompressionPatternItem.java (92%) rename common/src/main/java/gripe/_90/megacells/{compression => misc}/CompressionChain.java (82%) rename common/src/main/java/gripe/_90/megacells/{compression => misc}/CompressionService.java (94%) rename common/src/main/java/gripe/_90/megacells/{compression => misc}/DecompressionPattern.java (98%) rename common/src/main/java/gripe/_90/megacells/{compression => misc}/DecompressionService.java (86%) diff --git a/common/src/main/java/gripe/_90/megacells/MEGACells.java b/common/src/main/java/gripe/_90/megacells/MEGACells.java index 6559f8ba..4f874e20 100644 --- a/common/src/main/java/gripe/_90/megacells/MEGACells.java +++ b/common/src/main/java/gripe/_90/megacells/MEGACells.java @@ -19,7 +19,6 @@ import appeng.core.localization.GuiText; import appeng.hotkeys.HotkeyActions; -import gripe._90.megacells.compression.DecompressionService; import gripe._90.megacells.core.Addons; import gripe._90.megacells.core.Platform; import gripe._90.megacells.definition.MEGABlockEntities; @@ -30,6 +29,7 @@ import gripe._90.megacells.integration.appbot.AppBotIntegration; import gripe._90.megacells.integration.appbot.AppBotItems; import gripe._90.megacells.item.cell.BulkCellItem; +import gripe._90.megacells.misc.DecompressionService; public final class MEGACells { private MEGACells() {} @@ -52,41 +52,39 @@ public static void initCommon() { MEGABlocks.init(); MEGABlockEntities.init(); - if (MEGACells.PLATFORM.isAddonLoaded(Addons.APPBOT)) { + if (PLATFORM.isAddonLoaded(Addons.APPBOT)) { AppBotItems.init(); } initStorageCells(); - MEGACells.PLATFORM.initCompression(); + PLATFORM.initCompression(); GridServices.register(DecompressionService.class, DecompressionService.class); - MEGACells.PLATFORM.addVillagerTrade(MEGAItems.SKY_STEEL_INGOT, 8, 3, 20); - MEGACells.PLATFORM.addVillagerTrade(MEGAItems.ACCUMULATION_PROCESSOR_PRESS, 40, 1, 50); + PLATFORM.addVillagerTrade(MEGAItems.SKY_STEEL_INGOT, 8, 3, 20); + PLATFORM.addVillagerTrade(MEGAItems.ACCUMULATION_PROCESSOR_PRESS, 40, 1, 50); } private static void initStorageCells() { Stream.of(MEGAItems.getItemCells(), MEGAItems.getItemPortables()) .flatMap(Collection::stream) - .forEach(c -> StorageCellModels.registerModel(c, MEGACells.makeId("block/drive/cells/mega_item_cell"))); + .forEach(c -> StorageCellModels.registerModel(c, makeId("block/drive/cells/mega_item_cell"))); Stream.of(MEGAItems.getFluidCells(), MEGAItems.getFluidPortables()) .flatMap(Collection::stream) - .forEach( - c -> StorageCellModels.registerModel(c, MEGACells.makeId("block/drive/cells/mega_fluid_cell"))); + .forEach(c -> StorageCellModels.registerModel(c, makeId("block/drive/cells/mega_fluid_cell"))); StorageCells.addCellHandler(BulkCellItem.HANDLER); - StorageCellModels.registerModel(MEGAItems.BULK_ITEM_CELL, MEGACells.makeId("block/drive/cells/bulk_item_cell")); + StorageCellModels.registerModel(MEGAItems.BULK_ITEM_CELL, makeId("block/drive/cells/bulk_item_cell")); MEGAItems.getItemPortables() .forEach(cell -> HotkeyActions.registerPortableCell(cell, HotkeyAction.PORTABLE_ITEM_CELL)); MEGAItems.getFluidPortables() .forEach(cell -> HotkeyActions.registerPortableCell(cell, HotkeyAction.PORTABLE_FLUID_CELL)); - if (MEGACells.PLATFORM.isAddonLoaded(Addons.APPBOT)) { + if (PLATFORM.isAddonLoaded(Addons.APPBOT)) { Stream.of(AppBotItems.getCells(), AppBotItems.getPortables()) .flatMap(Collection::stream) - .forEach(c -> - StorageCellModels.registerModel(c, MEGACells.makeId("block/drive/cells/mega_mana_cell"))); + .forEach(c -> StorageCellModels.registerModel(c, makeId("block/drive/cells/mega_mana_cell"))); } } @@ -152,11 +150,11 @@ public static void initUpgrades() { Upgrades.add(MEGAItems.GREATER_ENERGY_CARD, portableCell, 2, portableCellGroup); } - if (MEGACells.PLATFORM.isAddonLoaded(Addons.AE2WTLIB)) { + if (PLATFORM.isAddonLoaded(Addons.AE2WTLIB)) { AE2WTIntegration.initUpgrades(); } - if (MEGACells.PLATFORM.isAddonLoaded(Addons.APPBOT)) { + if (PLATFORM.isAddonLoaded(Addons.APPBOT)) { AppBotIntegration.initUpgrades(); } } diff --git a/common/src/main/java/gripe/_90/megacells/compression/CompressionVariant.java b/common/src/main/java/gripe/_90/megacells/compression/CompressionVariant.java deleted file mode 100644 index 88dc27cf..00000000 --- a/common/src/main/java/gripe/_90/megacells/compression/CompressionVariant.java +++ /dev/null @@ -1,11 +0,0 @@ -package gripe._90.megacells.compression; - -import net.minecraft.world.item.Item; - -import appeng.api.stacks.AEItemKey; - -public record CompressionVariant(AEItemKey item, byte factor) { - public CompressionVariant(Item item, byte factor) { - this(AEItemKey.of(item), factor); - } -} diff --git a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java index 1528f5f2..4331c81b 100644 --- a/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java +++ b/common/src/main/java/gripe/_90/megacells/definition/MEGAItems.java @@ -23,7 +23,7 @@ import appeng.menu.me.common.MEStorageMenu; import gripe._90.megacells.MEGACells; -import gripe._90.megacells.compression.DecompressionPatternItem; +import gripe._90.megacells.item.DecompressionPatternItem; import gripe._90.megacells.item.cell.BulkCellItem; import gripe._90.megacells.item.cell.MEGAPortableCell; import gripe._90.megacells.item.part.CellDockPart; diff --git a/common/src/main/java/gripe/_90/megacells/compression/DecompressionPatternItem.java b/common/src/main/java/gripe/_90/megacells/item/DecompressionPatternItem.java similarity index 92% rename from common/src/main/java/gripe/_90/megacells/compression/DecompressionPatternItem.java rename to common/src/main/java/gripe/_90/megacells/item/DecompressionPatternItem.java index 41c9ddee..3161475d 100644 --- a/common/src/main/java/gripe/_90/megacells/compression/DecompressionPatternItem.java +++ b/common/src/main/java/gripe/_90/megacells/item/DecompressionPatternItem.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.compression; +package gripe._90.megacells.item; import org.jetbrains.annotations.Nullable; @@ -9,6 +9,7 @@ import appeng.crafting.pattern.EncodedPatternItem; import gripe._90.megacells.MEGACells; +import gripe._90.megacells.misc.DecompressionPattern; public class DecompressionPatternItem extends EncodedPatternItem { public DecompressionPatternItem(Properties properties) { diff --git a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java index 2e9b2b9f..9b85a14f 100644 --- a/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java +++ b/common/src/main/java/gripe/_90/megacells/item/cell/BulkCellInventory.java @@ -17,8 +17,8 @@ import appeng.api.storage.cells.ISaveProvider; import appeng.api.storage.cells.StorageCell; -import gripe._90.megacells.compression.CompressionChain; -import gripe._90.megacells.compression.CompressionService; +import gripe._90.megacells.misc.CompressionChain; +import gripe._90.megacells.misc.CompressionService; public class BulkCellInventory implements StorageCell { private static final String KEY = "key"; @@ -231,7 +231,7 @@ public void getAvailableStacks(KeyCounter out) { var compressionFactor = BigInteger.valueOf(variant.factor()); var key = variant.item(); - if (count.divide(compressionFactor).signum() == 1 && variant != chain.last()) { + if (count.divide(compressionFactor).signum() == 1 && variant != chain.get(chain.size() - 1)) { out.add(key, count.remainder(compressionFactor).longValue()); count = count.divide(compressionFactor); } else { diff --git a/common/src/main/java/gripe/_90/megacells/item/part/DecompressionModulePart.java b/common/src/main/java/gripe/_90/megacells/item/part/DecompressionModulePart.java index a3b4e1e5..77b2a7d2 100644 --- a/common/src/main/java/gripe/_90/megacells/item/part/DecompressionModulePart.java +++ b/common/src/main/java/gripe/_90/megacells/item/part/DecompressionModulePart.java @@ -24,8 +24,8 @@ import appeng.parts.PartModel; import gripe._90.megacells.MEGACells; -import gripe._90.megacells.compression.DecompressionPattern; -import gripe._90.megacells.compression.DecompressionService; +import gripe._90.megacells.misc.DecompressionPattern; +import gripe._90.megacells.misc.DecompressionService; public class DecompressionModulePart extends AEBasePart implements ICraftingProvider, IGridTickable { @PartModels diff --git a/common/src/main/java/gripe/_90/megacells/compression/CompressionChain.java b/common/src/main/java/gripe/_90/megacells/misc/CompressionChain.java similarity index 82% rename from common/src/main/java/gripe/_90/megacells/compression/CompressionChain.java rename to common/src/main/java/gripe/_90/megacells/misc/CompressionChain.java index 4de6c4d2..9ec2f62f 100644 --- a/common/src/main/java/gripe/_90/megacells/compression/CompressionChain.java +++ b/common/src/main/java/gripe/_90/megacells/misc/CompressionChain.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.compression; +package gripe._90.megacells.misc; import java.math.BigInteger; import java.util.Collections; @@ -10,9 +10,9 @@ import gripe._90.megacells.definition.MEGAConfig; -public class CompressionChain extends ObjectArrayList { +public class CompressionChain extends ObjectArrayList { public void add(AEItemKey item, byte factor) { - this.add(new CompressionVariant(item, factor)); + this.add(new CompressionService.Variant(item, factor)); } public boolean containsVariant(AEItemKey item) { @@ -30,15 +30,11 @@ public BigInteger unitFactor(AEItemKey item) { return subChain.stream().map(v -> BigInteger.valueOf(v.factor())).reduce(BigInteger.ONE, BigInteger::multiply); } - public CompressionVariant last() { - return get(size - 1); - } - public CompressionChain lastMultiplierSwapped() { - var multipliers = this.stream().map(CompressionVariant::factor).collect(Collectors.toList()); + var multipliers = this.stream().map(CompressionService.Variant::factor).collect(Collectors.toList()); Collections.rotate(multipliers, -1); - var items = this.stream().map(CompressionVariant::item).toList(); + var items = this.stream().map(CompressionService.Variant::item).toList(); var chain = new CompressionChain(); for (var i = 0; i < items.size(); i++) { diff --git a/common/src/main/java/gripe/_90/megacells/compression/CompressionService.java b/common/src/main/java/gripe/_90/megacells/misc/CompressionService.java similarity index 94% rename from common/src/main/java/gripe/_90/megacells/compression/CompressionService.java rename to common/src/main/java/gripe/_90/megacells/misc/CompressionService.java index f527ca13..2196e48e 100644 --- a/common/src/main/java/gripe/_90/megacells/compression/CompressionService.java +++ b/common/src/main/java/gripe/_90/megacells/misc/CompressionService.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.compression; +package gripe._90.megacells.misc; import java.util.Arrays; import java.util.Collection; @@ -116,22 +116,21 @@ private CompressionChain generateChain( return chain; } - private CompressionVariant getNextVariant( - Item item, List recipes, boolean compressed, RegistryAccess access) { + private Variant getNextVariant(Item item, List recipes, boolean compressed, RegistryAccess access) { for (var override : overrides) { if (compressed && override.smaller.equals(item)) { - return new CompressionVariant(override.larger, override.factor); + return new Variant(override.larger, override.factor); } if (!compressed && override.larger.equals(item)) { - return new CompressionVariant(override.smaller, override.factor); + return new Variant(override.smaller, override.factor); } } for (var recipe : recipes) { for (var input : recipe.getIngredients().get(0).getItems()) { if (input.getItem().equals(item)) { - return new CompressionVariant(recipe.getResultItem(access).getItem(), (byte) + return new Variant(recipe.getResultItem(access).getItem(), (byte) (compressed ? recipe.getIngredients().size() : recipe.getResultItem(access).getCount())); @@ -225,5 +224,11 @@ private boolean overrideRecipe(CraftingRecipe recipe, RegistryAccess access) { return false; } + public record Variant(AEItemKey item, byte factor) { + private Variant(Item item, byte factor) { + this(AEItemKey.of(item), factor); + } + } + private record Override(Item smaller, Item larger, byte factor) {} } diff --git a/common/src/main/java/gripe/_90/megacells/compression/DecompressionPattern.java b/common/src/main/java/gripe/_90/megacells/misc/DecompressionPattern.java similarity index 98% rename from common/src/main/java/gripe/_90/megacells/compression/DecompressionPattern.java rename to common/src/main/java/gripe/_90/megacells/misc/DecompressionPattern.java index c00216f8..3d68c542 100644 --- a/common/src/main/java/gripe/_90/megacells/compression/DecompressionPattern.java +++ b/common/src/main/java/gripe/_90/megacells/misc/DecompressionPattern.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.compression; +package gripe._90.megacells.misc; import java.util.Objects; diff --git a/common/src/main/java/gripe/_90/megacells/compression/DecompressionService.java b/common/src/main/java/gripe/_90/megacells/misc/DecompressionService.java similarity index 86% rename from common/src/main/java/gripe/_90/megacells/compression/DecompressionService.java rename to common/src/main/java/gripe/_90/megacells/misc/DecompressionService.java index d9998daa..db6a3397 100644 --- a/common/src/main/java/gripe/_90/megacells/compression/DecompressionService.java +++ b/common/src/main/java/gripe/_90/megacells/misc/DecompressionService.java @@ -1,4 +1,4 @@ -package gripe._90.megacells.compression; +package gripe._90.megacells.misc; import java.util.Collections; import java.util.List; @@ -8,7 +8,6 @@ import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.ItemStack; import appeng.api.crafting.IPatternDetails; import appeng.api.implementations.blockentities.IChestOrDrive; @@ -83,14 +82,14 @@ private Set generatePatterns(BulkCellInventory cell) { var decompressionChain = fullChain.limited().reversed(); for (var variant : decompressionChain) { - if (variant == decompressionChain.last()) { + if (variant == decompressionChain.get(decompressionChain.size() - 1)) { continue; } - var pattern = new ItemStack(MEGAItems.DECOMPRESSION_PATTERN); + var pattern = MEGAItems.DECOMPRESSION_PATTERN.stack(); var decompressed = decompressionChain.get(decompressionChain.indexOf(variant) + 1); - encodePattern(pattern.getOrCreateTag(), decompressed.item(), variant, false); + encode(pattern.getOrCreateTag(), decompressed.item(), variant, false); patterns.add(new DecompressionPattern(pattern)); } @@ -101,17 +100,17 @@ private Set generatePatterns(BulkCellInventory cell) { continue; } - var pattern = new ItemStack(MEGAItems.DECOMPRESSION_PATTERN); + var pattern = MEGAItems.DECOMPRESSION_PATTERN.stack(); var decompressed = compressionChain.get(compressionChain.indexOf(variant) - 1); - encodePattern(pattern.getOrCreateTag(), decompressed.item(), variant, true); + encode(pattern.getOrCreateTag(), decompressed.item(), variant, true); patterns.add(new DecompressionPattern(pattern)); } return patterns; } - private void encodePattern(CompoundTag tag, AEItemKey base, CompressionVariant variant, boolean toCompress) { + private void encode(CompoundTag tag, AEItemKey base, CompressionService.Variant variant, boolean toCompress) { tag.put(DecompressionPattern.NBT_VARIANT, variant.item().toTag()); tag.put(DecompressionPattern.NBT_BASE, base.toTag()); tag.putInt(DecompressionPattern.NBT_FACTOR, variant.factor()); diff --git a/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java b/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java index ba54f858..357c1911 100644 --- a/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java +++ b/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java @@ -25,10 +25,10 @@ import appeng.core.definitions.AEBlocks; import appeng.init.InitVillager; -import gripe._90.megacells.compression.CompressionService; import gripe._90.megacells.core.Addons; import gripe._90.megacells.core.Loaders; import gripe._90.megacells.core.Platform; +import gripe._90.megacells.misc.CompressionService; public final class FabricPlatform implements Platform { @Override diff --git a/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java b/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java index 74f1fbe2..935c0043 100644 --- a/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java +++ b/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java @@ -38,10 +38,10 @@ import appeng.core.definitions.AEBlocks; import appeng.init.InitVillager; -import gripe._90.megacells.compression.CompressionService; import gripe._90.megacells.core.Addons; import gripe._90.megacells.core.Loaders; import gripe._90.megacells.core.Platform; +import gripe._90.megacells.misc.CompressionService; public final class ForgePlatform implements Platform { @Override From 963ce52a003af12a61435bfe9dbf20989b60d2a6 Mon Sep 17 00:00:00 2001 From: 90 Date: Wed, 1 Nov 2023 12:30:00 +0000 Subject: [PATCH 13/14] Switch to using lava for Sky Steel recipe (#84) --- .../datagen/CommonRecipeProvider.java | 4 +- .../data/resources/megacells.data.mixins.json | 8 +- .../java/gripe/_90/megacells/MEGACells.java | 2 + .../gripe/_90/megacells/core/Platform.java | 2 + .../megacells/misc/LavaTransformLogic.java | 80 +++++++++++++++++++ .../_90/megacells/mixin/ItemEntityMixin.java | 57 +++++++++++++ .../src/main/resources/megacells.mixins.json | 9 +++ .../_90/megacells/fabric/FabricPlatform.java | 9 +++ fabric/src/main/resources/fabric.mod.json | 1 + forge/build.gradle.kts | 1 + .../megacells.data.forge.mixins.json | 3 +- .../_90/megacells/forge/ForgePlatform.java | 9 +++ .../resources/megacells.forge.mixins.json | 3 +- 13 files changed, 176 insertions(+), 12 deletions(-) create mode 100644 common/src/main/java/gripe/_90/megacells/misc/LavaTransformLogic.java create mode 100644 common/src/main/java/gripe/_90/megacells/mixin/ItemEntityMixin.java create mode 100644 common/src/main/resources/megacells.mixins.json diff --git a/common/src/data/java/gripe/_90/megacells/datagen/CommonRecipeProvider.java b/common/src/data/java/gripe/_90/megacells/datagen/CommonRecipeProvider.java index 05d023c7..9fd5e3d4 100644 --- a/common/src/data/java/gripe/_90/megacells/datagen/CommonRecipeProvider.java +++ b/common/src/data/java/gripe/_90/megacells/datagen/CommonRecipeProvider.java @@ -183,9 +183,9 @@ public void buildRecipes(Consumer consumer) { MEGACells.makeId("transform/sky_steel_ingot"), MEGAItems.SKY_STEEL_INGOT, 2, - TransformCircumstance.fluid(FluidTags.WATER), - Ingredient.of(ConventionTags.IRON_INGOT), + TransformCircumstance.fluid(FluidTags.LAVA), Ingredient.of(AEItems.CERTUS_QUARTZ_CRYSTAL_CHARGED), + Ingredient.of(ConventionTags.IRON_INGOT), Ingredient.of(AEBlocks.SKY_STONE_BLOCK)); InscriberRecipeBuilder.inscribe(AEItems.SINGULARITY, MEGAItems.ACCUMULATION_PROCESSOR_PRESS, 1) diff --git a/common/src/data/resources/megacells.data.mixins.json b/common/src/data/resources/megacells.data.mixins.json index 56cb530b..cb51108c 100644 --- a/common/src/data/resources/megacells.data.mixins.json +++ b/common/src/data/resources/megacells.data.mixins.json @@ -1,10 +1,6 @@ { "required": true, - "minVersion": "0.8", + "minVersion": "0.8.5", "package": "gripe._90.megacells.mixin.data", - "compatibilityLevel": "JAVA_17", - "mixins": ["TextureSlotAccessor"], - "injectors": { - "defaultRequire": 1 - } + "mixins": ["TextureSlotAccessor"] } diff --git a/common/src/main/java/gripe/_90/megacells/MEGACells.java b/common/src/main/java/gripe/_90/megacells/MEGACells.java index 4f874e20..57cd8bfa 100644 --- a/common/src/main/java/gripe/_90/megacells/MEGACells.java +++ b/common/src/main/java/gripe/_90/megacells/MEGACells.java @@ -61,6 +61,8 @@ public static void initCommon() { PLATFORM.initCompression(); GridServices.register(DecompressionService.class, DecompressionService.class); + PLATFORM.initLavaTransform(); + PLATFORM.addVillagerTrade(MEGAItems.SKY_STEEL_INGOT, 8, 3, 20); PLATFORM.addVillagerTrade(MEGAItems.ACCUMULATION_PROCESSOR_PRESS, 40, 1, 50); } diff --git a/common/src/main/java/gripe/_90/megacells/core/Platform.java b/common/src/main/java/gripe/_90/megacells/core/Platform.java index 3d8458af..d00a7039 100644 --- a/common/src/main/java/gripe/_90/megacells/core/Platform.java +++ b/common/src/main/java/gripe/_90/megacells/core/Platform.java @@ -16,6 +16,8 @@ public interface Platform { void initCompression(); + void initLavaTransform(); + void addVillagerTrade(ItemLike item, int cost, int quantity, int xp); BakedModel createWrappedCellModel(Item cell, BlockOrientation orientation); diff --git a/common/src/main/java/gripe/_90/megacells/misc/LavaTransformLogic.java b/common/src/main/java/gripe/_90/megacells/misc/LavaTransformLogic.java new file mode 100644 index 00000000..6556791d --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/misc/LavaTransformLogic.java @@ -0,0 +1,80 @@ +package gripe._90.megacells.misc; + +import java.util.HashSet; +import java.util.Set; + +import net.minecraft.tags.FluidTags; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; + +import appeng.recipes.transform.TransformRecipe; + +public final class LavaTransformLogic { + private static final Set lavaCache = new HashSet<>(); + + public static boolean canTransformInLava(ItemEntity entity) { + return getLavaTransformableItems(entity.level()) + .contains(entity.getItem().getItem()); + } + + @SuppressWarnings("resource") + public static boolean allIngredientsPresent(ItemEntity entity) { + var x = entity.getX(); + var y = entity.getY(); + var z = entity.getZ(); + var level = entity.level(); + + var items = level.getEntities(null, new AABB(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1)).stream() + .filter(e -> e instanceof ItemEntity && !e.isRemoved()) + .map(e -> ((ItemEntity) e).getItem().getItem()) + .toList(); + + for (var recipe : level.getRecipeManager().getAllRecipesFor(TransformRecipe.TYPE)) { + if (!recipe.circumstance.isFluidTag(FluidTags.LAVA)) { + continue; + } + + if (recipe.ingredients.isEmpty()) { + continue; + } + + return recipe.ingredients.stream().noneMatch(ingredient -> { + for (var stack : ingredient.getItems()) { + if (items.contains(stack.getItem())) { + return false; + } + } + + return true; + }); + } + + return false; + } + + private static Set getLavaTransformableItems(Level level) { + if (lavaCache.isEmpty()) { + for (var recipe : level.getRecipeManager().getAllRecipesFor(TransformRecipe.TYPE)) { + if (!recipe.circumstance.isFluidTag(FluidTags.LAVA)) { + continue; + } + + for (var ingredient : recipe.ingredients) { + for (var stack : ingredient.getItems()) { + lavaCache.add(stack.getItem()); + } + + // Don't break here unlike AE2's TransformLogic, otherwise non-processed items will burn up + } + } + } + + return lavaCache; + } + + public static void clearCache() { + lavaCache.clear(); + } +} diff --git a/common/src/main/java/gripe/_90/megacells/mixin/ItemEntityMixin.java b/common/src/main/java/gripe/_90/megacells/mixin/ItemEntityMixin.java new file mode 100644 index 00000000..711cc25c --- /dev/null +++ b/common/src/main/java/gripe/_90/megacells/mixin/ItemEntityMixin.java @@ -0,0 +1,57 @@ +package gripe._90.megacells.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.core.BlockPos; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.level.Level; + +import gripe._90.megacells.misc.LavaTransformLogic; + +@Mixin(ItemEntity.class) +public abstract class ItemEntityMixin extends Entity { + public ItemEntityMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Unique + private boolean mega$lavaImmune = false; + + @Unique + private int mega$lavaTicks = 0; + + @Inject(method = "fireImmune", at = @At("RETURN"), cancellable = true) + private void handleLavaTransform(CallbackInfoReturnable cir) { + cir.setReturnValue(cir.getReturnValue() || mega$lavaImmune); + } + + @SuppressWarnings({"resource", "DataFlowIssue"}) + @Inject(method = "tick", at = @At("RETURN")) + private void lavaTimeout(CallbackInfo ci) { + var self = (ItemEntity) (Object) this; + + if (LavaTransformLogic.canTransformInLava(self)) { + var x = Mth.floor(getX()); + var y = Mth.floor((getBoundingBox().minY + getBoundingBox().maxY) / 2); + var z = Mth.floor(getZ()); + var state = level().getFluidState(new BlockPos(x, y, z)); + + if (state.is(FluidTags.LAVA)) { + mega$lavaImmune = mega$lavaTicks++ <= 200 || LavaTransformLogic.allIngredientsPresent(self); + + if (mega$lavaTicks > 200 && LavaTransformLogic.allIngredientsPresent(self)) { + mega$lavaTicks = 0; + } + } + } + } +} diff --git a/common/src/main/resources/megacells.mixins.json b/common/src/main/resources/megacells.mixins.json new file mode 100644 index 00000000..a06da976 --- /dev/null +++ b/common/src/main/resources/megacells.mixins.json @@ -0,0 +1,9 @@ +{ + "required": true, + "minVersion": "0.8.5", + "package": "gripe._90.megacells.mixin", + "mixins": ["ItemEntityMixin"], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java b/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java index 357c1911..1a34b908 100644 --- a/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java +++ b/fabric/src/main/java/gripe/_90/megacells/fabric/FabricPlatform.java @@ -29,6 +29,7 @@ import gripe._90.megacells.core.Loaders; import gripe._90.megacells.core.Platform; import gripe._90.megacells.misc.CompressionService; +import gripe._90.megacells.misc.LavaTransformLogic; public final class FabricPlatform implements Platform { @Override @@ -55,6 +56,14 @@ public void initCompression() { }); } + @Override + public void initLavaTransform() { + ServerLifecycleEvents.SERVER_STARTED.register(server -> LavaTransformLogic.clearCache()); + ServerLifecycleEvents.END_DATA_PACK_RELOAD.register((server, resourceManager, success) -> { + if (success) LavaTransformLogic.clearCache(); + }); + } + @Override public void addVillagerTrade(ItemLike item, int cost, int quantity, int xp) { TradeOfferHelper.registerVillagerOffers( diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 86a02299..5d5e1949 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -20,6 +20,7 @@ "ae2:client": ["gripe._90.megacells.fabric.MEGACellsClient"], "modmenu": ["gripe._90.megacells.integration.modmenu.ModMenuIntegration"] }, + "mixins": ["megacells.mixins.json"], "depends": { "minecraft": "$minecraftVersion", diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index 90c1b367..57db589d 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -26,6 +26,7 @@ loom { } forge { + mixinConfig("$modId.mixins.json") mixinConfig("$modId.forge.mixins.json") } } diff --git a/forge/src/data/resources/megacells.data.forge.mixins.json b/forge/src/data/resources/megacells.data.forge.mixins.json index b97c304a..adde65df 100644 --- a/forge/src/data/resources/megacells.data.forge.mixins.json +++ b/forge/src/data/resources/megacells.data.forge.mixins.json @@ -1,8 +1,7 @@ { "required": true, - "minVersion": "0.8", + "minVersion": "0.8.5", "package": "gripe._90.megacells.mixin.data.forge", - "compatibilityLevel": "JAVA_17", "mixins": ["MainMixin"], "injectors": { "defaultRequire": 1 diff --git a/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java b/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java index 935c0043..5d90d20d 100644 --- a/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java +++ b/forge/src/main/java/gripe/_90/megacells/forge/ForgePlatform.java @@ -42,6 +42,7 @@ import gripe._90.megacells.core.Loaders; import gripe._90.megacells.core.Platform; import gripe._90.megacells.misc.CompressionService; +import gripe._90.megacells.misc.LavaTransformLogic; public final class ForgePlatform implements Platform { @Override @@ -82,6 +83,14 @@ public void initCompression() { }); } + @Override + public void initLavaTransform() { + MinecraftForge.EVENT_BUS.addListener((ServerStartedEvent event) -> LavaTransformLogic.clearCache()); + MinecraftForge.EVENT_BUS.addListener((OnDatapackSyncEvent event) -> { + if (event.getPlayer() == null) LavaTransformLogic.clearCache(); + }); + } + @Override public void addVillagerTrade(ItemLike item, int cost, int quantity, int xp) { var offers = VillagerTrades.TRADES.computeIfAbsent(InitVillager.PROFESSION, k -> new Int2ObjectOpenHashMap<>()); diff --git a/forge/src/main/resources/megacells.forge.mixins.json b/forge/src/main/resources/megacells.forge.mixins.json index 908c75a9..652c898f 100644 --- a/forge/src/main/resources/megacells.forge.mixins.json +++ b/forge/src/main/resources/megacells.forge.mixins.json @@ -1,8 +1,7 @@ { "required": true, - "minVersion": "0.8", + "minVersion": "0.8.5", "package": "gripe._90.megacells.mixin.forge", - "compatibilityLevel": "JAVA_17", "mixins": [], "client": ["client.BuiltInModelHooksAccessor", "client.ModelBakeryMixin"], "injectors": { From 1491b9d0e1f918b030a51d2d40d67d9b5a07a3be Mon Sep 17 00:00:00 2001 From: 90 Date: Wed, 1 Nov 2023 18:16:59 +0000 Subject: [PATCH 14/14] Fix missing refmaps on Forge Closes #85 --- forge/build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index 57db589d..83fb6f25 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -29,6 +29,9 @@ loom { mixinConfig("$modId.mixins.json") mixinConfig("$modId.forge.mixins.json") } + + @Suppress("UnstableApiUsage") + mixin.add(sourceSets.main.get(), "$modId.forge.refmap.json") } repositories {